diff --git a/modules/optim/src/simplex.cpp b/modules/optim/src/simplex.cpp index f3818cdc5dbd1f8695e995450599a0233bc30862..308a219742b61697f1a27914fe9224a94d578a3f 100644 --- a/modules/optim/src/simplex.cpp +++ b/modules/optim/src/simplex.cpp @@ -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_ coord_sum(1,ndim,0.0),buf(1,ndim,0.0),y(1,ndim,0.0); +nfunk = 0; +for(i=0;icalc(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 +#include +#include +#include +#include + +using namespace std; +using namespace cv; + +void test(Ptr solver, Ptr 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_(1, 2) << 1.0, 1.0); +Mat step = (Mat_(2, 1) << -0.5, 0.5); + +Ptr ptr_F(new DistanceToLines()); +Ptr 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_ coord_sum(1,ndim,0.0),buf(1,ndim,0.0),y(1,ndim,0.0); + Mat_ coord_sum(1,ndim,0.0),buf(1,ndim,0.0),y(1,ndim+1,0.0); nfunk = 0;