Opencv&Qt之翻转图像

修正:转换出来的图片颜色不对劲,必须处理:编辑器

    /*图片的显示主要问题仍是在于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));

}
相关文章
相关标签/搜索