mfc | mfc集成opencv,实现摄像头监控、拍照、视频图像处理(亮度、对比度、色调、饱和度)功能

这里是引用

文章目录

  • 一、开发环境
  • 二、MFC项目创建
  • 三、集成opencv
    • 3.1 opencv安装
    • 3.2 添加项目属性
    • 3.3 测试OpenCV(打开摄像头)
    • 3.4 OPENCV视频嵌入到弹框中
  • 四、关闭摄像头、拍照功能实现
    • 4.1 添加按钮
    • 4.2 添加全局静态变量
    • 4.3 关闭摄像头功能实现
    • 4.4 拍照功能实现
  • 五、视频图像处理功能实现
    • 5.1 添加滑条和编辑框控件
      • 5.1.1 添加滑条和编辑框
      • 5.1.2 滑条和编辑框控件绑定变量
      • 5.1.3 设置滑动条范围、初始值
      • 5.1.4 设置编辑框初始值
      • 5.1.5 设置滑动条值显示到编辑框中
      • 5.1.6 设置默认值
    • 5.2 亮度功能实现
  • 总结


一、开发环境

编辑器:Visual Studio2022
OpenCV版本:4.9.0

二、MFC项目创建

在这里插入图片描述
在这里插入图片描述

三、集成opencv

3.1 opencv安装

下载地址:https://opencv.org/releases/
安装:无脑下一步(记住opencv的安装路径)

3.2 添加项目属性

  1. 右键项目点击属性。在“通用属性-VC++目录-常规-包含目录”中添加%opencv%\build\include\opencv2和%opencv%\build\include,%opencv%为你自己的opencv目录。

在这里插入图片描述

  1. 在“通用属性-VC++目录-常规-库目录”中添加%opencv%\build\x64\vc15\lib,%opencv%为你自己的opencv目录
    在这里插入图片描述

  2. 在“通用属性-链接器-输入-附加依赖项”中添加%opencv%\build\x64\vc15\lib\opencv_world451d.lib,%opencv%为你自己的opencv目录。不同版本的该文件名称不同,只需要将自己版本的opencv文件夹中该文件名填入即可。要注意一定要是****d.lib,因为只有d.lib才对应的是dubug版本

在这里插入图片描述

点击应用确定。至此Opencv开发环境配置完成。

3.3 测试OpenCV(打开摄像头)

1.创建打开摄像头按钮
在这里插入图片描述
2.编辑确定按钮的代码,代码内容如下

void CopencvdemoDlg::OnBnClickedopen()
{//1.从摄像头读入视频VideoCapture cap(0);//2.循环显示每一帧while (1){Mat cam;cap >> cam;//获取当前帧图像imshow("相机", cam);//显示当前帧图像waitKey(30);//延时30秒}
}

3.添加头文件

#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui_c.h>using namespace std;
using namespace cv;

在这里插入图片描述
4.至此测试编码完成,启动项目,点击确定,界面如下:

在这里插入图片描述

3.4 OPENCV视频嵌入到弹框中

  1. 控件添加(Picture Control)
    从工具栏中选择Picture Control,拖动到窗口中,调整大小,移动到合适位置,效果如下图

在这里插入图片描述

  1. 控件ID修改
    右击控件属性,修改ID为"IDC_PIC"
    在这里插入图片描述

  2. 控件绑定变量
    右击控件,添加变量
    在这里插入图片描述

  3. 控件绑定点击事件
    点击完成后,双击按钮控件,重新编写代码,代码如下

void CopencvdemoDlg::OnBnClickedopen()
{//将opencv的窗体嵌入到页面中cv::namedWindow("picView", cv::WINDOW_AUTOSIZE);HWND hWnd = (HWND)cvGetWindowHandle("picView");HWND hParent = ::GetParent(hWnd);::SetParent(hWnd, GetDlgItem(IDC_PIC)->m_hWnd);::ShowWindow(hParent, SW_HIDE);//1.从摄像头读入视频VideoCapture cap(0);//2.循环显示每一帧while (1){Mat cam;cap >> cam;//获取当前帧图像imshow("picView", cam);//显示当前帧图像waitKey(30);//延时30秒}
}
  1. 启动项目,效果如下

在这里插入图片描述

四、关闭摄像头、拍照功能实现

4.1 添加按钮

在这里插入图片描述

ID显示文字
IDC_open打开摄像头
IDC_close关闭摄像头
IDC_photo拍照

4.2 添加全局静态变量

1.打开项目对话框的头文件(opencv_demoDlg.h),在头文件中定义静态变量
在这里插入图片描述

static bool closeFlag;		//关闭摄像头标志
static bool takePhotoFlag;	//拍照标志

2.打开项目对话框的cpp文件(opencv_demoDlg.cpp),在cpp文件中声明变量。
下图中的folderPath为全局变量,closeFlag、takePhotoFlag 两个变量为静态变量(静态变量的定义为类名::变量名)

在这里插入图片描述

//关闭监控标志
bool CopencvDemoDlg::closeFlag = false;
//拍照标志
bool CopencvDemoDlg::takePhotoFlag = false;
//图片默认存储位置
CString folerPath = L"./opencv_demo_pic/"; //相对路径

4.3 关闭摄像头功能实现

  1. 双击关闭摄像头按钮,添加如下代码
    在这里插入图片描述
void CopencvdemoDlg::OnBnClickedclose()
{// closeFlag置为true,关闭实时监控CopencvdemoDlg::closeFlag = true;
}
  1. 双击打开摄像头按钮,更改如下代码
//打开摄像头按钮
void CopencvdemoDlg::OnBnClickedopen()
{// 当用户点机实时监控,将closeFlag置为falseCopencvdemoDlg::closeFlag = false;//将opencv的窗体嵌入到页面中cv::namedWindow("picView", cv::WINDOW_AUTOSIZE);HWND hWnd = (HWND)cvGetWindowHandle("picView");HWND hParent = ::GetParent(hWnd);::SetParent(hWnd, GetDlgItem(IDC_PIC)->m_hWnd);::ShowWindow(hParent, SW_HIDE);//1.从摄像头读入视频VideoCapture cap;	// 创建视频采集对象;cap.open(0);		// 打开默认相机;if (!cap.isOpened())// 判断相机是否打开成功;{MessageBox(_T("无法连接摄像头!!!"));return;}//2.循环显示每一帧while (1){Mat cam;cap >> cam;//获取当前帧图像imshow("picView", cam);//显示当前帧图像waitKey(30);//延时30秒//如果CloseFlag为true,跳出循环,结束监控if (CopencvdemoDlg::closeFlag== true) break;}//控件PictureControl 清除显示GetDlgItem(IDC_PIC)->ShowWindow(FALSE);GetDlgItem(IDC_PIC)->ShowWindow(TRUE);cap.release();cv::destroyAllWindows();
}

至此点击运行项目,可以实现摄像头的开启和关闭功能。

4.4 拍照功能实现

  1. 双击拍照按钮,添加如下代码
void CopencvdemoDlg::OnBnClickedphoto()
{takePhotoFlag = true;
}
  1. 双击打开摄像头按钮,添加如下代码
    在这里插入图片描述
//拍照if (takePhotoFlag){//拍照状态重置takePhotoFlag = false;//生成并转换照片名称m_time = CTime::GetCurrentTime();CString m_strDateTime = folerPath + m_time.Format(_T("%Y-%m-%d-%H-%M-%S.jpg"));string name = CT2A(m_strDateTime.GetBuffer());//将Mat数据写入文件bool res = imwrite(name, cam);}

拍照功能至此完成,运行项目,点击打开摄像头后,点击拍照即可实现拍照。拍摄的照片可在工程目录下的opencv_demo_pic文件夹中查看。

在这里插入图片描述
在这里插入图片描述

五、视频图像处理功能实现

5.1 添加滑条和编辑框控件

5.1.1 添加滑条和编辑框

在这里插入图片描述
设置编辑框为只读
在这里插入图片描述

5.1.2 滑条和编辑框控件绑定变量

功能滑条ID滑条变量编辑框ID编辑框变量(值变量int)
亮度IDC_SLIDER_Brightnesss_BrightnessIDC_EDIT_Brightnessi_Brightness
对比度IDC_SLIDER_contrasts_contrastIDC_EDIT_contrasti_contrast
色调IDC_SLIDER_hues_hueIDC_EDIT_huei_hue
饱和度IDC_SLIDER_saturations_saturationIDC_EDIT_saturationi_saturation

在这里插入图片描述

5.1.3 设置滑动条范围、初始值

//设置滑动条范围
s_Brightness.SetRange(0, 255);
s_contrast.SetRange(0, 255);
s_hue.SetRange(0, 127);
s_saturation.SetRange(0, 255);//设置滑动条初始值
s_Brightness.SetPos(25);
s_contrast.SetPos(127);
s_hue.SetPos(0);
s_saturation.SetPos(127);

在这里插入图片描述

5.1.4 设置编辑框初始值

在这里插入图片描述

,i_brightness(25)
,i_contrast(127)
,i_hue(0)
,i_saturation(127)

5.1.5 设置滑动条值显示到编辑框中

将滑块数据显示到编辑框中,在【项目】-【类向导】-【消息】页面,找到消息事件函数WM_HSCROLL,双击出现在右边方框,再次双击右边方框 OnHScroll 函数
在这里插入图片描述
在弹出的消息事件函数里面,添加如下代码:

在这里插入图片描述

//消息事件
void CopencvdemoDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{// TODO: 在此添加消息处理程序代码和/或调用默认值UpdateData(TRUE);i_brightness = s_brightness.GetPos();//获得滑动块当前位置i_contrast = s_contrast.GetPos();i_hue = s_hue.GetPos();i_saturation = s_saturation.GetPos();UpdateData(FALSE);CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}

至此界面显示完成,运行项目,滑动条的值可以实时显示在编辑框中
在这里插入图片描述

5.1.6 设置默认值

双击设为默认按钮,添加如下代码

在这里插入图片描述

5.2 亮度功能实现


总结

以上就是本文要讲的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust 力扣 - 289. 生命游戏

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们记录上一行和当前行转换之后的状态&#xff0c;当前行转换之后的状态计算完毕后调整上一行状态&#xff0c;直至最后一行状态计算完毕后调整最后一行状态 题解代码 pub fn game_of_life(board: &mut V…

人工智能—机器学习-图像处理

1. 人工智能&#xff08;AI&#xff09; 定义&#xff1a;人工智能是计算机科学的一个分支&#xff0c;旨在开发能够模拟人类智能的系统&#xff0c;包括学习、推理、问题解决、感知和语言理解等能力。子领域&#xff1a; 机器学习&#xff08;ML&#xff09;&#xff1a;使计…

连续型随机变量的数字特征

本文记录连续型随机变量的分布&#xff0c;以及数字特征 均匀分布 设随机变量 X X X 在区间 [ a , b ] [a, b] [a,b] 上均匀分布&#xff0c;则其概率密度函数&#xff08;PDF&#xff09;为&#xff1a; f ( x ) { 1 b − a , if a ≤ x ≤ b 0 , otherwise f(x) \begi…

【eNSP】华为ensp快速入门实验

一、安装准备 1. 检查和卸载已安装的软件 检查是否已经安装 eNSP 和依赖软件&#xff1a; 打开控制面板&#xff0c;点击“程序和功能”。 搜索列表中是否存在 eNSP 或依赖软件&#xff08;如 WinPcap、Wireshark&#xff09;。 卸载已安装的软件&#xff1a; 如果找到 e…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划&#xff1a; 资源准备 虚拟机软件&#xff1a;就别自己找了 现在换网站了 下载比较费劲 Centos8&#xff1a; 阿里云镜像地址下载&#xff08;下载比较版 但是有不同版本&#xff09;&#xff1a;centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

Java项目:165 springboot人事管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 人事管理系统分为管理员和用户两部分操作角色 本次开发的人事管理系统实现了财务报销管理、字典管理、试卷表管理、试题表管理、考试记录表管理、答题…

计算机存储单元bit。不同编程语言类型差异。

计算机存储单元bit 大部分计算机最小内存操作单元是字节&#xff0c;JE不同编程语言类型差异JEDRAM标准DQ位宽也经常按8 bits为单位。英文字母ASCII码虽然可以优化为7位&#xff0c;但7不是一个计算机的好数字&#xff0c;按8位算是最优空间。当然&#xff0c;CPU也有提供位操作…

代码训练营 day53|LeetCode 42,LeetCode 84

前言 这里记录一下陈菜菜的刷题记录&#xff0c;主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕&#xff0c;一年车企软件开发经验 代码能力&#xff1a;有待提高 常用语言&#xff1a;C 系列文章目录 第53天 &#xff1a;第十章 单调栈part02 文章目录 前言系列文…

单臂路由实现不同VLAN之间设备通信

转载请注明出处 本实验为单臂路由配置&#xff0c;目的为让不同VLAN之间的设备能够互相通信。 1.首先&#xff0c;按照要求配置两个pc的ip地址&#xff0c;以pc0为例子&#xff1a; 2在交换机创建vlan10和vlan20 3.划分vlan&#xff0c;pc0为vlan10的设备&#xff0c;pc1为vla…

【FL0013】基于SpringBoot和微信小程序的机电公司管理信息系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…

Vue3里抽离公共模块进行封装然后通过Vue进行调取

概述 直接使用引入也不是不可以直接进行调取,但是如果想走vue的话下面是解决方案 声明需要被插入的模块 //这里是要被插入的模块 import * as server from "@/axios/server"; //写入到vue里面方便后面从vue里面进行调取 export default {install(app) {app.confi…

2024保姆级微信 AI 机器人教程:如何打造私人和群聊助手

欢迎点击领取 -《前端开发面试题进阶秘籍》&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 大家好&#xff0c;我是SunnyRun 微信 AI 机器人-人工智能技术&#xff0c;为用户提供服务的自动化系统&#xff1a;具备自然语言处理能…

Android——动态注册广播

BroadcastReceiver 发送一条广播&#xff0c;可以被不同的广播接收者所接收&#xff0c;广播接收者收到广播后再进行逻辑判断。 标准广播 通过 new BroadcastReceiver() 创建广播 通过 registerReceiver() 注册广播 通过 sendBroadcast() 发送广播 通过 unregisterReceiver(…

HyperWorks进阶教程:Altair及其软件介绍

1.1 Altair 简介 Allair是一家全球技术公司&#xff0c;在产品开发、高性能计算和数据智能领域提供软件和云解决方案自1985年成立以来一直致力于为企业的决策者和技术的执行者开发用于仿真分析、优化、信息可视化、流程自动化和云计算的高端技术。Altair 公司的总部位于美国密…

Halcon3D image_points_to_world_plane详解

分三个部分来聊聊这个算子 一,算子的参数介绍 二,算法的计算过程 三,举例实现 第一部分,算子的介绍 image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 参数介绍: CameraParam,:相机内参 WorldPose 世界坐标系,也叫物体坐标系(成…

使用GetX实现GetPage中间件

前言 GetX 中间件&#xff08;Middleware&#xff09;是 GetX 框架中的一种机制&#xff0c;用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件&#xff0c;可以有效地控制用户的访问流程&#xff0c;并在适当条件下引导用户到所需页面。 这…

【人工智能-初级】练习题:matplotlib基础练习30例

文章目录 练习 1: 画折线图练习 2: 画散点图练习 3: 画柱状图练习 4: 画饼图练习 5: 画直方图练习 6: 使用不同线型画折线图练习 7: 多条折线练习 8: 用不同颜色画散点图练习 9: 画堆叠柱状图练习 10: 画带网格的图练习 11: 画带标签的散点图练习 12: 画等高线图练习 13: 在图中…

[java][基础]HTTPTomcatServlet

1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东、传智官网等这些网站&#xff0c;这些网站统称为Web网站。如下就是通…

CUDA环境安装终极指南——Linux(其它系统也一样)

文章目录 前言检查驱动配置nvcc安装cudnn完活 前言 不用看其它文章了&#xff0c;这篇文章保你不踩任何坑&#xff0c;安装方法简单快速 检查驱动 检查驱动是否安装&#xff0c;输入以下命令 nvidia-smi如果驱动已经安装&#xff0c;则可跳过此步&#xff0c;否则&#xff…

基于MATLAB的身份证号码识别系统

课题介绍 本课题为基于连通域分割和模板匹配的二代居民身份证号码识别系统&#xff0c;带有一个GUI人机交互界面。可以识别数十张身份证图片。 首先从身份证图像上获取0&#xff5e;9和X共十一个号码字符的样本图像作为后续识别的字符库样本&#xff0c;其次将待测身份证图像…