cv :: Mat到QImage的奇怪行为

时间:2012-11-17 22:02:01

标签: 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;来纠正这种影响,但我更愿意了解它的来源。

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

2 个答案:

答案 0 :(得分:1)

我不知道。首先为我设置数组听起来更简洁,请参阅https://stackoverflow.com/a/3387400/1705967,它可以为您提供想法。

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

啊,至于第二个问题,不要担心QPixmap。它使我的图像数据变得私密(必要时克隆),所以你不会错误地覆盖它。

答案 1 :(得分:0)

如果有人遇到此问题,我会通过将像素值减去256来快速而肮脏地修复它:

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 = 256 - (srcrow[x] * scale);
                    destrow[x] = qRgba(color, color, color, 255);
            }
    }
    return dest;
}

这会稍微破坏图像,但是将其修改为亮度。我的目的是可视化,因此差异对于眼睛来说可以忽略不计,但是对于图像处理中的某些应用,这种损坏可能是至关重要的。我无法找到为什么会发生这种情况,因为我很匆忙,所以我没有再看了。