我有以下代码, detectFacialFeatures 在循环中调用(从cam捕获帧)。这会正确检索面部,我可以在图像窗口中看到它们。但是,当有人点击找到的任何面(img中绘制的矩形)时,我需要进行som处理。为此,我设置了一个mousecallback,它将矢量面传递为 void * 。但当我把它投回到矢量时,我没有得到原始物体。代码,
cout<< faces-> size()<< ENDL ;;
返回垃圾值。不知道我做错了什么。
void FaceDetect::detectFacialFeatures(Mat img)
{
Mat img_gray;
cvtColor(img, img_gray, CV_BGR2GRAY);
equalizeHist( img_gray, img_gray );
vector<Rect> faces;
if( !cascade.empty() )
cascade.detectMultiScale( img_gray, faces, 1.1, 3, 0|CV_HAAR_SCALE_IMAGE, Size(40, 40) );
else
printf("\nFrontal face cascade not loaded\n");
for(unsigned int i = 0 ; i < faces.size() ; i++ )
{
Rect face = faces.at(i);
rectangle(img, face, CV_RGB(255, 0, 0), 1, 8, 0);
cout << face.size() << "or" << endl;
Mat faceImg = img(face);
}
imshow(winname, img);
setMouseCallback(winname, onMouse, (void*)&faces);
}
void FaceDetect::onMouse(int event, int x, int y, int z, void* param)
{
if ( event == EVENT_LBUTTONDOWN )
{
vector<Rect>* faces = (vector<Rect>*) param;
Point pt(x, y);
cout << faces->size() << endl; //This code returns garbage value
}
}
答案 0 :(得分:1)
faces
是一个堆栈分配的变量,当detectFacialFeatures
函数存在时,它将被破坏。您应该堆分配向量,或者将现有的传递作为参数传递。堆分配:
vector<Rect>* faces = new vector<Rect>();
此外,您不应该在C ++中使用C风格的强制转换。在此示例中,您应使用static_cast
。
vector<Rect>* faces = static_cast<vector<Rect>*>(param);