i'm using matlab 2013a x64 and win7 x64 . install the opencv path (c:\opencv.2.4.7.2)
How did you compile me_HaarDetectOpenCV.cpp ?
matlab command window:
>> mex -LC:\opencv\build\x64\vc11\lib -IC:\opencv\build\include\opencv -lcv -lcxcore me_HaarDetectOpenCV.cpp
me_HaarDetectOpenCV.cpp
me_HaarDetectOpenCV.cpp(29) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
me_HaarDetectOpenCV.cpp(48) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
me_HaarDetectOpenCV.cpp(49) : warning C4267: '=' : conversion from 'size_t' to 'int', possible loss of data
me_HaarDetectOpenCV.cpp(64) : error C3861: 'round': identifier not found
me_HaarDetectOpenCV.cpp(66) : error C3861: 'round': identifier not found
me_HaarDetectOpenCV.cpp(70) : error C3861: 'round': identifier not found
D:\PROGRA~2\MATLAB\R2013A\BIN\MEX.PL: Error: Compile of 'me_HaarDetectOpenCV.cpp' failed.
Error using mex (line 206)
Unable to complete successfully.
code(me_HaarDetectOpenCV.cpp ):
#include "mex.h"
#include "cv.h"
#include "highgui.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
char *classifiername;
int classifiername_length,ncols, nrows,c,r,d;
uchar *image_pointer; uchar temp;
const int flags = 0; double scale_factor = 1.1;
int min_neighbors = 2,min_size_x = 30,min_size_y = 30;
if(nrhs < 2 || nrhs > 7)
mexErrMsgTxt("ERROR: 2-7 arguments expected: <string xml model path>, <uint8 grayscale image>,\n"
"[min_size_x], [min_size_y], [scale_factor], [min_neighbors]\n"
"for optional arguments 3-7 check the cvHaarDetectObjects opencv function help");
if (!mxIsChar(prhs[0]))
mexErrMsgTxt("arg1 must be a string - absolute/relative path to the classifier");
classifiername_length = (mxGetM(prhs[0]) * mxGetN(prhs[0])) + 1;
classifiername = mxArrayToString(prhs[0]);
CvHaarClassifierCascade * cascade = (CvHaarClassifierCascade*) cvLoad( classifiername, 0, 0, 0);
if(!cascade)
mexErrMsgTxt("ERROR: Could not load the classifier" );
if (!(mxIsUint8(prhs[1])))
mexErrMsgTxt("ERROR: arg2 (image) must be of type uint8");
int image_ndim = mxGetNumberOfDimensions(prhs[1]);
if (mxGetNumberOfDimensions(prhs[1]) > 2)
mexErrMsgTxt("ERROR: arg2 (image) must be a imgscale image");
image_pointer = (uchar*)mxGetPr(prhs[1]);
ncols = mxGetN(prhs[1]);
nrows = mxGetM(prhs[1]);
IplImage* img = cvCreateImage( cvSize(ncols, nrows), IPL_DEPTH_8U, 1 );
for(c=0;c<ncols;c++)
for(r=0;r<nrows;r++)
{
temp = (uchar)image_pointer[r+(nrows*c)];
((uchar *)(img->imageData + r*img->widthStep))[c]=temp;
}
if (nrhs > 2)
min_size_x = (int)round(mxGetScalar(prhs[2]));
if (nrhs > 3)
min_size_y = (int)round(mxGetScalar(prhs[3]));
if (nrhs > 4)
scale_factor = mxGetScalar(prhs[4]);
if (nrhs > 5)
min_neighbors = (int)round(mxGetScalar(prhs[5]));
CvMemStorage* storage = cvCreateMemStorage(0);
cvEqualizeHist(img, img);
CvSeq* detections = cvHaarDetectObjects(img, cascade, storage, scale_factor, min_neighbors, flags,
cvSize(min_size_x, min_size_y));
if (detections->total == 0)
{
plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL);
cvReleaseImage(&img);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseMemStorage(&storage);
return;
}
else
{
plhs[0] = mxCreateDoubleMatrix(detections->total, 4, mxREAL);
double* output = mxGetPr(plhs[0]);
CvRect* rect;
for(d = 0; d < detections->total; d++)
{
rect = (CvRect*)cvGetSeqElem(detections, d);
output[d] = rect->x+1;
output[d+detections->total*1] = rect->y+1;
output[d+detections->total*2] = rect->width;
output[d+detections->total*3] = rect->height;
}
}
cvReleaseImage(&img);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseMemStorage(&storage);
}