我有两个任务(线程),每个任务在不同的处理器(核心)上运行,第一个任务使用 OpenCV 重复捕获图像videocapture()
.
我只使用这两行来捕获:
cv::Mat frame;
capture.read(frame);
现在我想使用第二个任务显示捕获的图像。执行后imshow
第二个任务代码中的函数:
cv::imshow("Display window", frame);
我收到以下输出错误:
OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/highgui/src/window.cpp, line 304
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/highgui/src/window.cpp:304: error: (-215) size.width>0 && size.height>0 in function imshow
那么,我怎样才能避免这个错误呢?
完整代码托管于Github https://github.com/sendjasni/ReVC_opencv/blob/master/re_task.cpp
cv::VideoCapture::read() https://docs.opencv.org/3.1.0/d8/dfe/classcv_1_1VideoCapture.html#a473055e77dd7faa4d26d686226b292c1回报bool
指示读取是否成功。
你正在传递一个空的frame
to cv::imshow()
。在尝试显示之前尝试检查读取是否成功。
cv::Mat frame;
if(capture.read(frame))
{
cv::imshow(frame);
}
EDIT
OP发布了代码链接。在他的节目中frame
被声明为全局变量。排队120
capture.read(frame)
写入框架并对齐140
imshow(frame)
读取自frame
不使用互斥锁 - 这是数据竞争。正确的代码应该是这样的:
#include <mutex>
#include <opencv2/opencv.hpp>
std::mutex mutex;
cv::Mat frame;
{
mutex.lock();
capture.read(frame);
mutex.unlock();
}
{
mutex.lock();
cv::imshow(frame);
mutex.unlock();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)