先给出本文章的转载地址:Qt中显示opencv生成图片
注:把opencv的运行结果放到qt界面指定的位置,而不是opencv自己独立的小窗口。
主要思路就是: 不是把opencv那个窗口嵌入到qt里面,而是把opencv生成的图片数据在qt 里面表示出来,那样就可以随意操作了。
首先在mainwindow.h中添加私有成员变量:
QImage * qImage; // qt 中的图片类型指针
IplImage * image; // opencv里的图片类型指针
IplImage * tempImage;
然后在响应函数处添加如下代码:
void MainWindow::on_get_picture_clicked()
{
//第一步:下面是加载一张图片,是借助opencv函数来加载的图片
this->image = cvLoadImage("test.jpg",1);// 用opencv函数加载一张图片
// 第二步:实例化一个空的QImage 和一个 IplImage
this->qImage = new QImage(QSize(this->image->width,this->image->height),QImage::Format_RGB888);
// 根据上面加载到的图片,建立一个相同格式(指的是长和高)的opencv里的图片对象
this->tempImage = cvCreateImageHeader(cvSize(this->image->width,this->image->height),8,3);
// 第三步
this->tempImage->imageData = (char*)(this->qImage->bits());
// tempImage->imageData指向的存放图像实体区域的指针, qlmage->bits() 是QT中 图像实体区域指针,现在让tempImage->imageData 也指向 qlmage->bits() 指向的区域
cvCopy(this->image,this->tempImage,0);// 把图像数据从this->image 拷贝到 this->tempImage指向的区域,而this->tempImage此时指向的区域和this->qImage->bits()所指的是同一个区域
//cvCvtColor(this->tempImage,this->tempImage,CV_BGR2RGB); //这个是颜色空间转换
//第四步
this->ui->label->setPixmap((QPixmap::fromImage(*this->qImage)).scaled(this->ui->label->size()));// 这句话就是你想要的 把opencv处理出来的图片放到 qt 指定的方框里了
// 下面这两句是opencv独立窗口显示图片,用来对比
cvNamedWindow("show");
cvShowImage("show",this->image);
cv::waitKey(5000);
}
主要代码如下: