
建议: 在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图片


通过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());



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

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

正常! ! !比较这两个问题,问题出在哪里?
我重试了几张不同大小的图片: 200x200、356x356都可以. 分析可以知道,cv :: Mat读取的图像没有问题,它一定是QImage的问题. 检查了QImage的构造函数:


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通道,但是并没有解决.

//读取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
男女比例失调正常因为重男轻女
很对很对我也这么认为
这