【发布时间】:2014-10-23 10:30:24
【问题描述】:
我正在尝试从线程(不同的类)获取网络摄像头视频源。我想将 Mat 对象返回给 main 方法...到目前为止,我只知道这样做是传递一个引用在线程的 main 方法中创建的 Mat 对象。 但它工作不完美,出现此错误 (ConsoleApplication10.exe 中 0x00983489 (opencv_core248d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x05671050。)。 谁能帮我解决这个问题。
原因是我的开发是基于 Moderator 设计模式构建的,这就是原因。 谢谢你...!!!
#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;
}
【问题讨论】:
-
请注意,
cv::Mat具有引用语义,因此您可以按值传递它。 -
怎么样??我不明白该怎么做... :(
-
@juanchopanza 除非该方法重新分配 Mat 内存 ;)
-
@gamal : 线程 t1 对垫子做了什么?您可能需要一些线程同步(例如互斥锁),以便
if(!mImg.empty())和imshow("win3", mImg);不会被其他线程操作垫子的数据中断。我的猜测是,t1将重新分配mImg“期间”imshow的内存,以便 imshow 将读取不再合法的内存。 -
查看了您的函数:
img=image.clone();将重新分配内存,如果 img 和 image 的大小不相同。#include <thread>可能也会给你一些互斥类!
标签: c++ multithreading opencv concurrency