基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
//打开摄像头,nCamID指定打开哪个摄像头,取值可以为0,1,2,... //bDisplayProperties指示是否自动弹出摄像头属性页 //nWidth和nHeight设置的摄像头的宽和高,如果摄像头不支持所设定的宽度和高度,则返回false boolCCameraDS::OpenCamera(int nCamID,bool bDisplayProperties=true,int nWidth=320,int nHeight=240); //关闭摄像头,析构函数会自动调用这个函数 voidCloseCamera(); //返回摄像头的数目 //可以不用创建CCameraDS实例,采用int c=CCameraDS::CameraCount();得到结果。 staticintCameraCount(); //根据摄像头的编号返回摄像头的名字 //nCamID: 摄像头编号 //sName: 用于存放摄像头名字的数组 //nBufferSize: sName的大小 //可以不用创建CCameraDS实例,采用CCameraDS::CameraName();得到结果。 staticintCCameraDS::CameraName(int nCamID,char* sName,int nBufferSize); //返回图像宽度 intGetWidth(){return m_nWidth;} //返回图像高度 intGetHeight(){return m_nHeight;} //抓取一帧,返回的IplImage不可手动释放! //返回图像数据的为RGB模式的Top-down(第一个字节为左上角像素),即IplImage::origin=0(IPL_ORIGIN_TL) IplImage*QueryFrame(); voidDisplayPinProperties(void);
CvvImage cimg; IplImage cpy = dst; cimg.CopyOf(&cpy );// 复制图片 cimg.DrawToHDC( hDC,&rect );// 将图片绘制到显示控件的指定区域内
//摄像头显示循环 DWORD WINAPI CaptureThread(LPVOID lpParameter) { CGOMfcTemplate2Dlg* pDlg =(CGOMfcTemplate2Dlg*)lpParameter; while(true) { IplImage* queryframe = pDlg->cameraDs.QueryFrame(); Mat matframe(queryframe);//iplimage到Mat转化 if(pDlg->b_closeCam)//退出循环 break; if(pDlg->b_takeApic ) { pDlg->b_takeApic =false; pDlg->m_mainframe = matframe; Sleep(500); } pDlg->showImage(matframe,IDC_CAM); } return0; }
m_nCamCount =CCameraDS::CameraCount();//摄像头总数 //获得摄像头数目 char camera_name[1024]; char istr[25]; for(int i=0; i < m_nCamCount; i++) { int retval =CCameraDS::CameraName(i, camera_name,sizeof(camera_name)); sprintf_s(istr," # %d", i); strcat_s(camera_name,istr ); CString camstr = camera_name; if(retval >0) m_CBNCamList.AddString(camstr); else AfxMessageBox(_T("不能获取摄像头的名称")); } //初始化显示控件 CRect rect; GetDlgItem(IDC_CAM)->GetClientRect(&rect); m_mainframe =Mat::zeros(rect.Height(),rect.Width(),CV_8UC3); GetDlgItem(IDC_PIC)->GetClientRect(&rect); m_takepic =Mat::zeros(rect.Height(),rect.Width(),CV_8UC3); return TRUE;// 除非将焦点设置到控件,否则返回 TRUE
voidCGOMfcTemplate2Dlg::OnBnClickedBtnOpencam() { if(m_nCamCount>=1)//开视频捕获线程 { HANDLE hThread = NULL; DWORD dwThreadID =0; OnBnClickedBtnClosecam();//首先关闭现有摄像头 bool bret = cameraDs.OpenCamera(m_iCamNum,false,640,480);//尝试打开摄像头 if(bret) { b_closeCam =false; hThread =CreateThread(NULL,0,CaptureThread,this,0,&dwThreadID); } } else { AfxMessageBox(_T("请确认至少有摄像头连上了")); } }
voidCGOMfcTemplate2Dlg::OnBnClickedBtnClosecam() { //尝试关闭摄像头 b_closeCam =true; Sleep(100); cameraDs.CloseCamera(); }
voidCGOMfcTemplate2Dlg::OnBnClickedBtnTakepic() { b_takeApic =true; Sleep(100); if(m_mainframe.rows >0) { showImage(m_mainframe,IDC_PIC); } }
voidCGOMfcTemplate2Dlg::showImage(Mat& src, UINT ID) { if(src.empty()) return; CRect rect; Mat dst = src.clone(); GetDlgItem(ID)->GetClientRect(&rect );// 获取控件尺寸位置 if(dst.channels()==1) cvtColor(dst, dst, CV_GRAY2BGR); CDC* pDC =GetDlgItem( ID )->GetDC(); HDC hDC = pDC ->GetSafeHdc();// 获取 HDC(设备句柄) 来进行绘图操作 CvvImage cimg; IplImage cpy = dst; cimg.CopyOf(&cpy );// 复制图片 cimg.DrawToHDC( hDC,&rect );// 将图片绘制到显示控件的指定区域内 ReleaseDC( pDC ); }
[p.s]2016年10月7日 经过对directshow的简单学习,主要参考了ampcap(vs2012+win7可运行版本 https://git.coding.net/jsxyhelu/AMCa_win7vs2012.git ),解决了摄像头的属性操作问题,同时也想办法解决了分辨率设置问题。在usb摄像头上和工业摄像头上测试都没有问题。
[p.s]我自己在新装的机器上测试框架,不会出现需要direct头文件的情况,但是可能由于操作系统版本不一样,有一些操作系统还是需要头文件的。链接:https://pan.baidu.com/s/1qXNgzOo direct 为完整版本下载,如果连接失败了请及时联系我。感谢。
基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新相关推荐
- 基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
在Linux操作系统上,编写带界面的图像处理程序,选择opencv+QT是一种很好的选择.GoQTtemplate3是我为编写Linux下图像处理程序实现的框架,希望能够为大家解决Linux环境下桌面 ...
- 【第十一届泰迪杯数据挖掘挑战赛】A 题:新冠疫情防控数据的分析 思路+代码(持续更新)
[第十一届泰迪杯数据挖掘挑战赛]A 题:新冠疫情防控数据的分析 思路+代码(持续更新) 问题背景 解决问题 代码下载 数据分析 Task1 Task2 Task 3 问题背景 自 2019 年底至今, ...
- M通用版代码规范 - 持续更新
文章目录 M通用版代码规范 - 持续更新 变量 方法 类 锁 事务 陷阱 格式 空行 注释 M通用版代码规范 - 持续更新 变量 代码中的命名均不能$.#等特殊符号开始或结束,因为$.#等是系统方法. ...
- 【opencv】基于opencv实现人脸识别,原理代码部分
上一部分我们解决了环境问题,这一部分我们可以开始上代码,环境没有配好的可以参照上一篇博客:环境搭建解决: 下面先说一下原理: 一.原理部分 本文基于opencv来实现人脸识别,大致实现流程可以描述 ...
- 基于opencv与MFC实现的双人五子棋
之所以给他取名双人五子棋,是因为这个程序实现的功能并不具备AI(人机对弈)功能,只能由两个玩家自己操作,棋盘显示部分是基于opencv实现的. 其实只是一个很简单的程序,如果说有些难度的话,就是在棋盘 ...
- FC金手指代码大全·持续更新-亲测可用-FC 经典游戏完整可用的金手指大全---持续更新,偶尔玩玩经典回味无穷,小时候不能通关的现在通通通关一遍
FC 经典游戏完整可用的金手指大全-持续更新,偶尔玩玩经典回味无穷,小时候不能通关的现在通通通关一遍 2021年5月11日更新: 每次翻金手指一些垃圾小网站标题党吸引进去吓一大堆木马什么也没有,什么x ...
- 商业数据分析模型及其核心Python代码_持续更新
商业数据分析模型_持续更新 一.AARRR模型 二.PEST模型 理论 医美行业应用案例 三.RFM模型 理论 Python实战_核心指标计算 四.SWOT模型 五.5W1H模型 六.流程拆解法 七. ...
- 基于opencv的车牌识别解析与代码
Jeremy Lin @HQU 车牌识别太出名了,我也就花几天来了解下这个系统,并结合opencv进行实现.下面是一些介绍: 车辆牌照识别(License Plate Recognition,LPR) ...
- 基于OpenCV实现的图像油画效果代码(高效率、低耗时的C++代码-带详细注释)
油画的特点是其颜色值很有限,并且笔比较粗,所以我们要实现油画效果关键就是利用运算实现这两点. 本文实现的图像油画效果代码原理如下: 一.将原图进行灰度化处理后将灰度值线性压缩到0~level,得到图像 ...
最新文章
- UVA1388 Graveyard(思维、数学推理)
- 前Oracle首席工程师怒喷:MySQL 是“超烂的数据库”,建议考虑 PostgreSQL
- python语言命令大全-Linux命令大全
- 里面有面和点_鲜虾韭菜水晶饺,皮薄馅大,晶莹剔透,一不小心就变成了面点高手...
- 前端QRCode.js生成二维码插件
- Vue 阻止事件冒泡
- 在jsp文件中通过超链接访问servlet_Eclipse中创建Servlet
- cocos2d里面如何实现MVC(一)
- 代码里配置java代理
- mybatis oracle 多条件批量删除_面试官经常喜欢问的Mybatis经典面试题,值得好好收藏哦!...
- (3)《Head First HTML与CSS》学习笔记---CSS入门
- 用友通总账问题维护精粹
- kubernetes v1.11 生产环境 二进制部署 全过程
- contents()与children()的用法和区别
- PDF如何修改文件字体大小
- 从公司角度来看,为什么要招实习生?
- 7-1 sdust-Java-字符串集合求并集 (20 分)
- 大型系统存储层迁移实践
- 存储模型之虚拟存储技术
- python调用函数示例_Python使用execjs运行JS函数示例,python,execJS,例子