我正在尝试使用QML中的Qt Camera。
我正在开发自定义VideoFilter:
QVideoFrame MyFilterRunnable::run(QVideoFrame* input, const QVideoSurfaceFormat&, RunFlags)
我开始在Windows上部署该应用程序,并且有:
QAbstractVideoBuffer::ReadWrite
中是可映射的PixelFormat::Format_BGR32
不幸的是,当我迁移到Linux时,一切都改变了,而没有更换我拥有的相机:
QAbstractVideoBuffer::ReadOnly
PixelFormat::Format_YUYV
现在我真的不知道如何将该框架转换为OpenCV Mat
。
有什么方法可以选择相机的像素格式?
答案 0 :(得分:1)
就在史蒂芬身上,
if (input->pixelFormat() == QVideoFrame::Format_YUYV)
{
auto input_w = input->width ();
auto input_h = input->height();
auto cam_data = input->bits();
cv::Mat yuyv(input_h, input_w,CV_8UC2, cam_data);
cv::Mat rgb (input_h, input_w,CV_8UC3);
cvtColor(yuyv, rgb, CV_YUV2BGR_YUYV);
m_mat = rgb;
}
else
if (input->pixelFormat() == QVideoFrame::Format_YUV420P || input->pixelFormat() == QVideoFrame::Format_NV12) {
m_yuv = true;
m_mat = yuvFrameToMat8(*input);
} else {
m_yuv = false;
QImage wrapper = imageWrapper(*input);
if (wrapper.isNull()) {
if (input->handleType() == QAbstractVideoBuffer::NoHandle)
input->unmap();
return *input;
}
m_mat = imageToMat8(wrapper);
}
ensureC3(&m_mat);
答案 1 :(得分:0)
我在Linux机器和Raspberry之间遇到相同的问题:我使用的是同一台相机,而QVideoFrame提供的像素格式是不同的。可能与v4l2有关
关于从YUYV到OpenCV Mat的转换,此代码对我有用:
QVideoFrame *input ;
...
auto input_w = input->width ();
auto input_h = input->height();
auto cam_data = input->bits();
cv::Mat yuyv(input_h, input_w,CV_8UC2, cam_data);
cv::Mat rgb (input_h, input_w,CV_8UC3);
cvtColor(yuyv, rgb, CV_YUV2BGR_YUYV);