C++ Opencv c++;使用两个线程从两个摄像头捕获图像
我已经写了这段代码,从两个ip摄像头抓取帧,然后将两个图像缝合在一起。 在Init中,我打开相机,然后在grabThread循环中,我抓取相机帧并设置互斥。 在getFrame中,我获取互斥锁并通过引用释放cvMatC++ Opencv c++;使用两个线程从两个摄像头捕获图像,c++,multithreading,opencv,thread-safety,C++,Multithreading,Opencv,Thread Safety,我已经写了这段代码,从两个ip摄像头抓取帧,然后将两个图像缝合在一起。 在Init中,我打开相机,然后在grabThread循环中,我抓取相机帧并设置互斥。 在getFrame中,我获取互斥锁并通过引用释放cvMat class GrabberThread { private: std::string device; cv::Mat mm; std::atomic<bool> grabOn; cv::VideoCapture cap; std:
class GrabberThread {
private:
std::string device;
cv::Mat mm;
std::atomic<bool> grabOn;
cv::VideoCapture cap;
std::mutex mtx;
public:
GrabberThread() : grabOn(false) {};
~GrabberThread()
{
grabOn.store(false);
cap.release();
}
bool Init(std::string dev)
{
device = dev;
cap.open(device);
std::cout << "cap " << dev << " opened " << cap.isOpened() << "\n";
return cap.isOpened();
}
void StopGrabing()
{
grabOn.store(false);
}
void GrabThread()
{
if (!cap.isOpened()) cap.open(device);
if (!cap.isOpened()) return;
cv::Mat tmp;
grabOn.store(true);
while (grabOn.load() == true)
{
if (!cap.read(tmp))
continue;
{
std::lock_guard<std::mutex> lock(mtx);
tmp.copyTo(mm);
}
}
}
void getFrame(cv::Mat& m)
{
{
std::lock_guard<std::mutex> lock(mtx);
mm.copyTo(m);
}
}
};
class-read{
私人:
字符串设备;
cv::Mat mm;
std::原子抓子;
cv::视频捕获帽;
std::互斥mtx;
公众:
GrabberThread():grabOn(false){};
~GrabberThread()
{
grabOn.store(假);
释放帽();
}
bool Init(std::string dev)
{
设备=dev;
开盖(装置);
std::cout矩阵周围的同步很好,但是析构函数可能会导致问题。如果dtor在GrabThread
完成循环迭代之前完成,则所有成员的生命周期都将结束,并且访问它们是未定义的行为。您应该使用或其他同步工具来确保GrabThread
在dtor返回之前已完成