如果不使用 imshow(),则无法从 VideoCapture 正确填充 OpenCV Mat 对象

问题描述

我正在尝试从网络摄像头捕获帧序列并将其显示为 QImage:

cv::Mat mat;
cap >> mat; //cap is cv::VideoCapture("/dev/video0")
cv::Mat dest;
cv::cvtColor(mat,dest,cv::COLOR_BGR2RGB);
QImage img((uchar*) dest.data,dest.cols,dest.rows,dest.step,QImage::Format_RGB888);
ui->vid->setpixmap(Qpixmap::fromImage(img));

它使用认设置,但我需要从 GStreamer 切换到 V4L2*,所以现在我像这样打开网络摄像头:

//cap is cv::VideoCapture("/dev/video0",cv::CAP_V4L2)
cap.set(cv::CAP_PROP_FOURCC,cv::VideoWriter::fourcc('M','J','P','G')); //returns true

现在我最终得到带有一些伪影的白色图像但是如果我在 cv::imshow("frame",mat) 行之后添加 >>,我可以像 mat 对象一样看到捕获的帧,没有问题被填满了......但我最终得到了这个来自 opencv2/highgui.hpp 的额外窗口,我不需要或不想要,它显示了我在 QLabel 中可以看到的相同内容。除了实际显示图像之外,cv::imshow 还能做什么?我想我需要手动完成...

    • GStreamer 突然停止工作,我收到此错误

[ WARN:0] 全局 /home/pI/Opencv/modules/videoio/src/cap_gstreamer.cpp (933) 打开 OpenCV | GStreamer 警告:无法查询视频位置: 状态=0,值=-1,持续时间=-1

我正在阅读这是一个错误,所以我想切换到 V4L2。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)