Qt:Opencv翻转图像

1060 篇文章 297 订阅

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

    /*图片的显示主要问题还是在于QImage与Mat格式的不同,
     * 其中QImage是RGB排列,而Mat 是 BGR,同时两者
     * 格式包含的内容页不同,因此需要经过转换才能够显示。
    */

 

1、建立一个GUI工程,基类选择QMainWindows,类名不变,选中"界面创建"

2、打开UI编辑器,拖动一个label,两个PushButton到界面上。

cff2d4f3c5d73e040895d1fcb45417ed711.jpg

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 <cv.h>
#include <highgui.h>
#include <QFileDialog>   //文件操作支持
#include <opencv2/opencv.hpp>  //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<string>。
    */
    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));

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值