b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

OpenCV【2】---读取png图像并将其显示在QT标签上的问题

电脑杂谈  发布时间:2020-04-11 16:32:42  来源:网络整理

qt读取图片并显示_qt读取图片_qt读取图片并显示

建议: 在qt中使用opencv处理QImage和IplImage之间的转换问题

使用opencv处理显示在qt标签上的图像时,这不是问题. 1.在qt上使用qimage来显示IplImage到Qimage彩像的转换IplImage * fram; QImage图片((co

腾讯云联合战将在2020年“大流行”,帮助恢复工作(优惠额空前!4核8G,5M带宽1684元/ 3年),

地址:

2020年阿里云的最低价格产品入口,包括优惠券(新老用户均可享受折扣)

地址:

操作图片test.png是365x365的PNG图片

qt读取图片_qt读取图片并显示_qt读取图片并显示

这里写图片描述

通过OpenCV随附的GUI显示图像是没有问题的,如以下操作代码所示:

    QStringfileName=QFileDialog::getOpenFileName(this,
                tr("OpenImage"),".",
                tr("ImageFiles(*.png*.jpg*.jpeg*.bmp)"));
    if(fileName.length()<=0)return;
    //imread的第二个参数:读取4通道的png图像。其中第四个通道的数据类型和其他通道的一样,都是uchar型,完全透明为0,否则为255
    image=cv::imread(fileName.toUtf8().data());
    QString status = QString::number(image.rows)+"x"+QString::number(image.cols);
    ui->label_2->setText(status);
    //OpenCV显示出来
    cv::namedWindow("OriginalImage");
    cv::imshow("OriginalImage",image);    

这里写图片描述

但是经过以下处理后,图片无法正确显示:

    //改变色彩通道顺序,将Mat的BGR顺序反转为QImage中的RGB顺序
    cv::cvtColor(image,image,CV_BGR2RGB);
    //QT图像
    QImageimg=QImage((constunsignedchar*)(image.data),
    image.cols,image.rows,QImage::Format_RGB888);
    //显示在label中:voidsetPixmap(constQPixmap&);
    ui->label->setPixmap(QPixmap::fromImage(img));
    //改变label的尺寸已自适应图像
    ui->label->resize(ui->label->pixmap()->size());

这里写图片描述

qt读取图片_qt读取图片并显示_qt读取图片并显示

这里写图片描述

操作图片test1.png是256x256的PNG图片(原始图片如上),使用OpenCV自己的GUI显示,相同的代码,相同的操作,如下所示:

这里写图片描述

处理后的QT标签显示如下:

这里写图片描述

正常! ! !比较这两个问题,问题出在哪里?

我重试了几张不同大小的图片: 200x200、356x356都可以. 分析可以知道,cv :: Mat读取的图像没有问题,它一定是QImage的问题. 检查了QImage的构造函数:

qt读取图片并显示_qt读取图片并显示_qt读取图片

这里写图片描述

bytesPerLine参数是每行中的字节数.

    //改变色彩通道顺序,将Mat的BGR顺序反转为QImage中的RGB顺序
    cv::cvtColor(image,image,CV_BGR2RGB);
    //QT图像
    //QImage::Format_RGB888,像素为24位
    QImageimg;
    if(image.channels()==3){
        img=QImage((constunsignedchar*)(image.data),
        image.cols,image.rows,image.cols*image.channels(),QImage::Format_RGB888);
    }
    //QImage::Format_Indexed8,像素为8位
    else{
        img=QImage((constunsignedchar*)(image.data),
        image.cols,image.rows,image.cols*image.channels(),QImage::Format_Indexed8);
    }
    //显示在label中:voidsetPixmap(constQPixmap&);
    ui->label->setPixmap(QPixmap::fromImage(img));
    //改变label的尺寸已自适应图像
    ui->label->resize(ui->label->pixmap()->size());

然后再次打开图片,就是这样. 但是还有一个问题,为什么打开256x256图片时图片本身没有边框,打开后添加边框? ? ?这是打开cv :: Mat的时间. 从这里找到原因. 原始图像(也是256x256)在其原始边框上添加了一个点:

测试后没有边框,因此与图片的大小无关. 检查一些信息qt读取图片并显示,不知道是否与png alpha通道有关?然后只需检查每张图片是否具有Alpha通道即可(使用WIN7自己的绘图工具更改其他图片以保存256x256原始图片,因此在此过程中可以更改原始图片的Alpha通道,如PS软件将RGB保存alpha通道,RGBA).

png如果有第四个通道alpha,即每个像素为32位,则它们均为uchar类型. 第四个通道处理透明度,0〜255,0是完全透明的,而255是不透明的.

因此边界的结果是第四通道叠加在原始图像上. OpenCV 2.3和更高版本支持alpha通道,因此可以将其打开. 但是可以将打开图片的函数imread()的第二个参数设置为打开4通道png图片. 经过测试,256x256的通道数和基于此修改的图像均为4. 现在我不知道如何解决. 最后,我尝试在显示之前将4通道转换为3通道,但是并没有解决.

qt读取图片_qt读取图片并显示_qt读取图片并显示

    //读取4通道的图片,CV_LOAD_IMAGE_UNCHANGED=-1
    cv::imread(fileName.toUtf8().data(), CV_LOAD_IMAGE_UNCHANGED);
    //获取通道数
    if(image.channels() == 4){
        //先转换,但是试过了也不行
        cv::cvtColor(image,image,CV_BGRA2BGR);
        cv::namedWindow("Original Image");
        cv::imshow("Original Image",image);
    }

通常,在计算机视觉处理中,alpha通道接触相对较少,因此我没有继续进行进一步的研究. 将来我将有机会弄清楚此框的原因.

续:

我听了博客作者的建议,然后去修改它. 这是编写过程:

我将原始png图片命名为source.png,然后使用imread,将第二个参数设置为-1以读取图片,然后打印出图片数据,因为它是四个通道qt读取图片并显示,因此每个256x256图像该行的8位数据是1024(BGRA). 对前几行进行分析后,发现A通道(设置透明度)的值为0.

第二项测试基于带有win7内置绘图工具的source.png图片,该图片在边框上添加了一个点(大小保持不变):

这里写图片描述

然后以相同的方式打印此图片的数据,发现第四通道的A值为255. 我立即想到是否要更改从source.png 255读取的数据的第四通道的值:

    cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
    cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
    for(;it != itend;++it){
        (*it)[3] = 255;
    }

然后使用imshow和QT的标签分别显示它们,这与未更改的数据完全相同. . . 这次我喝醉了(更改后我打印了图片数据,而且确实被更改了. )


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-171969-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...