cv :: Mat to QImage转换导致奇数显示

时间:2016-02-15 07:49:24

标签: c++ qt opencv qimage qpixmap

尝试将本地网络摄像头流从cv :: Mat转换为QImage,但输出很奇怪。我试了很多东西,搜了几个小时;我正式陷入困境。

这是有问题的代码段

void AppName::SlotFrameReady(cv::Mat image, qint64 captureTime, qint64 processTime)
{
  //  cv::Mat imageholder;
  //  cv::cvtColor(image, imageholder, CV_BGRA2RGBA);

 //   QImage img((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_Grayscale8);
 //    QImage img((const unsigned char*)(imageholder.data), imageholder.cols, imageholder.rows, QImage::Format_RGB32);
     QImage img((const unsigned char*)(image.data), image.cols, image.rows, image.step, QImage::Format_RGB888);

    m_VideoView->Update(&img);

}

这就是我尝试过的 - 添加image.step,尝试了每个QImage格式,尝试了img.invertPixels()和img.invertRGB / invertRGBA()

我还尝试创建一个临时图像来运行cvtColor和convert(尝试过CV_BGRA2RGB和BGRA2RGBA),这也给出了相同的结果。

type()输出为24,如果我是正确的,则为CV_8UC4。

如果我使用上述任何一种,我会得到以下内容(虽然有些格式会显示不正确的颜色而不仅仅是灰度。这与RGB8888有关): http://i.imgur.com/79k3q8U.png

如果我以灰度输出,一切都按预期工作: 删除链接bc rep不够

在Mac 10.11上使用QT创建者5和opencv 3.1如果这有所不同,谢谢!

编辑澄清:

我试过过Ypnos'解决方案here,但这会使输出显示为灰色空白屏幕。我发现的唯一其他选择是我上面探讨过的变化。

我没有尝试过的一件事就是将垫子写入文件并将其读入qimage。我的想法是,这非常不优雅,对我的需求来说太慢了。

另一件事需要注意,我愚蠢地忘了包含 - 视频视图更新功能将qimage转换为qpixmap进行显示。这可能是错误的地方吗?

再次编辑:得到Ypnos'解决方案工作,对我来说是一个愚蠢的错误(当它是一个4通道图像时使用mat3b / vec3b)。但是,输出仍然是一团糟。

这里是更新的代码:

void AppName::SlotFrameReady(const cv::Mat4b &image, qint64 captureTime, qint64 processTime)
{

    QImage dest(image.cols, image.rows, QImage::Format_RGBA8888);
    for (int y = 0; y < image.rows; ++y) {
            const cv::Vec4b *srcrow = image[y];
            QRgb *destrow = (QRgb*)dest.scanLine(y);
            for (int x = 0; x < image.cols; ++x) {
                    destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);
            }
         }

    m_VideoView->Update(&dest);

以及VideoView的相关部分,将其转换为PixMap并推送显示

    QPixmap bitmap = QPixmap::fromImage(*image).transformed(transform, Qt::SmoothTransformation);
    setPixmap(bitmap); 

和新的但仍然混乱的输出

http://i.imgur.com/1jlmfRQ.png

使用我的macbook pro中内置的FaceTime摄像头以及我尝试的其他2个USB摄像头(罗技c270和无名中文垃圾摄像头)

任何想法?

0 个答案:

没有答案