opencv---任务1

来源:互联网 发布:笔记本清理垃圾软件 编辑:程序博客网 时间:2024/06/06 10:55

实现功能:

1.选择所需要的图片
2.将选取的图片显示出来
3.将图片进行简单处理
4.将处理后的图片保存在特定的文件夹,如果文件夹存在,直接保存;如果文件夹不存在,需要创建文件夹;
5.将图片信息保存在一个txt文件中,同时需要确定txt文件所在的文件夹是否存在。如果,文件夹存在,不需要创建,如果文件夹不存在,需要创建。

代码

mainwindow.h

#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>class QAction;class MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:   //这是增加的第一句    void open();private:    QAction *openAction;//这是增加的第二句};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"#include <QMenu>#include<QImage>#include<QMenuBar>#include<QAction>#include<QKeySequence>#include<QToolBar>#include<QMessageBox>#include<QFileDialog>#include<QImage>#include<QIODevice>#include<QPixmap>#include<QDateTime>#include<QDir>#include<QTextStream>#include<opencv2/opencv.hpp>using namespace cv;using namespace std;MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){  openAction = new QAction(tr("&Open"), this);  openAction->setShortcut(QKeySequence::Open);  openAction->setStatusTip(tr("Open a file."));  openAction->setIcon(QIcon(":/open.ico"));  connect(openAction,SIGNAL(triggered()),this,SLOT(open()));  QMenu *file = menuBar()->addMenu(tr("&File"));  file->addAction(openAction);  QToolBar *toolBar = addToolBar(tr("&File"));  toolBar->addAction(openAction);}MainWindow::~MainWindow(){}void MainWindow::open(){   Mat image,image2;    //1.获取选择的图片    QString path=QFileDialog::getOpenFileName(this,tr("open image"),".",tr("Image Files(*.jpg *.png)"));    if(path.length()==0){        cout<<"NO picture read"<<endl;        return;    }    /*2.将图片进行显示*/    char *chPath;    QByteArray qbt;    qbt = path.toLatin1();    chPath=qbt.data();    image=imread(chPath);    if(image.empty()){        cout<<"no Picture read!"<<endl;        return;    }    imshow("original image", image);    //3.将图片进行处理,比如二值化处理,并且进行显示    threshold(image,image2,200,255,1);    imshow("The Changed image",image2);    //4.将图片保存到特定的文件夹中    QDir *list=new QDir;    bool exist=list->exists("D:\\Photos");    if(!exist){        list->mkdir("D:\\Photos");    }    imwrite("D:\\photos\\1.png",image2);    //5.保存图片信息到txt文件中并且进行保存    QFile file("D:\\record.txt");    if (!file.open(QIODevice::WriteOnly)) {        std::cerr << "Cannot open file for writing: "                  << qPrintable(file.errorString()) << std::endl;        return;    }    QTextStream out(&file);    out << "The rows of the Picture:"<<image2.rows<<endl;}

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}

运行结果

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

代码详解

头文件

1.mainwindow.h

private slots:    void open();private:    QAction *openAction;

用于在头文件中声明一个信号槽和一个QAction*


信号槽的相关知识点链接
http://blog.csdn.net/u010847519/article/details/61615485
http://blog.csdn.net/u010847519/article/details/62223246

QAction*的知识点链接
http://blog.csdn.net/u010847519/article/details/62434553
http://blog.csdn.net/u010847519/article/details/62443993


工具栏和菜单栏

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    openAction = new QAction(tr("&Open"), this);    openAction->setShortcut(QKeySequence::Open);    openAction->setStatusTip(tr("Open a file."));    openAction->setIcon(QIcon(":/open.ico"));    connect(openAction,SIGNAL(triggered()),this,SLOT(open()));    QMenu *file = menuBar()->addMenu(tr("&File"));    file->addAction(openAction);    QToolBar *toolBar = addToolBar(tr("&File"));    toolBar->addAction(openAction);}

第一段代码用于设置QAtion*类型的openAction的属性:显示文本,快捷键,图标和 信号槽。
第二段代码用于创建一个QMenu和QToolBar,并将openAction关联在QMenu和QToolBar上。

open函数

void MainWindow::open(){     Mat image,image2;    //1.获取选择的图片    QString path=QFileDialog::getOpenFileName(this,tr("open image"),".",tr("Image Files(*.jpg *.png)"));    if(path.length()==0){        cout<<"NO picture read"<<endl;        return;    }    /*2.将图片进行显示*/    char *chPath;    QByteArray qbt;    qbt = path.toLatin1();    chPath=qbt.data();    image=imread(chPath);    if(image.empty()){        cout<<"no Picture read!"<<endl;        return;    }    imshow("original image", image);    //3.将图片进行处理,比如二值化处理,并且进行显示    threshold(image,image2,200,255,1);    imshow("The Changed image",image2);    //4.将图片保存到特定的文件夹中    QDir *list=new QDir;    bool exist=list->exists("D:\\Photos");    if(!exist){        list->mkdir("D:\\Photos");    }    imwrite("D:\\photos\\1.png",image2);    //5.保存图片信息到txt文件中并且进行保存    QFile file("D:\\record.txt");    if (!file.open(QIODevice::WriteOnly)) {        std::cerr << "Cannot open file for writing: "                  << qPrintable(file.errorString()) << std::endl;        return;    }    QTextStream out(&file);    out << "The rows of the Picture:"<<image2.rows<<endl;}

1.获取QFileDialog选择的文件路径

    QString path=QFileDialog::getOpenFileName(this,tr("open image"),".",tr("Image Files(*.jpg *.png)"));

QFileDialog::getOpenFileName的函数签名

 static QString getOpenFileName(QWidget *parent = Q_NULLPTR,                                   const QString &caption = QString(),                                   const QString &dir = QString(),                                   const QString &filter = QString(),                                   QString *selectedFilter = Q_NULLPTR,                                   Options options = Options());

 if(path.length()==0){//返回path字符串的长度       QMessageBox::information(NULL,tr("Path"),tr("You didn't select any files."));    }

QStringL::length的函数签名

inline int QString::length() const{ return d->size; }

2. 将图片进行显示

 char *chPath; QByteArray qbt; qbt = path.toLatin1(); chPath=qbt.data(); image=imread(chPath); imshow("original image", image);

前面四行代码用于将QString转为char*
知识点链接为:
http://blog.csdn.net/u010847519/article/details/70432361

3.保存信息到特定文件夹

QDir *list=new QDir;bool exist=list->exists("D:\\Photos");if(!exist){    list->mkdir("D:\\Photos");}imwrite("D:\\photos\\1.png",image2);

前5行代码用于控制文件夹:首先,判断有没有该文件夹的存在,若没有,则创建文件夹。
最后一行代码用于将图片写入文件夹。
4.往txt文件中写入文字

QFile file("D:\\record.txt");if (!file.open(QIODevice::WriteOnly)) {      std::cerr << "Cannot open file for writing: "                << qPrintable(file.errorString()) << std::endl;      return;  }  QTextStream out(&file);  out << "The Picture is from: " <<path << endl;

知识点总结

1. 创建一个QAction

并在QToolbar和QMenu上关联的通用代码
mainwindow.h

#include <QMainWindow>#include<QMenu>#include<QImage>#include<QMenuBar>#include<QAction>#include<QKeySequence>#include<QToolBar>#include<QMessageBox>#include<QFileDialog>#include<QImage>#include<QIODevice>#include<QPixmap>#include<QDateTime>#include<QDir>#include<QTextStream>#include<opencv2/opencv.hpp>using namespace std;using namespace cv;class QAction;   //这是增加的第一句,前向声明QActionclass MainWindow : public QMainWindow{    Q_OBJECTpublic:    MainWindow(QWidget *parent = 0);    ~MainWindow();private slots:    void open();        //用于声明信号槽private:    QAction *openAction;//这是增加的第二句};

mainwindow.cpp

#include "mainwindow.h"MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){    /*设置QAction的显示文字,快捷键,  图标和信号槽*/    openAction = new QAction(tr("&Open"), this);    openAction->setShortcut(QKeySequence::Open);    openAction->setStatusTip(tr("Open a file."));    openAction->setIcon(QIcon(":/open.ico"));    connect(openAction,SIGNAL(triggered()),this,SLOT(open()));   /*将QAction与QMenu,QToolbar相关联*/    QMenu *file = menuBar()->addMenu(tr("&File"));    file->addAction(openAction);    QToolBar *toolBar = addToolBar(tr("&File"));    toolBar->addAction(openAction);}MainWindow::~MainWindow(){}/*用于填写点击Qaction关联的菜单栏后,信号槽触发的函数*/void MainWindow::open(){  .........}
1 0