传递void *时,Opencv setMouseCallback无法正常工作

时间:2014-09-10 10:10:46

标签: c++ opencv

我有以下代码, 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
    }
}

1 个答案:

答案 0 :(得分:1)

faces是一个堆栈分配的变量,当detectFacialFeatures函数存在时,它将被破坏。您应该堆分配向量,或者将现有的传递作为参数传递。堆分配:

vector<Rect>* faces = new vector<Rect>();  

此外,您不应该在C ++中使用C风格的强制转换。在此示例中,您应使用static_cast

vector<Rect>* faces = static_cast<vector<Rect>*>(param);