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.xdnf.cn/news/1468.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

面试题:Vue生命周期

Vue生命周期 一、是什么二、Vue2生命周期三、Vue2生命周期整体流程四、Vue3生命周期 一、是什么 Vue中的实例从创建到销毁的过程就是生命周期&#xff0c;即指从创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程 二、Vue2生命周期 Vue2生命周期总共…

元宇宙VR展会突破传统会展局限,打造会展新生态与商业新机遇

一、身临其境感受会展新境界 元宇宙VR展会利用虚拟现实技术&#xff0c;为参会用户打造了一个高度还原的虚拟会展空间。用户只需使用手机、平板、电脑等设备&#xff0c;即可瞬间穿越至展会现场&#xff0c;仿佛置身于真实的会展环境中。 在这里&#xff0c;用户可以自由浏览…

[每周一更]-(第121期):模拟面试|微服务架构面试思路解析

这一系列针对Go面试题整理,仅供参考 文章目录 00|综合服务治理方案:怎么保证微服务应用的高可用?1. **什么是微服务架构?**2. **怎么保证微服务架构的高可用?**3. **怎么判定服务是否已经健康?**4. **如果服务不健康该怎么办?**5. **怎么判定服务已经从不健康状态恢复过…

【产品经理】工业互联网企业上市之路

树根互联2022年6月2日提交招股书之后&#xff0c;因财务资料超过六个月有效期加三个月延长期&#xff0c;2022年9月30日上市审核中止&#xff1b;2022年12月26日树根互联更新了2022年半年度财务资料&#xff0c;又九个月过去了&#xff0c;其上市进程将面临再一次中止。 处于上…

AI图像相似性搜索对比:VIT, CLIP, DINO-v2, BLIP-2

图像相似性搜索的核心在于一个简单的想法&#xff1a;图像可以表示为高维空间中的向量。当两个图像相似时&#xff0c;它们的向量应该在这个空间中占据相似的位置。我们可以通过测量角度&#xff08;或余弦相似度&#xff09;来确定这些向量的相似程度。如果角度小&#xff0c;…

AI风险及数据合规问题

一、数据来源合规问题 1、请说明发行人采集数据时是否获得了相关信息主体及用户的合法授权&#xff0c;获取用户数据的手段及方式是否合法合规; 2、请说明发行人获取用户数据及标签的过程及方法&#xff0c;是否对用户有明示提示&#xff0c;用户授权在法律上是否完备&#xff…

yoloV5实战笔记—环境搭建(一)

一、安装miniconda 从清华源进行下载 https://mirrors.tuna.tsinghua.edu.cn/ 具体命令参考&#xff0c;注意修改pip国内镜像地址 https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 创建环境&#xff0c;指定python版本 conda create -n demo python3.9激活环境 conda acti…

Docker:存储原理

Docker&#xff1a;存储原理 镜像联合文件系统overlay镜像存储结构容器存储结构 存储卷绑定挂载存储卷结构 镜像 联合文件系统 联合文件系统Union File System是一种分层&#xff0c;轻量且高效的文件系统。其将整个文件系统分为多个层&#xff0c;层与层之间进行覆盖&#x…

【源码+文档】基于SpringBoot的养老院管理系统

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…

LVGL UI设计神器助你高效开发嵌入式UI应用——v0.16.0发布

文章目录 Preface一、What is Anyui&#xff1f;二、Features of v0.16.0 releaseSum up Preface As coming of Internet of Things, the “screen reading” era predicted by Kevin Kelly has also arrived. Besides products like mobile phones and tablets which are PC-…

JavaFx -- chapter06(UDPSocket)

chapter06(UDPSocket) UPD的特点 UDP有独立的套接字&#xff08;IP PORT&#xff09;&#xff0c;与TCP使用相同端口号不会冲突。UDP在使用前不需要进行连接&#xff0c;没有流的概念。UDP通信类似于邮件通信&#xff1a;不需要实时连接&#xff0c;只需要目的地址。UDP通信…

爬虫学习2

数据解析 正则表达式 量词&#xff1a; import re#searcch只会匹配到第一次匹配的内容#result re.search(r"\d","今年32")#print(result.group()) #result re.findall(r"\d","我是一个abcdeafg") #print(result)#search只会匹配到第…

radio astronomy 2

地球上的电离层会被太阳风影响。

服务器作业(2)

架设一台NFS服务器&#xff0c;并按照以下要求配置 关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 配置文件设置&#xff1a; [rootlocalhost ~]# vim /etc/exports 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 共享…

基于MATLAB多参数结合火焰识别系统

一、课题介绍 本设计为基于MATLAB的火焰烟雾火灾检测系统。传统的采用颜色的方法&#xff0c;误识别大&#xff0c;局限性强。结合火焰是实时动态跳跃的&#xff0c;采用面积增长率&#xff0c;角点和圆形度三个维度相结合的方式判断是否有火焰。该设计测试对象为视频&#xf…

云轴科技ZStack在CID大会上分享VF网卡热迁移技术

近日&#xff0c;2024中国云计算基础架构开发者大会&#xff08;以下简称CID大会&#xff09;在北京举行。此次大会集中展示了云计算基础架构技术领域最前沿的科创成果&#xff0c;汇聚众多的技术专家和行业先锋&#xff0c;共同探讨云计算基础设施的最新发展和未来趋势。云轴科…

阿里云 K8S ACK服务 创建使用教程

目录 1.1 阿里云容器服务ACK介绍和创建 1.1.1 什么是容器服务Kubernetes版? 1.1.2 创建专有版Kubernetes集群 1.1.3 访问专有版Kubernetes集群 1.1.4 在专有版ACK集群创建资源并访问 通过百度网盘分享的文件&#xff1a;第12章-阿里云托管k8s集群ACK创建和使用 链接&…

H5测试点总结

一、概述 1.1 什么是H5 H5 即 HTML5&#xff0c;是最新的 Web 端开发语言版本&#xff0c;现如今&#xff0c;大多数手机 APP 页面会用 H5 实现&#xff0c;包括 PC Web 站点也会用它开发实现。所以 Web 的通用测试点和方法基本都可以适用于它。H5其实就是&#xff1a;移动端…

TapData 发布官方性能测试报告,针对各流行数据源,在多项指标中表现拔群

近日&#xff0c;TapData 官方发布了最新的性能测试报告&#xff0c;该报告详细展示了 TapData v3.5.13 在各种数据源下的性能表现&#xff0c;包括全量同步、增量同步、读写延迟等关键性能指标。 随着企业对实时数据集成和处理能力需求的提升&#xff0c;TapData 凭借其高效、…

小红书发布IP与实际不一样?揭秘背后的原因与应对策略

在小红书这个充满活力的社交平台上&#xff0c;用户们经常分享着各自的生活点滴、购物心得、美食体验等丰富内容。然而&#xff0c;有时你可能会发现&#xff0c;小红书上显示的IP地址与你的实际所在地并不一致&#xff0c;这不禁让人心性疑惑。那么&#xff0c;小红书发布IP与…