修正:转换出来的图片颜色不对劲,必须处理:编辑器
/*图片的显示主要问题仍是在于QImage与Mat格式的不一样,
* 其中QImage是RGB排列,而Mat 是 BGR,同时二者
* 格式包含的内容页不一样,所以须要通过转换才可以显示。
*/
一、创建一个GUI工程,基类选择QMainWindows,类名不变,选中"界面建立"函数
二、打开UI编辑器,拖动一个label,两个PushButton到界面上。ui
三、添加opencv支持,在.pro文件的最下方:this
INCLUDEPATH += E:/software/opencv-3.4.2/build/install/include/opencv \ E:/software/opencv-3.4.2/build/install/include/opencv2 \ E:/software/opencv-3.4.2/build/install/include LIBS += -L E:/software/opencv-3.4.2/build/install/x86/mingw/bin/libopencv_*.dll
四、mainWindow.h中添加必要的头文件以及定义一个Mat对象编码
#include <cv.h> #include <highgui.h> #include <QFileDialog> //文件操做支持 #include <opencv2/opencv.hpp> //image using namespace cv; private: Mat image ;
五、mainWindow.cpp中,spa
对于构造函数,添加:code
ui->label->resize(300, 300); //重设画布大小 ui->reversePushButton->setEnabled(false); //没有打开图像时, 翻转图像按钮设置为不能点击
两个按钮的槽函数orm
void MainWindow::on_openPushButton_clicked() { //打开图像,获取图像名称 QString filename = QFileDialog::getOpenFileName(this, tr("open image"), ".", tr("Image file(*.png *.jpg *.bmp)")); /* * QString QFileDialog::getOpenFileName ( QWidget * parent = 0, const QString & caption = QString(), const QString & dir = QString(), const QString & filter = QString(), QString * selectedFilter = 0, Options options = 0 ) * 一、this:指定父组件, 当前为MainWindow QWidget * parent = 0, * 二、tr("open image"),对话框的标题 const QString & caption = QString(), * 三、 ".": 是对话框显示时默认打开的目录,"." 表明程序运行目录,"/" 表明当前盘符的根目录(Windows,Linux下/就是根目录了),也能够是平台相关的,好比"C:\\"等; 例如我想打开程序运行目录下的Data文件夹做为默认打开路径,这里应该写成"./Data/",若想有一个默认选中的文件,则在目录后添加文件名便可:"./Data/teaser.graph" const QString & dir = QString(), * 四、filter,是对话框的后缀名过滤器,好比咱们使用"Image Files(*.jpg *.png)"就让它只能显示后缀名是jpg或者png的文件。若是须要使用多个过滤器,使用";;"分割, 好比"JPEG Files(*.jpg);;PNG Files(*.png)";const QString & filter = QString(), * 第五个参数selectedFilter,是默认选择的过滤器; * 第六个参数options,是对话框的一些参数设定,好比只显示文件夹等等,它的取值是enum QFileDialog::Option,每一个选项可使用 | 运算组合起来。 * 若是我要想选择多个文件怎么办呢?Qt提供了getOpenFileNames()函数,其返回值是一个QStringList。你能够把它理解成一个只能存放QString的List,也就是STL中的list<string>。 */ image = imread(filename.toLocal8Bit().data()); /* * Mat imread(const String& filename,int flags = IMREAD_COLOR); * 一、 返回Mat对象 * 二、参数filename: 待打开图片的绝对地址,并非全部文件均可以用它打开;函数识别不是依靠文件的后缀名,而是依靠内容的编码格式; * imread读取数据时会从新排列数据。 * 三、 参数flags:打开的参数。它能够指导将原图读取时进行必定的转换 * * toLocal8Bit:是将QString以本身正确的编码方式读取并转换成编译器编码方式的字节流,而string自己就是字节流没有编码方式 */ QImage img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB888); /* * QImage 在像素级别上对图像进行操做 * QImage在IO操做中有很快的速度,而且给出了访问像素的接口 */ img = img.scaled(ui->label->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); //让图像适应QLabel,不然只显示一部分 ui->label->setPixmap(QPixmap::fromImage(img)); if(image.data) { ui->reversePushButton->setEnabled(true); } } void MainWindow::on_reversePushButton_clicked() { flip(image, image, 0); /* 一、src,输入矩阵 * 二、dst,翻转后矩阵,类型与src一致 * 三、翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°) */ QImage img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB888);\ img = img.scaled(ui->label->size(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); ui->label->clear(); ui->label->setPixmap(QPixmap::fromImage(img)); }