我试图从一个线程(不同的类)获取网络摄像头视频源..我想将Mat对象返回到main方法...到目前为止,我知道这只是为了通过在主方法中创建的Mat对象的引用。 但它没有完美运行,出现此错误 (ConsoleApplication10.exe中0x00983489(opencv_core248d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x05671050。)。 任何人都可以帮我解决这个问题。
原因是我的开发基于主持人设计模式进行构建,这就是原因。 谢谢...!!!
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <time.h>
#include <thread>
using namespace std;
using namespace cv;
class Camera
{
public:
void abc(Mat &img){ //camara method
Mat image;
VideoCapture cap(0);
namedWindow("window", CV_WINDOW_AUTOSIZE);
namedWindow("win2", CV_WINDOW_AUTOSIZE);
while(true)
{
cap >> image;
if(!image.empty())
{
img=image.clone();
imshow("win2", img);
imshow("window", image);
}
waitKey(1);
}
}
void operator()(Mat &img){//thred method of the class
abc(img); // passing Object TO method
}
};
int main ()
{
Mat mImg;//main method Mat
namedWindow("win3", CV_WINDOW_AUTOSIZE);
thread t1((Camera()),ref(mImg)); //passing main method Mat to the Tread PASSING BY REFF
while(true)
{
if(!mImg.empty())
imshow("win3", mImg);// display main method mat Object
waitKey(1);
}
system("pause");
return 0;
}
答案 0 :(得分:2)
使用线程最好使用相机,但必须使用互斥锁来阻止图像数据访问。您可以轻松找到文档和示例。
http://www.cplusplus.com/reference/mutex/mutex/
您还可以添加一个布尔值来指示新图像是否可用(如果您的处理速度快于您的处理),或使用缓冲区存储多个图像。