【问题标题】:convert Qimage to cvMat 64FC3 format将 Qimage 转换为 cvMat 64FC3 格式
【发布时间】:2016-09-03 21:16:38
【问题描述】:

我在互联网上搜索了很多,但我只找到了如何将 Qimage 转换为 RGB 格式,我想将 Qimage 转换为 cv mat 格式 CV_64FC3。 当我使用 CV_8UC3 时,我的结果非常糟糕

这是我的代码:

QImage myImage;
myImage.load("C://images//PolarImage300915163358.bmp");

QLabel myLabel;
myLabel.setPixmap(QPixmap::fromImage(myImage));

//myLabel.show();

cv::Mat image1 = QImage2Mat(myImage);



Mat img;

image1.convertTo(img, CV_64FC3, 1.0 / 255.0);

这是我使用的功能:

cv::Mat QImage2Mat(QImage const& src)
{
     cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
     cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
     cvtColor(tmp, result,CV_BGR2RGB);
     return result;
}

请帮助我,我是 opencv 和 Qt 的新手

【问题讨论】:

    标签: c++ qt opencv qimage opencv-mat


    【解决方案1】:

    我发现了问题所在,事实上,Qimage 有第四个 alpha 通道,所以当您读取 Qimage 数据时,您需要将其放入 CV_8UC4

    这里是代码:

    Mat QImage2Mat(const QImage& src) { 
        cv::Mat mat = cv::Mat(src.height(), src.width(), CV_8UC4, (uchar*)src.bits(), src.bytesPerLine()); 
        cv::Mat result = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); 
        int from_to[] = { 0,0,  1,1,  2,2 }; 
        cv::mixChannels( &mat, 1, &result, 1, from_to, 3 ); 
        return result; 
    }
    

    【讨论】:

      【解决方案2】:

      不确定结果不好是什么意思,但您假设QImage 也将图像加载为 OpenCV (BGR)。在文档中,它告诉您他们使用ARGB

      因此,知道这一点,您有两个选择:

      1. 使用函数convertToFormatQimage 转换为QImage::Format_RGB888,然后不需要cvtColor(tmp, result,CV_BGR2RGB); 这一行,因为它已经是RGB。
      2. 在创建 cv::Mat 时使用 CV_8UC4,然后使用 split and join 或 mixchannels 删除第一个通道(通道 alpha)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-27
        • 2021-09-03
        • 2016-09-19
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多