Merge pull request #2784 from saree90:bugfix_Simplex
This commit is contained in:
commit
2c134318f7
@ -42,6 +42,99 @@
|
|||||||
#include "debug.hpp"
|
#include "debug.hpp"
|
||||||
#include "opencv2/core/core_c.h"
|
#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{
|
namespace cv{namespace optim{
|
||||||
|
|
||||||
class DownhillSolverImpl : public DownhillSolver
|
class DownhillSolverImpl : public DownhillSolver
|
||||||
@ -123,7 +216,7 @@ namespace cv{namespace optim{
|
|||||||
double res;
|
double res;
|
||||||
int i,ihi,ilo,inhi,j,mpts=ndim+1;
|
int i,ihi,ilo,inhi,j,mpts=ndim+1;
|
||||||
double error, range,ysave,ytry;
|
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;
|
nfunk = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user