1、首先创建QT Gui程序项目(不细说了)
2、修改pro配置文件,增加OpenCV支持
3、利用QT Creater 创建一个如下布局,其中图片显示为一个label控件
4、QT中中文乱码解决方法
网上有不少关于qt中文乱码解决的方法,我找到了一个比较好的办法,main函数添加如下函数即可:
#include <QtGui/QApplication>
#include "mainwindow.h"
#include <QTextCodec>
int main(int argc, char *argv[])
{
//处理中文乱码
QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
5、如图,可以看到程序实现了显示一张图片,翻转一张图片的功能
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <QFileDialog>
#include <QLineEdit>
#include <QString>
#include <QMessageBox>
#include <QRadioButton>
#include <QImage>
#include <QLabel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_open_clicked()
{
//打开一个图片文件,并将文件目录写入到输入框中
QString strFileName = QFileDialog::getOpenFileName(this,tr("打开图片"),".",tr("图片文件 (*.png *.jpg *.jpeg *.bmp)"));
QLineEdit *pLineEdit = (QLineEdit *)ui->dirEdit;
pLineEdit->setText(strFileName);
}
void MainWindow::on_imgShow_clicked()
{
//首先提取文件目录,如果为空则弹出警告对话框
QLineEdit *pLineEdit = (QLineEdit *)ui->dirEdit;
QString strFileName = pLineEdit->text();
if(strFileName.isEmpty())
{
QMessageBox::about(this,tr("警告"),tr("请先选择文件"));
return;
}
//读取该图片文件
cv::Mat image = cv::imread(strFileName.toAscii().data());
if(!image.data)
{
QMessageBox::about(this,tr("警告"),tr("图片打开错误"));
return;
}
//转换图片的格式,在QT下利用OpenCV读取的图片数据如果要生成一张QImage类型图片需要转换格式
cv::cvtColor(image,image,CV_RGB2BGR);
//除了在label显示图片,同时利用OpenCV自身的gui弹出一图片窗口,可以看到如果不转换OpenCV GUI显示正常
cv::namedWindow("图片");
cv::imshow("图片", image);
QImage img= QImage((const unsigned char*)(image.data),
image.cols,image.rows,QImage::Format_RGB888);
// img = img.scaled(ui->QImgShow->size());
// 根据Label设置图片大小,并显示
ui->QImgShow->setPixmap(QPixmap::fromImage(img).scaled(ui->QImgShow->size()));
// resize the label to fit the image
// ui->QImgShow->resize(ui->QImgShow->pixmap().size());
}
void MainWindow::on_filpImg_clicked()
{
QLineEdit *pLineEdit = (QLineEdit *)ui->dirEdit;
QString strFileName = pLineEdit->text();
if(strFileName.isEmpty())
{
QMessageBox::about(this,tr("警告"),tr("请先选择文件"));
return;
}
cv::Mat image = cv::imread(strFileName.toAscii().data());
if(!image.data)
{
QMessageBox::about(this,tr("警告"),tr("图片打开错误"));
return;
}
cv::Mat result;
//根据单选按钮翻转图片
int iflipType;
if(ui->radioH->isChecked())
{
iflipType = 1;
}else if(ui->radioV->isChecked()){
iflipType = 0;
}else{
iflipType = -1;
}
//翻转图片,弹出OpenCV 的gui 显示图片
cv::flip(image,result,iflipType);
cv::namedWindow("图片");
cv::imshow("图片", result);
}