强制Qt摄像机视频格式

时间:2018-10-09 15:05:42

标签: c++ qt opencv camera qml

我正在尝试使用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

有什么方法可以选择相机的像素格式?

2 个答案:

答案 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);