2019独角兽企业重金招聘Python工程师标准>>>
修正:转换出来的图片颜色不对劲,必须处理:
/*图片的显示主要问题还是在于QImage与Mat格式的不同,
* 其中QImage是RGB排列,而Mat 是 BGR,同时两者
* 格式包含的内容页不同,因此需要经过转换才能够显示。
*/
1、建立一个GUI工程,基类选择QMainWindows,类名不变,选中"界面创建"
2、打开UI编辑器,拖动一个label,两个PushButton到界面上。
3、添加opencv支持,在.pro文件的最下方:
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
4、mainWindow.h中添加必要的头文件以及定义一个Mat对象
#include
#include
#include //文件操作支持
#include //image
using namespace cv;
private:
Mat image ;
5、mainWindow.cpp中,
对于构造函数,添加:
ui->label->resize(300, 300); //重设画布大小
ui->reversePushButton->setEnabled(false); //没有打开图像时, 翻转图像按钮设置为不能点击
两个按钮的槽函数
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 )
* 1、this:指定父组件, 当前为MainWindow QWidget * parent = 0,
* 2、tr("open image"),对话框的标题 const QString & caption = QString(),
* 3、 ".": 是对话框显示时默认打开的目录,"." 代表程序运行目录,"/" 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如"C:\\"等;
例如我想打开程序运行目录下的Data文件夹作为默认打开路径,这里应该写成"./Data/",若想有一个默认选中的文件,则在目录后添加文件名即可:"./Data/teaser.graph"
const QString & dir = QString(),
* 4、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。
*/
image = imread(filename.toLocal8Bit().data());
/*
* Mat imread(const String& filename,int flags = IMREAD_COLOR);
* 1、 返回Mat对象
* 2、参数filename: 待打开图片的绝对地址,并不是所有文件都可以用它打开;函数识别不是依靠文件的后缀名,而是依靠内容的编码格式;
* imread读取数据时会重新排列数据。
* 3、 参数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);
/* 1、src,输入矩阵
* 2、dst,翻转后矩阵,类型与src一致
* 3、翻转模式,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));
}