您的位置:首页 > 编程语言 > Qt开发

使用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();

}

现在图像可以正常显示了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: