Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cv::Mat到QImage的转换会导致奇数显示_C++_Qt_Opencv_Qimage_Qpixmap - Fatal编程技术网

C++ cv::Mat到QImage的转换会导致奇数显示

C++ cv::Mat到QImage的转换会导致奇数显示,c++,qt,opencv,qimage,qpixmap,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); // Q

正在尝试将本地网络摄像头流从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):

如果我以灰度输出,则一切正常: 删除的链接bc代表不够

在mac 10.11上,使用QT creator 5和opencv 3.1,如果这有什么不同,谢谢

编辑以澄清:

我尝试过Ypnos的解决方案,但这会使输出变成一个空白的灰色屏幕。我发现的唯一其他选择是我在上面探索的变化

有一件事我没有试过,那就是将mat写入一个文件并将其读入一个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);
新的但仍然混乱的输出

使用macbook pro内置的FaceTime摄像头,以及我尝试过的其他2个USB摄像头(logitech c270和一个没有名字的中文垃圾摄像头)


有什么想法吗?

有帮助吗?或者也可以?谢谢你的回复。不幸的是没有。我在第二个链接中尝试了Ypnos的解决方案,那里的输出只是一个空白的灰色屏幕。据我所知,其他答案只是我在上面尝试过的答案的变体。看一看。这应该可以处理所有类型的转换。最终,这似乎与我上面得到的解决方案相同:QImage image(inMat.data、inMat.cols、inMat.rows、inMat.step、QImage::Format_RGB32);因为8UC4的案例与我最初尝试的基本相同。为了确保我回去取出了我的(const unsigned char*),因为这是我能看到的唯一区别,但输出仍然有同样的缺陷。无论如何,谢谢你的建议!有帮助吗?或者也可以?谢谢你的回复。不幸的是没有。我在第二个链接中尝试了Ypnos的解决方案,那里的输出只是一个空白的灰色屏幕。据我所知,其他答案只是我在上面尝试过的答案的变体。看一看。这应该可以处理所有类型的转换。最终,这似乎与我上面得到的解决方案相同:QImage image(inMat.data、inMat.cols、inMat.rows、inMat.step、QImage::Format_RGB32);因为8UC4的案例与我最初尝试的基本相同。为了确保我回去取出了我的(const unsigned char*),因为这是我能看到的唯一区别,但输出仍然有同样的缺陷。无论如何,谢谢你的建议!
    QPixmap bitmap = QPixmap::fromImage(*image).transformed(transform, Qt::SmoothTransformation);
    setPixmap(bitmap);