DownhillSolverImpl::innerDownhillSimplex something looks broken here:
authorSaree90 <sas_naghi@hotmail.com>
Thu, 22 May 2014 12:52:37 +0000 (22:52 +1000)
committerSaree90 <sas_naghi@hotmail.com>
Thu, 22 May 2014 12:52:37 +0000 (22:52 +1000)
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

modules/optim/src/simplex.cpp

index f3818cd..308a219 100644 (file)
 #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;