问题一:

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

  通过OpenCV自带的GUI显示出来图像是没问题的,例如以下操作代码所看到的:

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

  可是经过以下的处理之后,图片显示不正常了:

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

问题二:

  操作图片test1.png是一个256x256的PNG图片(原图如上图)。相同的代码,相同的操作。用OpenCV自带GUI显演示样例如以下:

  而处理后用QT label显演示样例如以下:

  正常。!

。对照两个问题,究竟哪里出现了问题呢?

  又又一次试了几张不同大小的图片:200x200,356x356均没问题。分析能够知道cv::Mat 读取的图片是没有问题的。那肯定就是QImage这里出问题了。查了QImage的构造函数:

   当中bytesPerLine參数为每一行的字节数。

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

  然后再去打开图片。能够了。可是还有个问题就是,为什么打开256x256的图片的时候。本来图片本身没有边框的。打开后就加了个边框呢???这个是在cv::Mat 打开的时候就有了,从这里找原因。

将相同为256x256大小的原图。在其基础上的边框上加了一个点:

  測试后没有边框了,因此跟图片大小没关系。

查了一些资料。不知道是不是跟png的alpha通道有关?那接下来仅仅要查看每一个图片是不是有alpha通道即可了(其它的图片都是用了WIN7自带的绘图工具对256x256原始图片来更改保存的,所以在这个过程中可能改变了原图的alpha通道,RGB,像PS软件会保存alpha通道。RGBA)。

  png假设有第四个通道alpha。也就是每一个像素是32位了,都是uchar型,第四个通道是处理透明度的。0~255,0为全然透明,255为不透明。

  所以有边框的结果是第四通道叠加到原图上去了。

OpenCV 2.3以后的版本号支持alpha通道,所以也就能够打开。

可是打开一张图片的函数imread()的第二个參数是能够设置能够打开4通道的png图片的。測试了下,256x256和基于这个改动的图片的通道数都是4。

这下我也不知道怎么攻克了。最后尝试了在显示之前将4通道的转为3通道的,可是也未能解决。

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

总得来说,在计算机视觉处理中,alpha通道接触是比較少的,所以还是没继续深究了,以后有机会了再来把这个框的原因彻底搞清楚。

续:

听了博主shiter的建议。再去鼓捣了下,这里写下过程:

  我将原始的png图片命名为source.png,然后用imread。设置第二个參数为-1去读取图片。然后将图片数据打印了出来,由于是四通道的。所以256x256图像每行的8位数据为1024个(BGRA)。分析了前几行。发现A通道(设置透明度的)的值都为0。

  第二个測试是基于source.png图片用win7自带绘图工具在边框上加了个点(大小保持不变):

  然后以相同的方式再去打印这个图片的数据。发现第四个通道的A值都为255。我立刻想到要不将source.png读出来的数据的第四个通道的值所有改为255:

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

  然后用imshow和QT的label分别去显示出来。竟然跟没改数据一模一样。

。。这下醉了(我打印了改了之后的图片数据。确定是改了)。

OpenCV【2】---读取png图片显示到QT label上的问题的更多相关文章

  1. OpenCV问题集锦,图片显示不出来,WaitKey(0),imread()不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  2. OpenCV问题集锦,图片显示不出来的问题,cvWaitKey(0),不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  3. Qt添加窗口背景图片、Label图片显示、、Label文字显示

    一.添加窗口背景图片 重写MainWindow绘制事件 void MainWindow::paintEvent(QPaintEvent *event) { QPainter painter(this) ...

  4. springMVC读取本地图片显示到前端页面

    @RequestMapping("/getImage") @ResponseBody public void getImagesId(HttpServletResponse rp) ...

  5. 使用QT显示OpenCV读取的图片

    目录 1. 概述 2. 实现 2.1. 代码 2.2. 解析 3. 结果 1. 概述 OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,这里通过QT来显示O ...

  6. TensorFlow与OpenCV,读取图片,进行简单操作并显示

    TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...

  7. Qt+opencv:读取、显示图像

    GitHub:点击下载完整代码 本文主要是使用Qt与opencv将图像进行显示在QT界面上. 程序运行后的界面如下所示: (由于只有打开图像之后,才能对图像进行翻转,所以程序设置为读取图像成功之后才能 ...

  8. OpenCV视频读取播放,视频转换为图片

    转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::Vide ...

  9. FileReader:读取本地图片文件并显示

    最近忙得比狗还惨,导致长时间没能更新文章,真心对不住啊.抽空整理了下关于在页面上读取和显示本地图片的实例文章,本文通过实例讲解如何使用支持FileReader浏览器的用户将能够通过一个file inp ...

随机推荐

  1. java中的json

    josn: 一种数据传输格式,与开发语言无关,轻量级 一开始是javaScript的,但是后面比较流传,几乎所有语言都有相应的使用API 数据结构: Object---对象 使用花括号{}包含的键值对 ...

  2. Node_进阶_8

    Node进阶第八天 一.复习 Node.js特点:单线程.异步I/O(非阻塞I/O).事件驱动(事件环). 适合的程序:就是没有太多的计算,I/O比较多的业务. 举例:留言本.考试系统.说说.图片裁切 ...

  3. HDU-2204- Eddy’s爱好 (容斥原理)

    题意 给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 (1<=n<=1^18) 题解 (一开始^以为是异或懵逼了好久....) 额,显然1这个数比较讨厌 ...

  4. HDU 4366 Successor

    Successor Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID:  ...

  5. wget 升级

    漏洞描述: Wget是GNU计划开发的一套用于在网络上进行下载的自由软件,是Unix/Linux系统最常用的下载工具,支持通过HTTP.HTTPS以及FTP这三个最常见的TCP/IP协议下载. Wge ...

  6. Python 入门学习 -----变量及基础类型(元组,列表,字典,集合)

    Python的变量和数据类型 1 .python的变量是不须要事先定义数据类型的.能够动态的改变 2. Python其中一切皆对象,变量也是一个对象,有自己的属性和方法 我们能够通过 来查看变量的类型 ...

  7. border:none与border:0的区别

    border:none与border:0的区别体现为两点:一是理论上的性能差异,二是浏览器兼容性的差异. 性能差异: [border:0;]把border设为“0”像素效果等于border-width ...

  8. A string is a sequence

    A string is a sequence of characters. You can access the characters one at a time with the bracket o ...

  9. Spring控制反转容器的使用例子

    详细代码如下: spring-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...

  10. PDO 拿出來的 Float 數據跟数据库中的数据不匹配

    数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0 数据库:75.2 -> 程序打印:75.3 在另外一个测试 ...