目录

一、环境:

【1】下载并安装OpenCV,配置OpenCV环境变量

​编辑

​编辑

​【2】在.pro工程文件中加入OpenCV库路径和库文件名

【3】添加头文件和命名空间

【4】构建运行代码,检验是否配置成功。

二、OpenCV使用

【1】设置ui界面

【2】完整代码

【3】运行效果

一、环境:

操作系统:Windows10

开发软件:Qt Creator 4.10.1

编译器:MSVC 2017, 64 bit

OPenCV版本:OPenCV4.5.5

【1】下载并安装OpenCV,配置OpenCV环境变量

下载安装

链接: https://pan.baidu.com/s/113pVacKduRWQq4BcZAMsow 提取码: crfv

配置环境变量


【2】在.pro工程文件中加入OpenCV库路径和库文件名

可以利用添加外部库达以下效果,路径为本机存储路径

INCLUDEPATH += $$PWD/../../../user/apps/software/OpenCV4.5/opencv/build/includewin32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../../user/apps/software/OpenCV4.5/opencv/build/x64/vc14/lib/ -lopencv_world455
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../../user/apps/software/OpenCV4.5/opencv/build/x64/vc14/lib/ -lopencv_world455d

【3】添加头文件和命名空间

添加头文件,可以只添加第一个

命名空间

添加头文件,可以只添加第一个
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>命名空间
using namespace cv;

【4】构建运行代码,检验是否配置成功。

需要在ui界面设置一个oldLabel控件(QLabel)
没有报错,就证明环境配置好了

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);Mat srcImage_ ;// 读取图像 存储为cv::Mat类型对象  “QString *”转换为“const cv::String &”srcImage_ = imread("D:/img/photograph.jpg");// 将BGR颜色空间就转换为RGB空间cvtColor(srcImage_, srcImage_, COLOR_BGR2RGB);// 数据源为data指针,图像的宽度、高度、字节数、像素格式QImage disImage = QImage(srcImage_.data, srcImage_.cols, srcImage_.rows,srcImage_.cols * srcImage_.channels(), QImage::Format_RGB888);// 对QImage对象进行缩放(设置 缩放后大小 <= 控件大小)disImage = disImage.scaled(QSize(300,300));// 在指定控件中放置图像ui->old_label->setPixmap(QPixmap::fromImage(disImage));
}

二、OpenCV使用

【1】设置ui界面

【2】完整代码

代码详情可参考此篇https://blog.csdn.net/qq_52218412/article/details/130751428

Windows10+OpenCV4.5.5打开本地图片进行图片处理 实时摄影并抓拍图片存入本机

widget.h#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <QDebug>
#include <QTimer>
#include <QDateTime>using namespace cv;QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:// 将图片格式转化并放入控件void setChangedImage(Mat image);void setOriginalImage(Mat image);private slots:void getFrame(QPrivateSignal);void on_btn_snowflake_clicked();                // 雪花屏void on_btn_gaussian_clicked();                 // 高斯模糊void on_btn_median_filtering_clicked();         // 中值滤波void on_btn_grayscale_clicked();                // 灰度化void on_btn_xy_vague_clicked();                 // xy方向模糊void on_btn_bilateral_vague_clicked();          // 双边模糊void on_btn_corrosion_clicked();                // 腐蚀// 打开保存图片void on_btn_open_clicked();void on_btn_save_clicked();// 打开关闭摄像头,拍照void on_btn_open_camera_clicked();void on_btn_close_camera_clicked();void on_btn_photograph_clicked();private:Ui::Widget *ui;// 原图Mat srcImage_;// 修改后的图Mat changedImage_;//  图片路径QString imagePath_;QTimer *timer;VideoCapture captrue_;};
#endif // WIDGET_H
widget.cpp#include "widget.h"
#include "ui_widget.h"#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("opencv");// 不能关闭摄像头 不可拍照ui->btn_photograph->setEnabled(false);ui->btn_close_camera->setEnabled(false);//超时就读取当前摄像头信息timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(getFrame()));
}Widget::~Widget()
{delete ui;
}void Widget::setChangedImage(Mat image)
{changedImage_ = image;//Mat转QImage 像素   newlabel放置图像处理后图片// 数据源为data指针,图像的宽度、高度、字节数、像素格式QImage disimage2 = QImage(changedImage_.data, changedImage_.cols, changedImage_.rows, changedImage_.cols*changedImage_.channels(), QImage::Format_RGB888);disimage2 = disimage2.scaled(ui->new_label->width(), ui->new_label->height());ui->new_label->setPixmap(QPixmap::fromImage(disimage2));
}void Widget::setOriginalImage(Mat image)
{srcImage_ = image;// 将BGR颜色空间就转换为RGB空间cvtColor(srcImage_, srcImage_, COLOR_BGR2RGB);// 数据源为data指针,图像的宽度、高度、字节数、像素格式QImage disImage = QImage(srcImage_.data, srcImage_.cols, srcImage_.rows,srcImage_.cols * srcImage_.channels(), QImage::Format_RGB888);// 对QImage对象进行缩放disImage = disImage.scaled(ui->old_label->width(), ui->old_label->height());// 在指定控件中放置图像ui->old_label->setPixmap(QPixmap::fromImage(disImage));ui->new_label->setPixmap(QPixmap::fromImage(disImage));
}// 从摄像头中抓取并返回每一帧
void Widget::getFrame(QPrivateSignal)
{// 视频帧保存到Mat,通过定时器刷新显示Mat frameImage;captrue_ >>frameImage;//Mat转QImage 像素   oldlabel和newlabel放置图片setOriginalImage(frameImage);
}// 雪花屏
void Widget::on_btn_snowflake_clicked()
{Mat srcImage = srcImage_;//像素二维矩阵函数int rows = srcImage.rows;//像素二维矩阵列数int cols = srcImage.cols * srcImage.channels();for(int i=0;i<rows;i++){// 获取Mat对象的第i行像素的指针uchar * data = srcImage.ptr<uchar>(i);for(int j=0; j<cols; j++){//雪花屏特效int q = rand()%cols;data[q]=155;            //某些通道随机改成155}// 在Mat对象中采用二维矩阵的形式存储,而在QImage对象中则将所有像素数据序列化为一个一维数组,因此可以通过指针来访问和修改图像数据。}//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(srcImage);
}// 高斯模糊
void Widget::on_btn_gaussian_clicked()
{Mat gauImage;Mat srcImage = srcImage_;// 高斯模糊   参数:输入Mat对象 输出Mat对象 高斯核大小(矩阵) 计算标准差GaussianBlur(srcImage, gauImage, Size(5, 5), 0, 0);// 数据源为data指针,图像的宽度、高度、字节数、像素格式setChangedImage(gauImage);
}// 中值滤波
void Widget::on_btn_median_filtering_clicked()
{Mat medImage;Mat srcImage = srcImage_;//中值滤波  参数:输入Mat对象 输出Mat对象 卷积核大小(正方形边长)medianBlur(srcImage, medImage, 5);//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(medImage);}// 灰度化
void Widget::on_btn_grayscale_clicked()
{Mat graImage;Mat srcImage = srcImage_;// 彩色图像转化为灰度图像  灰度图像再转为彩色图像cvtColor(srcImage, graImage, COLOR_BGR2GRAY);cvtColor(graImage, graImage, COLOR_GRAY2BGR);//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(graImage);
}// xy方向模糊
void Widget::on_btn_xy_vague_clicked()
{Mat xyImage;Mat srcImage = srcImage_;// xy轴模糊 均值滤波  参数:输入Mat对象 输出Mat对象 均值滤波卷积核大小(矩阵)blur(srcImage, xyImage, Size(10, 10));//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(xyImage);
}// 双边模糊
void Widget::on_btn_bilateral_vague_clicked()
{Mat bilImage;Mat srcImage = srcImage_;// 双边模糊  参数:输入Mat对象 输出Mat对象 卷积核大小 灰度空间中的标准差值  坐标空间中标准差// 插值方式(为负,INTER_LINEAR;为零,INTER_NEAREST;为正,INTER_AREA、INTER_CUBIC)bilateralFilter(srcImage, bilImage, 15, 120, 10, 4);//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(bilImage);
}// 腐蚀
void Widget::on_btn_corrosion_clicked()
{Mat corImage;Mat srcImage = srcImage_;// 生成矩形操作,结构元素大小5*5,MORPH_RECT指定为矩形Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));// 腐蚀操作  参数:输入Mat对象 输出Mat对象 腐蚀结构erode(srcImage, corImage, element);//Mat转QImage 像素   newlabel放置图像处理后图片setChangedImage(corImage);
}// 打开图片
void Widget::on_btn_open_clicked()
{// 打开文件 选择图片imagePath_ = QFileDialog::getOpenFileName(this,tr("选择图片"),"../../../user/picture/res",tr("Image files(*.jpg *.png *.webp);;All files(*.*)"));if(imagePath_.isEmpty()) {return;}// 读取图像 存储为cv::Mat类型对象  “QString *”转换为“const cv::String &”srcImage_ = imread(imagePath_.toStdString());//Mat转QImage 像素   oldlabel和newlabel放置图片setOriginalImage(srcImage_);
}// 保存图片
void Widget::on_btn_save_clicked()
{QString saveImagePath = "../../../user/picture/opencv/";if(saveImagePath.isEmpty()) {return;}// 获取图片名称和后缀QString str = imagePath_.mid(20);QStringList imageName = str.split(".");// 保存修改后的图片到指定位置imwrite(QString("%1%2_save.%3").arg(saveImagePath).arg(imageName[0]).arg(imageName[1]).toStdString(), changedImage_);
}// 打开摄像头
void Widget::on_btn_open_camera_clicked()
{// 打开摄像头 开始计时,超时则发出timeout()信号,200毫秒取一帧captrue_.open(0);timer->start(200);// 不可打开摄像 可关闭摄像 可拍照ui->btn_open_camera->setEnabled(false);ui->btn_close_camera->setEnabled(true);ui->btn_photograph->setEnabled(true);
}// 关闭摄像头
void Widget::on_btn_close_camera_clicked()
{// 关闭摄像头 停止取帧captrue_.release();timer->stop();// 可打开摄像 不可关闭摄像 不可拍照ui->btn_open_camera->setEnabled(true);ui->btn_close_camera->setEnabled(false);ui->btn_photograph->setEnabled(false);
}// 拍照
void Widget::on_btn_photograph_clicked()
{// 视频帧保存到Mat,通过定时器刷新显示Mat frameImage;captrue_ >> frameImage;//Mat转QImage 像素   oldlabel和newlabel放置图片setOriginalImage(frameImage);// 将捕获的图片存储到本机指定位置QString saveImagePath = "../../../user/picture/photograph/";if(saveImagePath.isEmpty()) {return;}// 以当前时间给图片命名, 如"20230518_095329.png"QDateTime dateTime;dateTime = QDateTime::currentDateTime();QString name = dateTime.toString("yyyyMMdd_hhmmss");// 保存修改后的图片到指定位置imwrite(QString("%1%2.png").arg(saveImagePath).arg(name).toStdString(), frameImage);qDebug() << name;
}

【3】运行效果

01_Windows系统下 在qt中 对OpenCV下载配置并简单使用相关推荐

  1. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

  2. QT 中使用 OpenCv 的 CascadeClassifier 报错

    问题 在 QT 中调用 OpenCv 的 CascadeClassifier 进行人脸框检测的时候,在构造函数中进行检测器的初始化,随后调用相机读取图片的时候就会报错,报的错误是 Segment Fa ...

  3. Win系统下用Eclipse中运行远程hadoop MapReduce程序出现Permission denied错误

    Win系统下用Eclipse中运行远程hadoop MapReduce程序出现报错 WARNING: job_local1833185613_0001 org.apache.hadoop.securi ...

  4. linux中网页播放音乐,Linux_在Linux系统下播放网页中的背景音乐技巧,在Linux中的firefox浏览许多网页 - phpStudy...

    在Linux系统下播放网页中的背景音乐技巧 在Linux中的firefox浏览许多网页时,很多使用了基于WMP的背景音乐播放器,如部份baidu空间.但firefox默认不支持播放. 在LINUX的源 ...

  5. Linux下 QT中 log4cplus 最基本配置及使用

    Linux下 QT中 log4cplus 最基本配置及使用 鉴于网上很多使用方法不是很详细,对小白不友好,并且以此作为记录,方便下次配置. 本文是基于我自己下载的版本写的,请各位根据自己下载的版本更改 ...

  6. linux 字符界面 office,Linux系统下对比永中office和wps的界面及字体,附对比图

    本文为你介绍Linux系统下对比永中office和wps的界面及字体,附对比图和用户评论.仅是对这两个应用软件直观的界面进行比较,没有没有涉及到功能齐不齐全.兼容性是否良好等问题.如果你使用的是Dee ...

  7. linux mkfs 源码,Linux系统下移植busybox中mkfs.vfat命令

    为了延长磁盘寿命来存储音视频文件,打发在格式化磁盘过程中将簇的大小设置大点.因为存储的音视频文件现对较大,那么将簇大小设置得尽可能大,这样可以增强磁盘读取数据的性能,同时也不会浪费太多空间. 但发现我 ...

  8. 计算机 其他 无法删除吗,Ghost win7系统下删除我的电脑中其他多余图标的方法

    在ghost win7系统下打开我的电脑时,大家可以看到的一般都是磁盘.可移动存储设备等图片,但是有些用户发现在电脑上面安装了一些软件之后,就会在其他图标中多了很多软件的图标,虽然这样可以方便我们打开 ...

  9. Windows10下git bash中添加wget下载工具

    Windows10下git bash中添加wget下载工具 文章目录: 一.说明 二.wget安装包的下载 三.添加环境变量 一.说明 Windows中git bash完全可以替代原生的cmd,而且更 ...

最新文章

  1. ggplot2笔记4 语法基础
  2. kafka0.9 java commit_kafka0.9.0及0.10.0配置属性
  3. MySQL\MariaDB 多线程复制初探
  4. SAP Analytics Path Framework的filter实现原理分析
  5. javascript-排序算法
  6. python面向对象有什么用_Python 中的面向对象没有意义
  7. Intent.ACTION_PICK
  8. Spring基于注解的配置概述
  9. DHCP服务、NFS、vsftp服务的简单搭建
  10. mac 下chrome 和 微信web开发工具跨域配置
  11. Pulsar:一款功能强大的可视化网络足迹扫描平台
  12. android xml 加密,AndroidManifest.xml和MAIN.xml文件都是加密的,请问怎么解决
  13. python缓存memoryerror_Python安装会抛出大量MemoryError()的
  14. 用session做权限控制
  15. Halcon教程九:把Halcon程序放到C#程序里
  16. 未知错误 ID:-2147467259 操作必须使用一个可更新的查询
  17. 开源流媒体SRS结合硬件视频实时转码服务器的部署
  18. CSS(PS切图、学成在线案例)
  19. C++字符串转为大写/小写
  20. 如何使用python读取excel表的某一列_使用python采集Excel表中某一格数据

热门文章

  1. 十一、Oracle 触发器
  2. ios使用stream抓包
  3. ClickHouse 在爱奇艺视频生产实时数仓的应用
  4. 机器学习之线性回归(Linear Regression)算法
  5. jq和js用mousemove获取鼠标当前位置
  6. 女程序员在互联网界是否遭受了性别歧视?
  7. EXCEL2010打开phpexcel生成的excel时,显示文件已损坏,无法打开
  8. 人生没有我并不会不同--IOPS OSL个人日志(作者:V`shadow.hattie)
  9. 梦幻西游口袋版服务器信息错误,梦幻西游:合出这只宝宝的玩家很懵,藏宝阁卖不了,打书怕掉技能...
  10. lamp Discuz 论坛搭建 升级为 lnmp