第11课 实现桌面与摄像头叠加

在上一节,我们实现了桌面捕获功能,并成功把桌面图像和麦克风声音发送给对方。在实际应用中,有时候会需要把桌面与摄像头图像叠加在一起发送,这节课我们就来看下如何实现这一功能。

1.备份与修改

备份demo10并修改demo10为demo11.

2.用新队列存放叠加前的图像数据

修改原函数capCam和capScr,用新的inCamQue和inScrQue存放摄像头和桌面图像Mat:


int fmle::capCam() {videoCap.open(0);cv::Mat camMat;while (true){if (!videoCap.isOpened()){Sleep(1);continue;}BOOL ifSuccess = videoCap.read(camMat);if (camMat.empty()){Sleep(1);continue;}if (camMat.cols != backWidth || camMat.rows != backHeight){resize(camMat, camMat, cv::Size(backWidth, backHeight));}if (!camMat.empty()){			EnterCriticalSection(&videoQueLock);tmpVideoQueObj.type = 1;tmpVideoQueObj.tmpMat = camMat;tmpVideoQueObj.dataLen = camMat.cols*camMat.rows * 3;inCamQue.push(tmpVideoQueObj);if (inCamQue.size() >videoDataArrNum){inCamQue.front().dataLen = 0;inCamQue.front().tmpMat.release();inCamQue.front().dataLen = NULL;inCamQue.pop();}LeaveCriticalSection(&videoQueLock);}Sleep(40);}camMat.release();return 0;
}int fmle::capScr(){HWND hwnd = GetDesktopWindow();cv::Mat scrMat;while (true){scrMat = hwndToMat(hwnd);        if (scrMat.cols != backWidth || scrMat.rows != backHeight){resize(scrMat, scrMat, cv::Size(backWidth, backHeight));}if (scrMat.data&&!scrMat.empty()){        cvtColor(scrMat, scrMat, CV_BGRA2BGR);//mainDlg->drawMatOfPub(scrMat);EnterCriticalSection(&videoQueLock);tmpVideoQueObj.type = 1;tmpVideoQueObj.tmpMat = scrMat;tmpVideoQueObj.dataLen = scrMat.cols*scrMat.rows * 3;inScrQue.push(tmpVideoQueObj);if (inScrQue.size() >videoDataArrNum){inScrQue.front().dataLen = 0;inScrQue.front().tmpMat.release();inScrQue.front().dataLen = NULL;inScrQue.pop();}LeaveCriticalSection(&videoQueLock);}Sleep(40);}scrMat.release();    return 0;
}

3.分别从桌面和摄像头队列取数据并叠加

新建一线程,调用mixVideo实现桌面和摄像头图像的叠加

int fmle::mixVideo(){cv::Mat camMat, scrMat, imageROI;while (true){if (inScrQue.size() > 0 && inCamQue.size() > 0){EnterCriticalSection(&videoQueLock);camMat = inCamQue.front().tmpMat.clone();resize(camMat, camMat, cv::Size(120, 80));scrMat = inScrQue.front().tmpMat.clone();if (!camMat.empty() && !scrMat.empty()){imageROI = scrMat(cv::Rect(0, 0, camMat.cols, camMat.rows));addWeighted(imageROI, 0, camMat, 1, 0.0, imageROI);mainDlg->drawMatOfPub(scrMat);}camMat.release();scrMat.release();imageROI.release();LeaveCriticalSection(&videoQueLock);}Sleep(40);}return 0;
}

4.调试运行

效果如下:

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

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

相关文章

前端跨域问题的解决思路

目录 前言 跨域问题的解决思路 一般跨域的解决方案 前言 做了一个简单页面,做了一些数据埋点,想通过企业微信机器人来推送数据,遇到了一些问题,顺便记录下。 跨域问题的解决思路 由于是项目比较简单,直接使用了aj…

《Effective C++》《Resource Management》

文章目录 13、term13:Use objects to manage resources14、term14:Think carefully about copying behavior in resource-managing classes15、term15:Provide access to raw resources in resource-managing classes法一: 使用智能指针的get进行显示转换法二&#…

Redis 连接 命令

目录 1.Redis Echo 命令 - 打印字符串简介语法可用版本: > 1.0.0返回值: 返回字符串本身。 示例 2.Redis Select 命令 - 切换到指定的数据库简介语法可用版本: > 1.0.0返回值: 总是返回 OK 。 示例 3.Redis Ping 命令 - 查看服务是否运行简介语法可用版本: > 1.0.0返回…

Apache 网页优化

目录 1.网页压缩与缓存 1.1 网页压缩 1. gzip 介绍 2. Http的压缩过程 3. Apache的压缩模块 4. mod_deflate模块 1.2 网页缓存 1. 配置 mod_expires 模块启用 2. 隐藏版本信息 2.1 配置Apache隐藏版本信息 2.2 Apache 防盗链 1. 配置防盗链 2.检查是否安装mod_re…

景联文科技GPT教育题库:AI教育大模型的强大数据引擎

GPT-4发布后,美国奥数队总教练、卡耐基梅隆大学数学系教授罗博认为,这个几乎是用“刷题”方式喂大的AI教育大模型的到来,意味着人类的刷题时代即将退出历史舞台。 未来教育将更加注重学生的个性化需求和多元化发展,借助GPT和AI教育…

你想过在 C++ 中使用契约和反射特性吗?

以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/fOEG22dQqKSpsZmk8z6w6g ISO/IEC C 技术委员会主持人 Herb Sutter 报告称,C26 将具有新的功能,包括契约和反射。 该委员会…

Java异常简单介绍

文章目录 1. 异常分类和关键字1.1 分类1.2 关键字 2. Error2.1 Error定义2.2 常见的Error2.2.1 VirtualMachineError2.2.2 ThreadDeath2.2.3 LinkageError2.2.4 AssertionError2.2.5 InternalError2.2.6 OutOfMemoryError2.2.6.1 OOM原因2.2.6.2 OutOfMemoryError会导致宕机吗 …

大创项目推荐 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐…

Leetcode算法系列| 11. 盛最多水的容器

目录 1.题目2.题解C# 解法一:暴力C# 解法二:双指针(左指针大于右指针,left)C# 解法三:双指针优化(左指针小于等于最小高度,left)Java 解法一:双指针Python3 解…

经常使用耳机对耳朵听力有影响吗?戴哪种耳机不伤耳朵听力?

经常使用耳机容易引起末梢感受器官受损,可能造成内耳功能损伤,出现耳聋、耳鸣等听力的适应性下降的症状,建议使用耳机时间不要过长,并且音量不要过大。如果想保护听力的话,建议选择骨传导耳机,骨传导耳机通…

单片机快速入门

参考连接: 安装MinGW-64(在win10上搭建C/C开发环境)https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码:y1mz --来自百度网盘超级会员V7的分享C…

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考: building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack (主)作者思路:https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

低成本总线技术——LIN总线协议规范介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”,即可获得canoe入门到精通电子书和INCA软件安装包(不带授权码)下载地址。 本篇文章主要介绍LIN总线协议规范。 数据帧的结构 LIN的数据帧包括报头,响应两大部分。而报头…

Visual Studio 2013 “即将退休”

新年快乐! 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio,我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

浏览器是如何渲染页面的

浏览器是个极其复杂的程序,这里只是挑几个和前端息息相关的重要内容来说 在学习如何渲染之前需要知道一个浏览器浏览器会有多个进程,其中主要进程有浏览器进程,网络进程,渲染进程这里我们主要学习内容就发生在渲染进程。当渲染进程…

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址:https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台,与xxl-job一样,基于web页面实现任务调度配置与记录,使用简单,上手快速,其主要功能特性如下: 使用简单&…

如何在 Windows 上从电脑硬盘恢复照片

如今,随着相机设备的普及,您可以轻松地一次拍摄一堆照片,将它们传输到硬盘上,然后再拍摄更多照片。但是,如果您的所有照片意外丢失在驱动器中怎么办?你能恢复它们吗? 在本指南中,我…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序,它不会往源驱上写任何东西,也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、…