使用Qt显示openCV矩阵图片

1.首先配置QtCreator

  可以参见 http://blog.csdn.net/cc7829290/article/details/8984706

 使用的QtCreator,如果使用的其他编译器需要同事配置好Qt和openCV

2.首先使用Qt建立一个ui界面

绘制2个按钮和一个label


3.在头文件声明一个Mat类和一个QImage类

.处理添加两个按钮的slot;

并写入并分别写入如下代码

[cpp]  view plain copy
  1. void MainWindow::on_openPushButton_clicked()  
  2. {  
  3.     QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),"",tr("Image File(*.bmp *.jpg *.jpeg *.png)"));  
  4.     QTextCodec *code = QTextCodec::codecForName("gb18030");  
  5.     std::string name = code->fromUnicode(filename).data();  
  6.     image = cv::imread(name);  
  7.     if(!image.data)  
  8.     {  
  9.         QMessageBox msgBox;  
  10.         msgBox.setText(tr("image data is null"));  
  11.         msgBox.exec();  
  12.     }  
  13.     else  
  14.     {  
  15.         cv::cvtColor(image,image,CV_BGR2RGB);  
  16.         img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);  
  17.         ui->label->clear();  
  18.         ui->label->setPixmap(QPixmap::fromImage(img));  
  19.         ui->processPushButton->setEnabled(true);  
  20.         ui->label->resize(ui->label->pixmap()->size());  
  21.     }  
  22. }  
  23.   
  24. void MainWindow::on_processPushButton_clicked()  
  25. {  
  26.     cv::flip(image,image,1);  
  27.     img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);  
  28.     ui->label->setPixmap(QPixmap::fromImage(img));  
  29. }  

需要注意的是

[cpp]  view plain copy
  1. QTextCodec *code = QTextCodec::codecForName("gb18030");  
  2. std::string name = code->fromUnicode(filename).data();  

这两句是为了使用中文路径,字符串中改为其他支持的中文的格式也可以

[cpp]  view plain copy
  1. cv::cvtColor(image,image,CV_BGR2RGB);  
在现实图像前一定要转换下

因为openCV使用的图像通道是BGR的而QImage使用的图像通道的RGB的;

4.显示效果如下


原始代码下载

http://download.csdn.net/detail/cc7829290/5474653

在测试中发现有部分图像显示偏移,还有部分图像特别是png格式的图像显示不出来,开始以为是cv::Mat的事情,后来使用cv::imshow()发现图像是正常的.

问题出现在了QT的QImg加载的时候.

参考了http://lovelittlebean.blog.163.com/blog/static/11658218620125208212189/

单独写了一个显示图像的方法,显示图像的时候调用这个方法就可以了

[cpp]  view plain copy
  1. void MainWindow::display(cv::Mat mat)  
  2. {  
  3.     cv::Mat rgb;  
  4.     QImage img;  
  5.     if(mat.channels()==3)  
  6.     {  
  7.         cv::cvtColor(mat,rgb,CV_BGR2RGB);  
  8.         img = QImage((const uchar*)(rgb.data),rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);  
  9.     }  
  10.     else  
  11.     {  
  12.         img = QImage((const uchar*)(mat.data),mat.cols,mat.rows,mat.cols*mat.channels(),QImage::Format_Indexed8);  
  13.     }  
  14.     ui->label->setPixmap(QPixmap::fromImage(img));  
  15.     ui->label->resize(ui->label->pixmap()->size());  
  16.     ui->label->show();  
  17. }  
现在图像可以正常显示了.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值