使用Qt显示openCV矩阵图片
2015-07-31 10:04
513 查看
1.首先配置QtCreator
可以参见 http://blog.csdn.net/cc7829290/article/details/8984706
使用的QtCreator,如果使用的其他编译器需要同事配置好Qt和openCV
2.首先使用Qt建立一个ui界面
绘制2个按钮和一个label
3.在头文件声明一个Mat类和一个QImage类
.处理添加两个按钮的slot;
并写入并分别写入如下代码
[cpp] view
plaincopy
void MainWindow::on_openPushButton_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),"",tr("Image File(*.bmp *.jpg *.jpeg *.png)"));
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string name = code->fromUnicode(filename).data();
image = cv::imread(name);
if(!image.data)
{
QMessageBox msgBox;
msgBox.setText(tr("image data is null"));
msgBox.exec();
}
else
{
cv::cvtColor(image,image,CV_BGR2RGB);
img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);
ui->label->clear();
ui->label->setPixmap(QPixmap::fromImage(img));
ui->processPushButton->setEnabled(true);
ui->label->resize(ui->label->pixmap()->size());
}
}
void MainWindow::on_processPushButton_clicked()
{
cv::flip(image,image,1);
img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(img));
}
需要注意的是
[cpp] view
plaincopy
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string name = code->fromUnicode(filename).data();
这两句是为了使用中文路径,字符串中改为其他支持的中文的格式也可以
[cpp] view
plaincopy
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
plaincopy
void MainWindow::display(cv::Mat mat)
{
cv::Mat rgb;
QImage img;
if(mat.channels()==3)
{
cv::cvtColor(mat,rgb,CV_BGR2RGB);
img = QImage((const uchar*)(rgb.data),rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
}
else
{
img = QImage((const uchar*)(mat.data),mat.cols,mat.rows,mat.cols*mat.channels(),QImage::Format_Indexed8);
}
ui->label->setPixmap(QPixmap::fromImage(img));
ui->label->resize(ui->label->pixmap()->size());
ui->label->show();
}
现在图像可以正常显示了.
可以参见 http://blog.csdn.net/cc7829290/article/details/8984706
使用的QtCreator,如果使用的其他编译器需要同事配置好Qt和openCV
2.首先使用Qt建立一个ui界面
绘制2个按钮和一个label
3.在头文件声明一个Mat类和一个QImage类
.处理添加两个按钮的slot;
并写入并分别写入如下代码
[cpp] view
plaincopy
void MainWindow::on_openPushButton_clicked()
{
QString filename = QFileDialog::getOpenFileName(this,tr("Open Image"),"",tr("Image File(*.bmp *.jpg *.jpeg *.png)"));
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string name = code->fromUnicode(filename).data();
image = cv::imread(name);
if(!image.data)
{
QMessageBox msgBox;
msgBox.setText(tr("image data is null"));
msgBox.exec();
}
else
{
cv::cvtColor(image,image,CV_BGR2RGB);
img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);
ui->label->clear();
ui->label->setPixmap(QPixmap::fromImage(img));
ui->processPushButton->setEnabled(true);
ui->label->resize(ui->label->pixmap()->size());
}
}
void MainWindow::on_processPushButton_clicked()
{
cv::flip(image,image,1);
img = QImage((const unsigned char*)(image.data),image.cols,image.rows,QImage::Format_RGB888);
ui->label->setPixmap(QPixmap::fromImage(img));
}
需要注意的是
[cpp] view
plaincopy
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string name = code->fromUnicode(filename).data();
这两句是为了使用中文路径,字符串中改为其他支持的中文的格式也可以
[cpp] view
plaincopy
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
plaincopy
void MainWindow::display(cv::Mat mat)
{
cv::Mat rgb;
QImage img;
if(mat.channels()==3)
{
cv::cvtColor(mat,rgb,CV_BGR2RGB);
img = QImage((const uchar*)(rgb.data),rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
}
else
{
img = QImage((const uchar*)(mat.data),mat.cols,mat.rows,mat.cols*mat.channels(),QImage::Format_Indexed8);
}
ui->label->setPixmap(QPixmap::fromImage(img));
ui->label->resize(ui->label->pixmap()->size());
ui->label->show();
}
现在图像可以正常显示了.
相关文章推荐
- Qt中QScrollArea的使用
- 使用Qt创建一个OpenCV工程
- QT在CT上的安装及运行
- Qt+VS2012+Win8 64Bit安装
- [记录]<<QT学习之路2>>学习第三天
- VS2010(64)+Qt4.8.0+PCL1.6.0+Vtk配置显示点云
- 怎样VS2013下安装Qt5的插件
- 用qt的图形视图框架实现的圆,三角形,矩形运动及碰撞.
- QT调用COM方法
- 用qt的图形视图框架实现的五子棋
- QT事件研究的文章
- 解决PyQt中从文件读取内容输出到界面乱码的问题
- QT中PRO文件写法的详细介绍,很有用,很重要!
- 关于获得qt tableview行数等信息
- Qt中splitter的使用
- Qt中QTreeWidget的使用
- 深度解析 Qt 中动态链接库
- Qt 鼠标右击菜单建立
- QtGstreamer 编译
- QtString中去掉空格