钢铁直猿 2022-03-16 15:20 采纳率: 0%
浏览 310
已结题

C++使用OpenCV自带Mat类读取png图片后怎么取出RGB数据

问题遇到的现象和发生背景

我自己写了一个QT控件显示图片用的,但是需要输入图片的RGB信息和宽高信息,Mat读取JPG和BMP时都正常显示,但是遇到PNG图片时就异常了,我自定义控件显示出来的图像异常,色彩不匹配,图像有显示宽度不对的“倾斜”现象,我查了很多资料都说Mat读取时后面的参数为-1,读出4个通道后,再通过色彩转换接口输入RGBA2RGB参数,就可以了,然而并没有用,图像显示还是错的,实在没有办法解决

问题相关代码,请勿粘贴截图

Mat img = imread(file_path.toStdString(), IMREAD_UNCHANGED);
m_nCurWidth = img.cols;
m_nCurHeight= img.rows;
if(m_pSelImage)
delete [] m_pSelImage;
m_pSelImage = new quint8[m_nCurHeightm_nCurWidth3];
m_pOutImage = new quint8[m_nCurHeightm_nCurWidth3];
int channel = img.channels();
//Mat img1(Size(img.cols, img.rows), CV_8UC3);
Mat img1(img.rows, img.cols, CV_8UC3, Scalar(0, 0, 0));
Mat img2(Size(img.cols, img.rows), CV_8UC3);
if(channel==4){
//cv::cvtColor(img, img1, COLOR_BGRA2BGR);
//cv::cvtColor(img1, img1, COLOR_BGR2RGB);

        for (int j=0; j<m_nCurHeight; j++) {
            for (int i=0; i<m_nCurWidth; i++) {
                img1.at<Vec3b>(j,i)[0] = img.at<Vec4b>(j,i)[0]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[0]*float(255 - img.at<Vec4b>(j,i)[3])/255;
                img1.at<Vec3b>(j,i)[1] = img.at<Vec4b>(j,i)[1]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[1]*float(255 - img.at<Vec4b>(j,i)[3])/255;
                img1.at<Vec3b>(j,i)[2] = img.at<Vec4b>(j,i)[2]*float(img.at<Vec4b>(j,i)[3])/255 + img1.at<Vec3b>(j,i)[2]*float(255 - img.at<Vec4b>(j,i)[3])/255;
                m_pOutImage[3*j*m_nCurWidth + 3*i + 0] = img.at<Vec4b>(j,i)[0];
                m_pOutImage[3*j*m_nCurWidth + 3*i + 1] = img.at<Vec4b>(j,i)[1];
                m_pOutImage[3*j*m_nCurWidth + 3*i + 2] = img.at<Vec4b>(j,i)[2];
            }
        }
        memcpy(m_pSelImage, img1.data, m_nCurHeight*m_nCurWidth*3);
    }
    else{
        cv::cvtColor(img, img1, COLOR_BGR2RGB);
        for (int j=0; j<m_nCurHeight; ++j) {
            for (int i=0; i<m_nCurWidth; ++i) {
                m_pOutImage[3*j*m_nCurWidth + 3*i + 0] = img.at<Vec3b>(j,i)[0];
                m_pOutImage[3*j*m_nCurWidth + 3*i + 1] = img.at<Vec3b>(j,i)[1];
                m_pOutImage[3*j*m_nCurWidth + 3*i + 2] = img.at<Vec3b>(j,i)[2];
            }
        }
        memcpy(m_pSelImage, img1.data, m_nCurHeight*m_nCurWidth*3);
    }
    memcpy(img2.data, m_pOutImage, m_nCurHeight*m_nCurWidth*3);
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

3条回答 默认 最新

  • 丨封尘绝念斩丨 2022-03-16 15:28
    关注

    png可以转成jpg的

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月14日
  • 创建了问题 3月16日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析