0

我正在使用(如何将 opencv cv::Mat 转换为 qimagecv::Mat )中建议的代码在我的 Qt 应用程序中显示 a 。但是,我得到了奇怪的结果。黑色部分显示为黑色,但所有其他值都被反转。

转换代码:

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(),当方法退出时,图像会立即从内存中删除。这是解决此问题的最佳方法吗?如果我显示多个帧,是否会产生任何意外的副作用?

4

2 回答 2

1

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

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

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

于 2012-11-18T00:27:00.153 回答
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;
}

但是,这会稍微损坏图像,将其亮度修改为 1。我的目的是可视化,因此肉眼可以忽略不计,但是对于图像处理中的某些应用程序,这种损坏可能是至关重要的。我不知道为什么会发生这种情况,因为我很着急,所以我没有再看下去。

于 2013-04-26T01:41:23.797 回答