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(){ .........}
- opencv---任务1
- 任务1:把一张图附到另一张图上(c++结合opencv)
- 任务 1
- 任务1
- OpenCv中基于决策树的分类任务代码解读(二)
- OpenCV(1)
- opencv-1
- opencv(1)
- OpenCV(1)
- 【OpenCV归纳】1 体验OpenCV
- 【翻译】Ant常用任务1-解压缩任务
- 【OpenCV】(1)安装OpenCV、用VS2010创建OpenCV工程
- 任务一1-1
- 1月任务
- 第十周 任务1
- 17周任务1
- 第二周任务1
- 任务一1-2
- Codeforces Round #410 (Div. 2)
- linux常用操作整理(资料来源于互联网,自己用)
- JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
- Java编程思想-08多态
- MySQL 5.4.6之前有关timestamp设置current_timestamp时报错there can be only one TIMESTAMP column with CURRENT_TI
- opencv---任务1
- 碎碎念-随笔-2017.04.22
- 论文阅读笔记-图像识别分类
- 全局K-means算法
- The service already exists!关于mysql 以zip安装解决
- HDOJ 1241 油田 DFS初级算法 java代码实现 详细注释
- 在 springmvc 中, 如何配置 fastjson (阿里开源的) 和 Jackson( Spring 内置的)
- 数字图像的几何运算
- JSP 转发