Opencv 从缓冲区写入和读取

2024-01-18

我有两个任务(线程),每个任务在不同的处理器(核心)上运行,第一个任务使用 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(使用前将#替换为@)

Opencv 从缓冲区写入和读取 的相关文章

随机推荐