通过引用传递一个垫子对象 OpenCv
Posted
技术标签:
【中文标题】通过引用传递一个垫子对象 OpenCv【英文标题】:pass by reference a mat object OpenCv 【发布时间】: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>
可能也会给你一些互斥类!
【参考方案1】:
使用线程是使用相机的好主意,但您必须使用互斥锁来阻止图像数据访问。您可以轻松找到文档和示例。
http://www.cplusplus.com/reference/mutex/mutex/
您还可以添加一个布尔值来指示是否有新图像可用(如果您的处理比您的采集速度更快),或者使用缓冲区来存储多张图像。
【讨论】:
哈哈它奏效了...谢谢所有人..... :) :) :) :) 两个 while 循环都被一个本地互斥对象锁定...很好用..... (Y).. while(true) mtx.lock(); //代码 mtx.unlock();以上是关于通过引用传递一个垫子对象 OpenCv的主要内容,如果未能解决你的问题,请参考以下文章