[英]Opencv c++ capture images from two cameras using two threads
我編寫了這段代碼,它從兩個 ip 攝像機中抓取幀,然后將兩個圖像拼接在一起。 在 Init 我打開相機,然后在grabThread循環中我抓取相機幀並設置一個互斥鎖。 在 getFrame 中,我獲取互斥鎖並通過引用釋放 cvMat。
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);
}
}
};
然后我從線程外部調用 getFrame 來獲取我抓取的圖像。 到目前為止,一切正常,但是一切正常還是我要冒一些競爭條件的風險? 非常感謝。
矩陣周圍的同步很好,但是您的析構函數可能會導致問題。 如果 dtor 在GrabThread
完成循環迭代之前完成,則所有成員的生命周期都將結束,訪問它們是未定義的行為。 您應該使用condition_variable或其他一些同步工具來確保GrabThread
在您的 dtor 返回之前完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.