gpt4 book ai didi

c++ - 传递 void* 时,Opencv setMouseCallback 无法按预期工作

转载 作者:行者123 更新时间:2023-11-28 06:42:16 25 4
gpt4 key购买 nike

我有以下代码,detectFacialFeatures 在循环中调用(在从 cam 捕获帧时)。这会正确检索面孔,我可以在图像窗口中看到它们。但是,当有人单击找到的任何面孔(在 img 中绘制的矩形)时,我需要进行 som 处理。为此,我设置了一个鼠标回调,它将 vector 面 作为void* 传递。但是当我将它转换回 vector 时,我并没有取回原始对象。代码,

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
}
}

最佳答案

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

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

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

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

关于c++ - 传递 void* 时,Opencv setMouseCallback 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25762721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com