C++ 通过引用传递mat对象OpenCv
我正在尝试从一个线程(不同的类)获取网络摄像机视频源。。我想把Mat对象返回到main方法中。。。到目前为止,我只知道这样做是将在main方法中创建的Mat对象的引用传递给线程。 但它并没有完美地工作,这个错误出现了 (控制台应用程序10.exe中0x00983489(opencv_core248d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x05671050。)。 有人能帮我解决这个问题吗 原因是我的开发基于版主设计模式,这就是为什么。 谢谢你C++ 通过引用传递mat对象OpenCv,c++,multithreading,opencv,concurrency,C++,Multithreading,Opencv,Concurrency,我正在尝试从一个线程(不同的类)获取网络摄像机视频源。。我想把Mat对象返回到main方法中。。。到目前为止,我只知道这样做是将在main方法中创建的Mat对象的引用传递给线程。 但它并没有完美地工作,这个错误出现了 (控制台应用程序10.exe中0x00983489(opencv_core248d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x05671050。)。 有人能帮我解决这个问题吗 原因是我的开发基于版主设计模式,这就是为什么。 谢谢你 #include <
#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;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
类摄像机
{
公众:
无效abc(Mat和img){//camara方法
Mat图像;
视频捕获上限(0);
namedWindow(“窗口”,CV\u窗口\u自动调整大小);
namedWindow(“win2”,CV\u窗口\u自动调整大小);
while(true)
{
cap>>图像;
如果(!image.empty())
{
img=image.clone();
imshow(“win2”,img);
imshow(“窗口”,图像);
}
等待键(1);
}
}
void操作符()(Mat&img){//thred类的方法
abc(img);//将对象传递给方法
}
};
int main()
{
Mat mImg;//主方法Mat
namedWindow(“win3”,CV\u窗口\u自动调整大小);
线程t1((Camera()),ref(mImg));//将主方法垫传递给经过REFF的踏板
while(true)
{
如果(!mImg.empty())
imshow(“win3”,mImg);//显示主方法对象
等待键(1);
}
系统(“暂停”);
返回0;
}
使用线程是使用摄像头的好主意,但必须使用互斥锁来阻止图像数据访问。您可以很容易地找到文档和示例
您还可以添加一个布尔值以指示是否有新图像可用(如果您的处理速度比采集速度快),或者使用缓冲区存储多个图像。注意,
cv::Mat
具有引用语义,因此您可以通过值传递它。如何??我不知道怎么做…:(@juanchopanza,除非该方法重新分配Mat内存;)@gamal:线程t1对Mat做什么?您可能需要一些线程同步(例如互斥),以便if(!mImg.empty())
和imshow(“win3”,mImg)代码>不会被处理mat数据的另一个线程中断。我的猜测是,t1
将在“imshow
期间重新分配mImg
”的内存,以便imshow将读取不再合法的内存代码>将重新分配内存,若img和图像的大小不相同#include
可能也会为您提供一些互斥类!哈哈哈,它起作用了。。。thax代表所有人……:)::)\m/对于这两个while循环,它们都被一个本地互斥对象锁定。。。很好,它能工作。。。。。(Y) 。。while(true){mtx.lock();//编码mtx.unlock();}