之前刚在QT里搭建好opencv环境时候,我想着再qt里嵌入opencv运行出来的图片,就是把opencv的运行结果放到qt界面指定的位置,不想是opencv自己独立的小窗口。
运行效果(左边是opencv自己窗口运行结果,右边是把通过opencv生成的图片放在嵌在qt的一个 label中的效果):
我个人这样实现了,我觉得是在背后把opencv生成的图片数据转换成Qt可接收的图片个数就好。
你看下我的效果:
主要思路就是: 不是把opencv那个窗口嵌入到qt里面,而是把opencv生成的图片数据在qt 里面表示出来,那样就可以随意操作了。
可以参考一下我的代码,接触过opencv以及qt,很容易看懂我在写什么,相关的函数应该很容易看懂的,我就不详述了,注释里有。代码我就简要的贴出来了
// 相关的变量定义
private:
QImage * qImage; // qt 中的图片类型指针
IplImage * image; // opencv里的图片类型指针
IplImage * tempImage;
主要函数:
void MainWindow::on_pushButton_clicked()
{
//第一步:下面是加载一张图片,是借助opencv函数来加载的图片
this->image = cvLoadImage("/home/jacklu/图片/28.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);
}
写这个博客,是因为再www.qtcn.org这个论坛里看到有人提到,我想回帖,但是图片没能传上去,所以就在这里写了。很浅的知识,今天顺便贴出来。
2016-10-09 00:32:54 By Jack Lu