c++ - cv::Mat 到 QImage 的奇怪行为

标签 c++ qt opencv qimage

我正在使用 ( how to convert an opencv cv::Mat to qimage) 中建议的代码在我的 Qt 应用程序中显示 cv::Mat。但是,我得到了奇怪的结果。黑色部分显示为黑色,但所有其他值都反转。

转化码:

QImage ImgConvert::matToQImage(Mat_<double> src)
{
    double scale = 255.0;

    QImage dest(src.cols, src.rows, QImage::Format_ARGB32);
    for (int y = 0; y < src.rows; ++y) {
            const double *srcrow = src[y];
            QRgb *destrow = (QRgb*)dest.scanLine(y);
            for (int x = 0; x < src.cols; ++x) {
                    unsigned int color = srcrow[x] * scale;
                    destrow[x] = qRgba(color, color, color, 255);
            }
    }
    return dest;
}

显示代码:

void MainWindow::redraw()
{
    static QImage image = ImgConvert::matToQImage(im);

    static QGraphicsPixmapItem item( QPixmap::fromImage(image));
    static QGraphicsScene* scene = new QGraphicsScene;
    scene->addItem(&item);

    ui->graphicsView->setScene(scene);
    ui->graphicsView->repaint();
}

现在我正在使用 if(color>0) color = 255-color; 来纠正这种效果,但我更愿意了解它的来源。

另外,还有第二个小问题:如果我删除 redraw() 中的 static 声明,当方法退出时图像会立即从内存中删除。这是解决此问题的最佳方法吗?如果我显示多个帧,是否会产生任何意想不到的副作用?

最佳答案

我不知道。首先为我设置一个数组听起来像是一种更简洁的方法,请参阅 https://stackoverflow.com/a/3387400/1705967 ,这可以给你一些想法。

虽然我也使用 Ypnos 的解决方案,并在彩色图像上取得了巨大成功。 :)

啊,至于第二个问题,不用担心 QPixmap。正如我所经历的那样,它将图像数据设为私有(private)(必要时进行克隆),因此您不会错误地覆盖它。

关于c++ - cv::Mat 到 QImage 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435210/

相关文章:

c++ - 使用网络摄像头的高效肩膀检测技术

c++ - 创建和访问指向 QObject 的指针的 QVector 的元素

c++ - Qt,继承生成的小部件?

opencv - 如何使用 OpenCV/JavaCV 识别 parking 场?

c++ - 在调试器中自动显示具有已知类型和长度的 void*(数组)

c++ - VIM Doxygen 支持 - 在换行符上自动插入星号 (*)

c++ - C++ 中 undefined reference 错误

c++ - Qt with OpenSSL (Windows) 中的编译错误 LNK2019

python - 如何使用 tkinter 比例修改图像?

iphone - opencv框架与opengles trows错误?