opencv与qt联合编程时候,需要将opencv的图片传给qt使得其能在qt的UI里显示出来并操作是,上一节已经说过了,不过如果是彩色3通道的可以直接显示,没有什么问题,但是opencv处理后再传给qt就会出现图片乱码的,寻找解决办法如下:
#include "form.h"
#include "ui_form.h"
#include "cv.h"
#include "highgui.h"
#include <QPalette>
#include <QWidget>
#include <QMessageBox>
#define RGB_TYPE 3 //R,G,B三通道
#define GRAY_TYPE 1 //格雷图,单通道
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint);
this->setAttribute(Qt::WA_TranslucentBackground);//设置背景透明
// 从文件中加载原图
IplImage* pImg = cvLoadImage("D:/22.jpg", CV_LOAD_IMAGE_UNCHANGED);
// 灰度图
IplImage *pGrayImage = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
cvCvtColor(pImg, pGrayImage, CV_BGR2GRAY);
// QImage img;
int nChannel=pGrayImage->nChannels;
if(nChannel)
{
QMessageBox msgBox;
msgBox.setText(QString::number(nChannel));
msgBox.exec();
}
IplImage*pImg2=cvCreateImage(cvGetSize(pGrayImage),8,3);
cvCvtColor(pGrayImage,pImg2,CV_GRAY2BGR );
int nChannel2=pImg2->nChannels;
if(nChannel2)
{
QMessageBox msgBox;
msgBox.setText(QString::number(nChannel2));
msgBox.exec();
}
//qt与opencv图像交换
IplImage *srcImage; //原图
srcImage=pGrayImage;
int width;
int height;
int channel_1; //图像通道数
width=srcImage->width;
height=srcImage->height;
channel_1=srcImage->nChannels;
QImage desImage=QImage(width,height,QImage::Format_RGB32);
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
int r,g,b;
if(RGB_TYPE==channel_1)
{
b=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+0);
g=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+1);
r=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j*3+2);
}
else if(GRAY_TYPE==channel_1)
{
b=(int)CV_IMAGE_ELEM(srcImage,uchar,i,j);
g=b;
r=b;
}
desImage.setPixel(j,i,qRgb(r,g,b));
}
}
ui->label->setPixmap(QPixmap::fromImage(desImage));
cvNamedWindow("rrr", CV_WINDOW_AUTOSIZE);//opencv显示图像
cvShowImage("rrr", pGrayImage);
}
<pre name="code" class="cpp">Form::~Form()
{
delete ui;
}