@ -42,6 +42,99 @@
# include "debug.hpp"
# include "opencv2/core/core_c.h"
/*
* * * * Error Message * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Downhill Simplex method in OpenCV dev 3.0 .0 getting this error :
OpenCV Error : Assertion failed ( dims < = 2 & & data & & ( unsigned ) i0 < ( unsigned ) ( s ize . p [ 0 ] * size . p [ 1 ] )
& & elemSize ( ) = = ( ( ( ( ( DataType < _Tp > : : type ) & ( ( 512 - 1 ) < < 3 ) ) > > 3 ) + 1 ) < < ( ( ( ( sizeof ( size_t ) / 4 + 1 ) 16384 | 0x3a50 )
> > ( ( DataType < _Tp > : : typ e ) & ( ( 1 < < 3 ) - 1 ) ) 2 ) & 3 ) ) ) in cv : : Mat : : at ,
file C : \ builds \ master_PackSlave - w in32 - vc12 - shared \ opencv \ modules \ core \ include \ opencv2 / core / mat . inl . hpp , line 893
* * * * Problem and Possible Fix * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
DownhillSolverImpl : : innerDownhillSimplex something looks broken here :
Mat_ < double > coord_sum ( 1 , ndim , 0.0 ) , buf ( 1 , ndim , 0.0 ) , y ( 1 , ndim , 0.0 ) ;
nfunk = 0 ;
for ( i = 0 ; i < ndim + 1 ; + + i )
{
y ( i ) = f - > calc ( p [ i ] ) ;
}
y has only ndim elements , while the loop goes over ndim + 1
Edited the following for possible fix :
Replaced y ( 1 , ndim , 0.0 ) - - - - - - > y ( 1 , ndim + 1 , 0.0 )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
The code below was used in tesing the source code .
Created by @ SareeAlnaghy
# include <iostream>
# include <cstdlib>
# include <cmath>
# include <algorithm>
# include <opencv2\optim\optim.hpp>
using namespace std ;
using namespace cv ;
void test ( Ptr < optim : : DownhillSolver > solver , Ptr < optim : : Solver : : Function > ptr_F , Mat & P , Mat & step )
{
try {
solver - > setFunction ( ptr_F ) ;
solver - > setInitStep ( step ) ;
double res = solver - > minimize ( P ) ;
cout < < " res " < < res < < endl ;
}
catch ( exception e )
{
cerr < < " Error:: " < < e . what ( ) < < endl ;
}
}
int main ( )
{
class DistanceToLines : public optim : : Solver : : Function {
public :
double calc ( const double * x ) const {
return x [ 0 ] * x [ 0 ] + x [ 1 ] * x [ 1 ] ;
}
} ;
Mat P = ( Mat_ < double > ( 1 , 2 ) < < 1.0 , 1.0 ) ;
Mat step = ( Mat_ < double > ( 2 , 1 ) < < - 0.5 , 0.5 ) ;
Ptr < optim : : Solver : : Function > ptr_F ( new DistanceToLines ( ) ) ;
Ptr < optim : : DownhillSolver > solver = optim : : createDownhillSolver ( ) ;
test ( solver , ptr_F , P , step ) ;
system ( " pause " ) ;
return 0 ;
}
* * * * Suggesttion for imporving Simplex implentation * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Currently the downhilll simplex method outputs the function value that is minimized . It should also return the coordinate points where the
function is minimized . This is very useful in many applications such as using back projection methods to find a point of intersection of
multiple lines in three dimensions as not all lines intersect in three dimensions .
*/
namespace cv { namespace optim {
class DownhillSolverImpl : public DownhillSolver
@ -123,7 +216,7 @@ namespace cv{namespace optim{
double res ;
int i , ihi , ilo , inhi , j , mpts = ndim + 1 ;
double error , range , ysave , ytry ;
Mat_ < double > coord_sum ( 1 , ndim , 0.0 ) , buf ( 1 , ndim , 0.0 ) , y ( 1 , ndim , 0.0 ) ;
Mat_ < double > coord_sum ( 1 , ndim , 0.0 ) , buf ( 1 , ndim , 0.0 ) , y ( 1 , ndim + 1 , 0.0 ) ;
nfunk = 0 ;