MFC通过opencv显示摄像头

合集下载

opencv获取IP摄像头(IP-camera)实时视频流

opencv获取IP摄像头(IP-camera)实时视频流

opencv获取IP摄像头(IP-camera)实时视频流之前讲了如何通过⽹络摄像头(web camera)获取实时视频流,但是这种⽅法的缺陷就是摄像头和主机必须连在⼀起,那这种在室外部署的时候就会⾮常⿇烦并且不安全,所以后来找了下⽤海康威视或者⼤华的监控摄像头,然后通过IP地址可以⽆线获取视频流,这样就实现了主机和摄像头分开,⽅便部署。

1.设备这⾥⽤的是海康的鱼眼摄像头,型号是DS-2CD3955FWD-IWS,其实基本上能⽀持sdk⼆次开发的IP摄像头都可以()。

鱼眼摄像头相⽐普通的摄像头经过扭曲,因此在应⽤的时候⼀般需要进⾏反扭曲,这⼀步会造成⽐较⼤的延迟,因此没有不是特定需求的话尽量使⽤普通的就可以。

注:海康的萤⽯系列貌似并不能通过RTSP地址获取,⽽这⾥的⽅法需要⽤RTSP进⾏视频流获取,所以⽆法萤⽯系列就不在此列。

2.通过RTSP地址获取视频流⾸先需要知道海康设备的RTSP地址,可以通过进⾏查看。

import cv2source = ""rtsp://admin:12345@192.168.1.64/Streaming/Channels/1"注: admin和12345分别是ip camera的⽤户名和密码,在浏览器上第⼀次登录摄像头的时候会进⾏设置;192.168.1.64是摄像头的默认IP,在浏览器中输⼊即可进⼊登录页⾯(如下);Channels/1和Channels/2分别对应主码流和⼦码流地址,两者的分辨率不同。

IP摄像头⽆法通过opencv调节分辨率,只能在海康的监控界⾯的配置进⾏设置(如下)。

3. 摄像头校准(calibration)(optional)这个配置有很多,⽽且官⽅提供的校准⽂档很详细(戳),就不具体细讲了。

需要python版本的代码的话可以直接fork;如果是c++版本的话可以参考参考。

MFC中opencv读取显示图片

MFC中opencv读取显示图片

openCV读取、显示、处理图像比较方便,但是整体界面设计以及鼠标、键盘事件响应比较弱。

将MFC这方面的功能和openCV结合起来。

在openCV的C++接口中(2.2及以后),图像都用cv::Mat存储,但是可以使用openCV 已经做好的重载运算符直接转为C版本openCV的图像类型IplImage:cv::Mat mat;IplImage img = mat;而且在上述过程中没有数据拷贝,只是新建了一个IplImage文件头。

创建一个Dialog-Based的MFC窗口作为例子,添加一个Picture Control空间,将其ID修改为IDC_RENDER。

在MFC界面中添加一个按钮用来打开文件窗口选择载入的图片(这比较简单,就不细说了);读取图片当然用的是opencv的接口了。

使用openCV的cv::Mat 读取图片之后,需要在picture control控件中将图片显示出来。

其过程是这样的:将cv::Mat 转换格式为IplImage,然后将IplImage 转换格式为CvvImage,因为CvvImage 类中有函数DrawToHDC(),可以直接完成MFC空间中的绘图。

问题是:在openCV2.2以后,这个类CvvImage 被删掉了。

解决办法,参考一些遇到相同问题的人在论坛里的讨论(网址),将CvvImage 的定义单独抠出来组成.cpp和.h。

问题解决。

最后读取并显示图片的MFC 按钮空间的反馈函数为:// load imagevoid CpicUIDlg::OnBnClickedLoadimage() {string tstring;CString tFileName;CFileDialog tDlg(TRUE);if(tDlg.DoModal() == IDOK) {tFileName = tDlg.GetPathName();tstring = tFileName.GetBuffer(0);}mat = cv::imread(tstring, 1);if(! mat.data) {MessageBox("error", "no image loaded!", MB_OK);return;}CDC* pDC = GetDlgItem(IDC_RENDER)->GetDC();HDC hDC = pDC->GetSafeHdc();IplImage img = mat;CvvImage cimg;cimg.CopyOf( &img );CRect rect;GetDlgItem(IDC_RENDER)->GetClientRect(&rect);cimg.DrawToHDC(hDC, &rect);ReleaseDC( pDC );}CvvImage.cpp和CvvImage.h,参见上面链接的openCV论坛帖子。

mfc中使用opencv获取摄像头视频并显示

mfc中使用opencv获取摄像头视频并显示

一、使用DirectShow获取摄像头视频DirectShow在V isual Studio 2005开发环境下的使用说明:1.将CameraDS.h CameraDS.cpp复制到你的项目中;2.将DirectShow复制到你的opencv根目录下,菜单工具->选项->项目和解决方案->vc++目录,把..(你的opencv安装目录)/DirectShow/Include添加到“包含文件”中;3.菜单工具->选项->项目和解决方案->vc++目录,把..(你的opencv安装目录)/DirectShow/Lib添加到“库文件”下面。

获取摄像视频:利用CameraDS的OpenCamera函数打开摄像头,利用QueryFrame获取每一帧。

二、使用CvvImage类显示摄像头视频opencv的较高版本中没有CvvImage类,因此需要手动添加这个类的头文件CvvImage.h 和代码文件CvvImage.cpp。

mfc界面添加一个picture控件,ID为IDC_VIEW1。

在对话框头文件中定义如下变量:CRect rect1;CStatic* pStc1;CDC* pDC1;HDC hDC1;在对话框源文件OnInitDialog中初始化变量:pStc1=(CStatic *)GetDlgItem(IDC_VIEW1);pStc1->GetClientRect(&rect1);pDC1=pStc1->GetDC();hDC1=pDC1->GetSafeHdc();显示视频:CvvImage m_CvvImage;m_CvvImage.CopyOf(frame,frame->nChannels); //frame是视频帧m_CvvImage.DrawToHDC(dlg->hDC1, &dlg->rect1);。

pythonopencv捕获摄像头并显示内容的实现

pythonopencv捕获摄像头并显示内容的实现

pythonopencv捕获摄像头并显⽰内容的实现1、捕获摄像头和实时显⽰import cv2import numpy as npimport pickleimport matplotlib.pyplot as pltcap = cv2.VideoCapture(0)while True:ret,frame = cap.read()# Our operations on the frame come heregray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# Display the resulting framecv2.imshow('frame',gray)if cv2.waitKey(1) & 0xFF == ord('q'):break# When everything done, release the capturecap.release()cv2.destroyAllWindows()2、从摄像头内抓拍图⽚import cv2import numpy as npimport pickleimport matplotlib.pyplot as pltcap = cv2.VideoCapture(0)index = 0while True:ret,frame = cap.read()# Our operations on the frame come heregray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# Display the resulting framecv2.imshow('frame',gray)if cv2.waitKey(1) & 0xFF == ord('p'):cv2.imwrite("kk.jpg",frame)index = index + 1if cv2.waitKey(1) & 0xFF == ord('q'):break# When everything done, release the capturecap.release()cv2.destroyAllWindows()补充:python-----从本地摄像头和⽹络摄像头截取图⽚import cv2# 获取本地摄像头# folder_path 截取图⽚的存储⽬录def get_img_from_camera_local(folder_path):cap = cv2.VideoCapture(0)i = 1while True:ret, frame = cap.read()cv2.imshow("capture", frame)print str(i)cv2.imwrite(folder_path + str(i) + '.jpg', frame) # 存储为图像if cv2.waitKey(1) & 0xFF == ord('q'):breaki += 1cap.release()cv2.destroyAllWindows()# 获取⽹络摄像头,格式:rtsp://username:pwd@ip/# folder_path 截取图⽚的存储⽬录def get_img_from_camera_net(folder_path):cap = cv2.VideoCapture('rtsp://username:pwd@ip/')i = 1while True:ret, frame = cap.read()cv2.imshow("capture", frame)print str(i)cv2.imwrite(folder_path + str(i) + '.jpg', frame) # 存储为图像if cv2.waitKey(1) & 0xFF == ord('q'):breaki += 1cap.release()cv2.destroyAllWindows()# 测试if __name__ == '__main__':folder_path = 'D:\\img_from_camera\\'get_img_from_camera_local(folder_path)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

OpenCV和MFC结合编程例子新

OpenCV和MFC结合编程例子新

下面是一个简单的应用OpenCV和MFC结合编程的例子。

(1)成立一个基于Dialog的MFC工程OpenCV_Dlg1,在头文件中加入“#include <>”,
过Edit控件IDC_EDIT_TH,用户能够输入图像分割阈值,程序会将其自动更新到,int,
(7)添加Edit控件,ID号为IDC_EDIT_TH2,应用向导工具MFC ClassWizard给该ID
至此,当点击“读图”按钮打开一幅图片,该图片将在Picture控件中显示;在Edit控件IDC_EDIT_TH中输入阈值,并点击“阈值分割”按钮,则对读入的图像做二值化处置,处置结果在一个新弹出窗口中显示。

以上所编写程序是个实验性程序,从中能够反映出用OpenCV编程的一般性步骤。

但该程序仍然存在Bug:即显示在Picture控件中的图像不会重绘,也就是说若是用另外一个窗口遮挡Picture控件中的图像,当该窗口移去时被遮挡部份的图像便显示一片空白。

此问题有待对程序进一步查错。

OpenCV+MFC显示图像+视频===

OpenCV+MFC显示图像+视频===

OpenCV+MFC显示图像/视频OpenCV中文网站上有讲怎么使用OpenCV读入和显示图像和视频图像文件读入和显示:/index.php/%E5%9B%BE%E5%83%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%85%A5%E5%92%8C%E6%98%BE%E7%A4%BA读取视频文件:/index.php/%E8%AF%BB%E8%A7%86%E9%A2%91%E6%96%87%E4%BB%B6%E5%92%8C%E8%BF%90%E5%8A%A8%E7%89%A9%E4%BD%93%E6%A3%80%E6%B5%8B但它的显示是使用的OpenCV库里面的简单的GUI,用来测试验证可以,如果要做成可视化工程,还是得借助专门的GUI开发工具了。

本文简述使用MFC显示图像和视频。

1.读取并显示图像显示图像或视频使用VC中的Picture控件,用到VC图形设备接口的设备上下文(CDC类)。

比如打开显示这样一个图片lean.jpg先进行一些初始化工作,代码如下:1// DemoDlg.h2 #include <highgui.h>34//在CDemoDlg类定义中加入如下几行5private:6CRect rect;7CStatic* pStc; //标识图像显示的Picture控件8CDC* pDC; //视频显示控件设备上下文9HDC hDC; //视频显示控件设备句柄10CvCapture* capture; //视频获取结构1112//DemoDlg.cpp13 #include <cv.h>14 #include <highgui.h>15 #include <cvaux.h>16 #include <ml.h>1718//在CDemoDlg构造函数内添加以下几行,指针初始化19pStc=NULL;20pDC=NULL;21capture=NULL;2223//在CDemoDlg类的OnInitDialog()中添加如下几行,进行初始化24 BOOL CFaceDlg::OnInitDialog()25 {26//框架生成代码.......2728pStc=(CStatic *)GetDlgItem(IDC_VIEW);//IDC_VIEW为Picture控件ID29pStc->GetClientRect(&rect);//将CWind类客户区的坐标点传给矩形30pDC=pStc->GetDC(); //得到Picture控件设备上下文31hDC=pDC->GetSafeHdc(); //得到控件设备上下文的句柄3233return TRUE;34 }如上就将Picture控件的设备上下文句柄与图片/视频显示的矩形区域联系起来。

MFC中应用OpenCV教程

MFC中应用OpenCV教程

在MFC框架快速应用OpenCV版本1,作者:ollydg23日期:11/29/08Contents1创建SDI工程1 2加入OpenCV库支持2 3在Doc类中添加变量3 4添加虚函数3 5View类中添加显示图片代码4 6感谢和后记51创建SDI工程我使用的是Visual C++ 6.0,因此,本教程描述的是在VC6上面演示操作,如果您使用别的版本的VC,我想应该也差不多。

首先,按照VC的向导,产生一个默认的MFC的工程,注意,选择SDI单文档支持的,同时最好选择“use MFC As a static library”1。

1以避免一些MFC中的memory leak的问题1Figure1:VC向导,选择MFC APPWizardFigure2:VC向导,选择single document 就这样子一路下去之后,基本的MFC框架就创建完成了。

2加入OpenCV库支持现在加入openCV必须的头文件和库文件。

如下图所示,我们添加库文件:cxcore.lib cv.lib highgui.lib2Figure3:添加lib文件3在Doc类中添加变量Figure4:加入变量m image并且在开头加上HighGui.h的头文件包含,同时添加一个变量“CImage m image;”。

4添加虚函数添加两个函数,分别用来打开图片文件和保存图片文件,添加过程见下图的右键菜单。

3Figure5:右键添加虚函数如上图所示,添加虚函数,分别添加:Algorithm1打开文件BOOL CSDI OpenCVDoc::OnOpenDocument(LPCTSTR lpszPathName){ if(!CDocument::OnOpenDocument(lpszPathName))return FALSE;//TODO:Add your specialized creation code herem image.Load(lpszPathName);return TRUE;}Algorithm2保存文件BOOL CSDI OpenCVDoc::OnSaveDocument(LPCTSTR lpszPathName){ //TODO:Add your specialized code here and/orcall the base classm image.Save(lpszPathName);return CDocument::OnSaveDocument(lpszPathName);}5View类中添加显示图片代码在View类中间添加必要的图片显示代码,主要是在Ondraw里面。

MFC中使用OpenCV捕捉摄像头视频并在Image控件中播放

MFC中使用OpenCV捕捉摄像头视频并在Image控件中播放

在参加腾讯校园之星大赛中做了一些手势识别的插件,其中需要使用OpenCV相关的东西,今天将它整理一下,希望对其他人能有所帮助。

首先,OpenCV 2.1似乎不能获取设想设备的数目,名称以及其它相关属性,在实际应用中很不方便,为了解决这个问题,OpenCV论坛上YuShiQi老师给出了一个风转好的CameraDS类,通过Directshow来调用摄像头(详情请见/index.php/使用DirectShow采集图像),不过,这个类只在VC++6.0编译下通过,对于VS2005、2008和2010,需要做相应的设置,如下:1、在CameraDS.h包含头文件之上预先定义加入如下代码#define POINTER_64 __ptr642、将project ->Property-> c++ ->general->Additional Include Directories 的DirectShow/Include挪到tools->options->project and solutions->vc++ Directories->include files的文件末尾就可以了,当然也可以换成绝对目录。

问题解决后,就可以在vs2005,vs2008上编译该工程了其次,捕捉到了视频,还需要将它显示在Image控件上,这里就没有OpenCV自身所使用的UI控件那么方便了,需要自己定义Timer函数来重复调用,过程如下://打开该摄像头之前,因先检查之前是否在进行图像捕捉,若有,关闭ReleaseCapture();//打开摄像头if(!camera.OpenCamera(sgCurSelCameraIndex,false,FRAME_WIDTH,FRAME_HEI GHT))//这里使用CameraDS中的方法打开摄像头{MessageBox(_T("打开视频设备"+sgCameraName+"失败,请检查设备状态"),_T("SmartGesture插件信息"), MB_OK | MB_ICONEXCLAMATION); }SetTimer(status,30,NULL);//关键是这里,需要自己定义Timer函数去反复读取图像并将它显示出来,处理的代码会在OnTimer函数中出现SetTimer函数第一个参数是Timer的标识ID,也就是下面出现的nIDEvent。

在MFC中使用OpenCV的方法

在MFC中使用OpenCV的方法

在MFC中‎使用Ope‎nCV演示程序C‎V MFC本程序是在‎MFC 中使用 OpenC‎V的演示程序‎,由3部分组‎成。

一、Windo‎w s 下用MFC 编制的程序‎框架采用设备无‎关位图DI‎B实现Wi‎ndows‎多文档模式‎下图像的显‎示,实现显示的‎关键函数S‎tretc‎h DIBi‎t s的原型‎如下:int Stret‎c hDIB‎i ts(HDC hdc, // 显示设备句‎柄int XDest‎,// 目标矩形区‎域左上角X‎坐标int YDest‎,// 目标矩形区‎域左上角Y‎坐标int nDest‎W idth‎,// 目标矩形区‎域宽度int nDest‎H eigh‎t, // 目标矩形区‎域高度int XSrc, // 源矩形区域‎左上角X坐‎标int YSrc, // 源矩形区域‎左上角Y坐‎标int nSrcW‎i dth, // 源矩形区域‎宽度int nSrcH‎e ight‎,// 源矩形区域‎高度CONST‎VOID *lpBit‎s, // 位图的像素‎存放首地址‎CONST‎BITMA‎P INFO‎*lpBit‎s Info‎,// 位图信息存‎放地址UINT iUsag‎e, // 位图中的颜‎色类型,RGB模式‎用D IB_‎RGB_C‎O LORS‎DWORD‎dwRop‎// 像素操作码‎,简单复制用‎S R CCO‎PY);由于Ope‎nCV中的‎位图结构中‎的像素数据‎与D IB中‎的像素具有‎相同的存储‎结构,见表1中的‎像素部分。

所以,只要为它构‎造一个DI‎B的位图信‎息就可以调‎用A PI函‎数S tre‎t c hDI‎B its实‎现它的显示‎了。

表1DIB位图‎参数与Ip‎l Imag‎e结构参数‎参数DIB (MFC) IplIm‎a ge (OpenC‎V)宽度biWid‎th width‎高度biHei‎g ht heigh‎t像素位数biBit‎C ount‎ (1,4,8,16,24,32) = depth‎*nChan‎nels depth‎ (8,16,32,64)通道数--- nChan‎nels (1,2,3,4)(单通道位图‎)调色板单元‎数2biBi‎tCoun‎t(2, 16, 256)二值图像显‎示为灰阶图‎像256色彩‎色图像显示‎为真彩色图‎像位图坐标原‎点底-左origi‎n (0 顶-左,1 底-左) 像素分量存‎放方式交叉存取(按像素为单‎位存放) 0 交叉存取,1 位平面方式‎对齐方式(行像素数据‎凑整)4字节对齐‎4字节对齐‎或8字节对‎齐每行字节数‎(biWid‎th*biBit‎C ount‎+31)/32*4 width‎S tep像素字节数‎((biWid‎th*biBit‎C ount‎+31)/32*4)* biHei‎g ht image‎S ize像素存放地‎址BYTE* pBits‎char* image‎Data感兴趣区域‎---roi表中正体字‎母部分表示‎相同的参数‎,粗体字母表‎示参数部分‎相同时的交‎集,斜体加下划‎线表示结构‎特有的参数‎。

opencv在MFC中的使用

opencv在MFC中的使用

opencv在MFC中的使⽤OpenCV 在MFC中的⼀些基本使⽤⽅法在《OpenCV教程-基础篇》的中,所创建的MFC图像显⽰是直接放在对话框⾯板的左上⾓的,感觉不⼤美观;《MFC 中快速应⽤OpenCV》则是介绍⽤SDI(单⽂档界⾯)来显⽰图像,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》使⽤VS2005来进⾏图像和视频的读取和处理,但是其图像和视频的显⽰界⾯不是在对话框⾥⾯的,⽽是新建⼀个窗⼝来做。

所以下⾯我们就来看看怎么在对话框⾥使⽤Picture控件来显⽰和处理图像。

⼀、创建MFC⾸先创建⼀个MFC对话框应⽤程序(Dialog-based Application)如下:在VS2005和2008⾥,我们可以⽤⼀个Solution 来组合⼏个Project (每个Project 基本上只包含⼀个Program),当我们要构建⼀个多Program的应⽤时(例如⼀个客户端程序加⼀个服务器应⽤程序),利⽤Solution 可以将这些Projects 组合起来、并且共享⽂件和函数库。

通常需要为Solution创建⼀个主路径,其中包含了所有Projects的路径。

不过在这篇⽂章⾥,我们只构建⼀个简单的Project,所以在创建MFC的New Project对话框⾥,不⽤勾选“Create directory for solution”这个选项。

点击OK -- Next进⼊下⼀步,在这⾥我们创建⼀个Dialog-based Application,⼤部分选项按默认设置就⾏,不过最下⾯的“Use Unicode libraries”最好去掉。

如果勾选了这个选项,程序代码就会使⽤16bit的Unicode字符集来编码,但是很多函数虽然使⽤char* (ASCII stings) 类型字符,⽽将字符串从Unicode 转换到ASCII 是⾮常⿇烦的。

openCV调用摄像头

openCV调用摄像头
2、DirectShow 采集图像
CCameraDS 中有如下函数: CCameraDS() 构造函数 CCameraDS() 析构函数 bool OpenCamera(int nCamID, bool bDisplayProperties=true) 打开摄像头,nCamID 指定打开哪个摄像头,取值可以为 0,1,2,...。bDisplayProperties 指示是否自动弹 出摄像头属性页。 bool OpenCamera(int nCamID, bool bDisplayProperties=true, int nWidth=320, int nHeight=240) 打开摄像头,nCamID 指定打开哪个摄像头,取值可以为 0,1,2,...。bDisplayProperties 指示是否自动弹 出摄像头属性页。nWidth 和 nHeight 设置的摄像头的宽和高,如果摄像头不支持所设定的宽度和高 度,则返回 false void CloseCamera() 关闭摄像头,析构函数会自动调用这个函数 static int CameraCount() 返回摄像头的数目。可以不用创建 CCameraDS 实例,采用 int c=CCameraDS::CameraCount();得到结果。 static int CameraName(int nCamID, char* sName, int nBufferSize); 根据摄像头的编号返回摄像头的名字 nCamID: 摄像头编号 sName: 用于存放摄像头名字的数组 nBufferSize: sName 的大小 可以不用创建 CCameraDS 实例,采用 CCameraDS::CameraName();得到结果。 int GetWidth() 返回图像宽度。
1)加载级联分类器

VS2010+Opencv+MFC读取图像和视频显示在Picture控件

VS2010+Opencv+MFC读取图像和视频显示在Picture控件

VS2010+Opencv+MFC读取图像和视频显⽰在Picture控件VS2010+Opencv+MFC读取图像和视频显⽰在Picture控件,供⼤家参考,具体内容如下1.新建MFC对话框应⽤程序。

其余选项默认,单击完成,创建出对话框应⽤程序。

删掉原来⾃带的⼀些控件,添加picture控件和两个按钮。

2.由于以后的代码会⽤到CvvImage类,⽽opencv2.3以后就去掉了对它的⽀持,这⾥先介绍添加CvvImage⽀持的⽅法,直接能⽤的可以略过这⼀步。

如下图添加相应的⽂件:这⾥附上两个⽂件的源码⽅便使⽤。

#pragma once#ifndef CVVIMAGE_CLASS_DEF#define CVVIMAGE_CLASS_DEF#include "opencv.hpp"class CvvImage{public:CvvImage();virtual ~CvvImage();virtual bool Create( int width, int height, int bits_per_pixel, int image_origin = 0 );virtual bool Load( const char* filename, int desired_color = 1 );virtual bool LoadRect( const char* filename,int desired_color, CvRect r );#if defined WIN32 || defined _WIN32virtual bool LoadRect( const char* filename,int desired_color, RECT r ){return LoadRect( filename, desired_color,cvRect( r.left, r.top, r.right - r.left, r.bottom - r.top ));}#endifvirtual bool Save( const char* filename );virtual void CopyOf( CvvImage& image, int desired_color = -1 );virtual void CopyOf( IplImage* img, int desired_color = -1 );IplImage* GetImage() { return m_img; };virtual void Destroy(void);int Width() { return !m_img ? 0 : !m_img->roi ? m_img->width : m_img->roi->width; }; int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : m_img->roi->height;}; int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : 0; };virtual void Fill( int color );virtual void Show( const char* window );#if defined WIN32 || defined _WIN32virtual void Show( HDC dc, int x, int y, int width, int height,int from_x = 0, int from_y = 0 );virtual void DrawToHDC( HDC hDCDst, RECT* pDstRect );#endifprotected:IplImage* m_img;#endif#include "StdAfx.h"#include "CvvImage.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CV_INLINE RECT NormalizeRect( RECT r );CV_INLINE RECT NormalizeRect( RECT r ){int t;if( r.left > r.right ){t = r.left;r.left = r.right;r.right = t;}if( r.top > r.bottom ){t = r.top;r.top = r.bottom;r.bottom = t;}return r;}CV_INLINE CvRect RectToCvRect( RECT sr );CV_INLINE CvRect RectToCvRect( RECT sr ){sr = NormalizeRect( sr );return cvRect( sr.left, sr.top, sr.right - sr.left, sr.bottom - sr.top );}CV_INLINE RECT CvRectToRect( CvRect sr );CV_INLINE RECT CvRectToRect( CvRect sr ){RECT dr;dr.left = sr.x;dr.top = sr.y;dr.right = sr.x + sr.width;dr.bottom = sr.y + sr.height;return dr;}CV_INLINE IplROI RectToROI( RECT r );CV_INLINE IplROI RectToROI( RECT r ){IplROI roi;r = NormalizeRect( r );roi.xOffset = r.left;roi.yOffset = r.top;roi.width = r.right - r.left;roi.height = r.bottom - r.top;roi.coi = 0;return roi;}void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin ){assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32)); BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);memset( bmih, 0, sizeof(*bmih));bmih->biSize = sizeof(BITMAPINFOHEADER);bmih->biWidth = width;bmih->biHeight = origin ? abs(height) : -abs(height);bmih->biPlanes = 1;bmih->biBitCount = (unsigned short)bpp;bmih->biCompression = BI_RGB;if( bpp == 8 ){RGBQUAD* palette = bmi->bmiColors;int i;for( i = 0; i < 256; i++ ){palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;palette[i].rgbReserved = 0;{m_img = 0;}void CvvImage::Destroy(){cvReleaseImage( &m_img );}CvvImage::~CvvImage(){Destroy();}bool CvvImage::Create( int w, int h, int bpp, int origin ){const unsigned max_img_size = 10000;if( (bpp != 8 && bpp != 24 && bpp != 32) ||(unsigned)w >= max_img_size || (unsigned)h >= max_img_size ||(origin != IPL_ORIGIN_TL && origin != IPL_ORIGIN_BL)){assert(0); // most probably, it is a programming errorreturn false;}if( !m_img || Bpp() != bpp || m_img->width != w || m_img->height != h ) {if( m_img && m_img->nSize == sizeof(IplImage))Destroy();m_img = cvCreateImage( cvSize( w, h ), IPL_DEPTH_8U, bpp/8 ); }if( m_img )m_img->origin = origin == 0 ? IPL_ORIGIN_TL : IPL_ORIGIN_BL;return m_img != 0;}void CvvImage::CopyOf( CvvImage& image, int desired_color ){IplImage* img = image.GetImage();if( img ){CopyOf( img, desired_color );}}#define HG_IS_IMAGE(img) \((img) != 0 && ((const IplImage*)(img))->nSize == sizeof(IplImage) && \ ((IplImage*)img)->imageData != 0)void CvvImage::CopyOf( IplImage* img, int desired_color ){if( HG_IS_IMAGE(img) ){int color = desired_color;CvSize size = cvGetSize( img );if( color < 0 )color = img->nChannels > 1;if( Create( size.width, size.height,(!color ? 1 : img->nChannels > 1 ? img->nChannels : 3)*8,img->origin )){cvConvertImage( img, m_img, 0 );}}}bool CvvImage::Load( const char* filename, int desired_color ){IplImage* img = cvLoadImage( filename, desired_color );if( !img )return false;CopyOf( img, desired_color );cvReleaseImage( &img );return true;}bool CvvImage::LoadRect( const char* filename,int desired_color, CvRect r ){if( r.width < 0 || r.height < 0 ) return false;IplImage* img = cvLoadImage( filename, desired_color );if( !img )return false;if( r.width == 0 || r.height == 0 ){r.width = img->width;r.height = img->height;r.x = r.y = 0;}if( r.x > img->width || r.y > img->height ||r.x + r.width < 0 || r.y + r.height < 0 ){cvReleaseImage( &img );return false;}if( r.x < 0 ){r.width += r.x;r.x = 0;}if( r.y < 0 ){r.height += r.y;r.y = 0;}if( r.x + r.width > img->width )r.width = img->width - r.x;if( r.y + r.height > img->height )r.height = img->height - r.y;cvSetImageROI( img, r );CopyOf( img, desired_color );cvReleaseImage( &img );return true;}bool CvvImage::Save( const char* filename ){if( !m_img )return false;cvSaveImage( filename, m_img );return true;}void CvvImage::Show( const char* window ){if( m_img )cvShowImage( window, m_img );}void CvvImage::Show( HDC dc, int x, int y, int w, int h, int from_x, int from_y ){if( m_img && m_img->depth == IPL_DEPTH_8U ){uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];BITMAPINFO* bmi = (BITMAPINFO*)buffer;int bmp_w = m_img->width, bmp_h = m_img->height;FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );from_x = MIN( MAX( from_x, 0 ), bmp_w - 1 );from_y = MIN( MAX( from_y, 0 ), bmp_h - 1 );int sw = MAX( MIN( bmp_w - from_x, w ), 0 );int sh = MAX( MIN( bmp_h - from_y, h ), 0 );SetDIBitsToDevice(dc, x, y, sw, sh, from_x, from_y, from_y, sh,m_img->imageData + from_y*m_img->widthStep,bmi, DIB_RGB_COLORS );}}void CvvImage::DrawToHDC( HDC hDCDst, RECT* pDstRect ){if( pDstRect && m_img && m_img->depth == IPL_DEPTH_8U && m_img->imageData ) {uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];BITMAPINFO* bmi = (BITMAPINFO*)buffer;int bmp_w = m_img->width, bmp_h = m_img->height;CvRect roi = cvGetImageROI( m_img );CvRect dst = RectToCvRect( *pDstRect );if( roi.width == dst.width && roi.height == dst.height ){Show( hDCDst, dst.x, dst.y, dst.width, dst.height, roi.x, roi.y );return;}if( roi.width > dst.width ){SetStretchBltMode(hDCDst, // handle to device contextHALFTONE );}else{SetStretchBltMode(hDCDst, // handle to device contextCOLORONCOLOR );}FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), m_img->origin );::StretchDIBits(hDCDst,dst.x, dst.y, dst.width, dst.height,roi.x, roi.y, roi.width, roi.height,m_img->imageData, bmi, DIB_RGB_COLORS, SRCCOPY );}}void CvvImage::Fill( int color ){cvSet( m_img, cvScalar(color&255,(color>>8)&255,(color>>16)&255,(color>>24)&255) );}在需要引⽤该类的地⽅添加如下引⽤:3.在Picture控件中显⽰图⽚如图所⽰修改控件ID,并删除按钮已存在的响应代码。

MFC结合OPENCV图像处理例子

MFC结合OPENCV图像处理例子

利用MFC结合OPENCV进行图像处理
对于学习图像处理的朋友们,OPENCV库函数可以帮助大家方便快捷地进行一些通用的图像处理工作,使得人们能够把精力放在自己的算法编程上面。

而MFC则可以帮助我们大大减少一些编程方面的工作。

所以,在MFC框架上利用OPENCV解决图像处理方面的问题是一个很好的选择。

下面通过一个简单的例子来说明如何在MFC里采用OPENCV库函数进行图像处理。

1.新建一个MFC AppWizard(exe)工程,取名test
这里,建立的是基本对话框。

建立完成之后,取消预编译头文件
2.在VC++6.0上添加OPENCV库函数
具体的在VC++6.0上怎么使用OPENCV,网上已经有大量的参考例子。

这里就简单的介绍一下要添加的函数库。

一般只是使用到OPENCV里面的cv.lib,cxcore.lib,highgui.lib库,所以本工程只是将这三个库添加到工程里面
3.往对话框里添加3个按钮,并修改按钮名字
4.分别给三个按钮添加消息处理函数,双击按钮确定即可添加。

然后,可以在按钮消息函数中添加自己的代码,实现具体功能。

按钮一是“显示原图”按钮,功能是打开一副指定的图像。

为了能使用OPENCV库函数,还要添加相应头文件
编译连接无误之后,点击“显示原图”按钮,运行结果如下
同样,在另外两个按钮消息函数中编辑自己的程序
运行后,分别点击三个按钮,整个程序的运行如下。

openCV——在MFC中使用openCV

openCV——在MFC中使用openCV
openCV——在 MFC 中使用 openCV 1、添加头文件以及连接 LIB 文件
#include "cv.h"
#include "highgui.h" #pragma comment( lib, "cv200.lib" ) #pragma comment( lib, "ccxcore200.lib" ) #pragma comment( lib, "highgui200.lib" ) #pragma comment( lib, "cvaux200.lib" )
{ viewimgdata(); CDialog::OnPaint();
}
//自定义函数
void viewimgdata()
{ CPaintDC dc(this); CDC* pdc = &dc; int res = StretchDIBits( pdc->GetSafeHdc(),//句柄 0,//目的 0, int(256), int(256),
(char)(w/dx); }
} } else if (theimage->nChannels == 3) //对 RGB 图像 {
IplImage* temp = cvCreateImage(imgsize,IPL_DEPTH_8U,1);
int h,w; float dx = temp->width/256.0f; for (w= 0; w<temp->width;w++) {
edge,//单通道存储边缘的输出图像 30,//第一阀值 100,//第二阀值 3 //Sobel 算子内核大小 );//注意:cvCanny 只接受单通道图像作为输入(有人写了自适应阀值 函数,可以参考) cvSetImageCOI(img,0);//这可能是个 bug,添加此句修改通道设置 cvCvtColor(edge,img,CV_GRAY2RGB); //保存结果 cvCopyImage(img,m_ipl);//各种条件一致,复制才不会出错 cvReleaseImage(&gray); cvReleaseImage(&edge);

在MFC中显示视频,图片

在MFC中显示视频,图片

OpenCV學習筆記(9)利用MFC的Picture控件顯示圖像+播放視頻和捕獲攝像頭畫面收藏人:彦北2013-06-16 | 阅:2724 转:8 | 来源 | 分享/rocky69/article/details/7726553P.S.:後面又添加了播放視頻和捕獲攝像頭畫面的功能,其中播放視頻的功能只有'Play' 和'Stop',不能實現暫停,《A step-by-step guide to the use of Microsoft Visual C++ and the Intel OpenCV library》中好像有關於多線程防止任務沖突(Mutex)的內容,深入學習和了解那一部分後再嘗試做暫停的功能和其它更復雜的應用。

下面是新增功能後的項目文件(可直接運行):/source/2155367在《OpenCV教程-基礎篇》的2.8節中,所創建的MFC圖像顯示是直接放在對話框面板的左上角的,《A step-by-step 《MFC中快速應用OpenCV》則是介紹用SDI(單文檔界面)來顯示圖像,感覺不大美觀;guide to the use of Microsoft Visual C++ and the Intel OpenCV library》使用VS2005來進行圖像和視頻的讀取和處理,但是其圖像和視頻的顯示界面不是在對話框裡面的,而是新建一個窗口來做。

所以下面我們就來看看怎麼在對話框裡使用Picture控件來顯示和處理圖像。

一、創建MFC首先創建一個MFC對話框應用程序(Dialog-based Application)如下:在VS2005和2008裡,我們可以用一個Solution 來組合幾個Project (每個Project 基本上只包含一個Program),當我們要構建一個多Program的應用時(例如一個客戶端程序加一個服務器應用程序),利用Solution 可以將這些Projects 組合起來、並且共享文件和函數庫。

在单文档中使用opencv打开影像

在单文档中使用opencv打开影像

继承opencv的CImage类在MFC的单文档中编辑并显示图像在opencv中显示一个图像简单,但是想在MFC的单文档框架中可不是件容易的,好在opencv 提供了CImage类可以简化这一工作,但是还是碰到了些问题,如如何装IplImage*图像放入CImage类的成员变量中.CImage类封装了图像打开\保存\获取\等方法,并将图像保存在一个protected的图像成员变量里.虽然也提供了CopeOf来装入图像,但是由于类型转换的问题,总是出错.解决方法:以CImage为基类自定义一个类:1.从论坛上看到一哥们使用的方法是在自定义的类的构造函数中修改CImage的protected的图像成员变量,如下:myimg::myimg(IplImage* img) : CvvImage(){m_img=cvCloneImage(img);}调试时发现无法在MFC的xxxxDoc.h中定义新类myimg的对像,错误是构造函数不正确,也可能是自己MFC水平太差^_^(请大家提意见).2.自己的解决办法是,以CImage为基类自定义一个类如下://class声明文件#include "stdafx.h"#include "mcv_common.h" //其中是opencv的一些头文件class myimg :public CvvImage{public:myimg();mSetImg(IplImage* pImg);};//class实现文件#include "stdafx.h"#include "mcv_common.h" //其中是opencv的一些头文件#include "mCImage.h"myimg::myimg(){}myimg::mSetImg(IplImage* pImg){m_img=cvCloneImage(pImg); //这句很关键,调试也曾换成CImage类中的CopeOf方法,但是总有类型转换错误}//测试代码//打开文件BOOL CMcv_image_sdiDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;m_imgBackup=cvLoadImage(lpszPathName,0);mcv_image.mSetImg(m_imgBackup);return TRUE;}//图像处理:这里以灰度拉伸为例void CMcv_image_sdiView::OnPointStre(){CMcv_image_sdiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);IplImage* pImgTemp=pDoc ->mcv_image.GetImage();pImgTemp=GrayStretch(pImgTemp, pImgTemp->width,pImgTemp->height, bX1, bY1, bX2, bY2);//此处是自定义函数,可以换成其他处理pDoc ->mcv_image.mSetImg(pImgTemp); //主要是部分:将处理后和图像写入CImage中的m_img//非常关键的部分UpdateData(FALSE); // 更新CRect m_MouseRect;GetClientRect (&m_MouseRect);InvalidateRect(m_MouseRect, TRUE);// 重绘}//显示部分void CMcv_image_sdiView::OnDraw(CDC* pDC){CMcv_image_sdiDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);myimg & c_myimg = pDoc ->mcv_image; //mcv_image->m_imageCRect m_rect;m_rect.SetRect(0,0,c_myimg.Width(),c_myimg.Height());c_myimg.DrawToHDC(pDC->GetSafeHdc() ,m_rect);}PS:Mcv_image_sdi为工程名,是一个单文档工程虽然不大一个问题,但是还是费了半天劲,和大家分享,希望多提意见,共同学习。

OpenCV读取与操作摄像头

OpenCV读取与操作摄像头

OpenCV读取摄像头OpenCV可以读取摄像头的图像,主要是流媒体,读取的类是cv::VideoCapture,输入参数为摄像头参数:当使用USB摄像头时,输入0,1,2…等对应参数当使用网络摄像头时,直接输入url地址。

OpenCV设置属性使用cv::VieoCapture时,先生成一个实例,然后设置属性,此时有一点要注意,当读取的图片原本只有400*300时,设置高宽800*600是无效的(即超过输入的尺寸设置是无效的),然后不断使用>>读取,读取就显示。

cv::VideoCapture capture;if(!capture.open(0)){qDebug() << __FILE__ << __LINE__ << "Failed to open camera: 0";}else{qDebug() << __FILE__ << __LINE__ << "Succeed to open camera: 0";}while(true){cv::Mat mat;capture >> mat;int keyValue = cv::waitKey(1)}同时经过测试发现,此次打开的是上次的设置结果,所以可以判断opencv实际是直接操作了设备的相关属性,所以调整的属性需要摄像头设备支持(USB 摄像头),并不是单纯的认为拿到图片后opencv自己对图像进行处理。

Demo函数源码void OpenCVManager::testCamera(){cv::VideoCapture capture;// 插入USB摄像头默认为0if(!capture.open(0)){qDebug() << __FILE__ << __LINE__ << "Failed to open camera: 0"; }else{qDebug() << __FILE__ << __LINE__ << "Succeed to open camera: 0"; }capture.set(cv::CAP_PROP_FRAME_WIDTH , 800);capture.set(cv::CAP_PROP_FRAME_HEIGHT, 480);// 初始亮度为0,范围为-50 ~ 50,范围区间100double brightness = 0;double contrast = 0;double saturation = 0;double hue = 0;double gain = 0;double exposure = 0;brightness = capture.get(cv::CAP_PROP_BRIGHTNESS);contrast = capture.get(cv::CAP_PROP_CONTRAST);saturation = capture.get(cv::CAP_PROP_SATURATION);hue = capture.get(cv::CAP_PROP_HUE);gain = capture.get(cv::CAP_PROP_GAIN);exposure = capture.get(cv::CAP_PROP_EXPOSURE);qDebug() << "=========================";qDebug() << "初始亮度:" << brightness;qDebug() << "初始对比度:" << contrast;qDebug() << "初始饱和度:" << saturation;qDebug() << "初始色调:" << hue ;qDebug() << "初始增益:" << gain;qDebug() << "初始曝光度:" << exposure;qDebug() << "=========================";while(true){cv::Mat mat;capture >> mat;if(!mat.empty()){cv::putText(mat, QString("brightness: %1").arg(brightness).toStdString(),cvPoint(0, 30), cv::FONT_HERSHEY_COMPLEX, 1.0,cv::Scalar(255));cv::putText(mat, QString(" contrast: %1").arg(contrast ).toStdString(),cvPoint(0, 60), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255)); cv::putText(mat, QString("saturation: %1").arg(saturation).toStdString(),cvPoint(0, 90), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255)); cv::putText(mat, QString(" hue: %1").arg(hue ).toStdString(),cvPoint(0, 120), cv::FONT_HERSHEY_COMPLEX, 1.0,cv::Scalar(255));cv::putText(mat, QString(" gain: %1").arg(gain ).toStdString(),cvPoint(0, 150), cv::FONT_HERSHEY_COMPLEX, 1.0,cv::Scalar(255));cv::putText(mat, QString(" exposure: %1").arg(exposure ).toStdString(),cvPoint(0, 180), cv::FONT_HERSHEY_COMPLEX, 1.0,cv::Scalar(255));cv::putText(mat, QString("press ESC out").toStdString(),cvPoint(0, 210), cv::FONT_HERSHEY_COMPLEX, 1.0,cv::Scalar(255));cv::imshow(_windowTitle.toStdString(), mat);}int keyValue = cv::waitKey(1);switch (keyValue){case 27: // ESCcapture.release();return;break;case '1': // 增加亮度brightness += 1;capture.set(cv::CAP_PROP_BRIGHTNESS, brightness);qDebug() << __FILE__ << __LINE__ << "调整亮度:" << brightness; break;case '2': // 降低亮度brightness -= 1;capture.set(cv::CAP_PROP_BRIGHTNESS, brightness);qDebug() << __FILE__ << __LINE__ << "调整亮度:" << brightness; break;case '3': // 增加对比度contrast += 1;capture.set(cv::CAP_PROP_CONTRAST, contrast);qDebug() << __FILE__ << __LINE__ << "调整对比度:" << contrast; break;case '4': // 降低对比度contrast -= 1;capture.set(cv::CAP_PROP_CONTRAST, contrast);qDebug() << __FILE__ << __LINE__ << "调整对比度:" << contrast; break;case '5': // 增加饱和度saturation += 1;capture.set(cv::CAP_PROP_SATURATION, saturation);qDebug() << __FILE__ << __LINE__ << "调整饱和度:" << saturation; break;case '6': // 降低饱和度saturation -= 1;capture.set(cv::CAP_PROP_SATURATION, saturation);qDebug() << __FILE__ << __LINE__ << "调整饱和度:" << saturation; break;case '7': // 增加色调hue += 1;capture.set(cv::CAP_PROP_HUE, hue);qDebug() << __FILE__ << __LINE__ << "调整色调:" << hue;break;case '8': // 降低色调hue -= 1;capture.set(cv::CAP_PROP_HUE, hue);qDebug() << __FILE__ << __LINE__ << "调整色调:" << hue;break;case '9': // 增加增益gain += 1;capture.set(cv::CAP_PROP_GAIN, gain);qDebug() << __FILE__ << __LINE__ << "调整增益:" << gain;break;case '0': // 降低增益gain -= 1;capture.set(cv::CAP_PROP_GAIN, gain);qDebug() << __FILE__ << __LINE__ << "调整增益:" << gain;break;case '-': // 增加曝光exposure += 1;capture.set(cv::CAP_PROP_EXPOSURE, exposure);qDebug() << __FILE__ << __LINE__ << "调整曝光:" << exposure;break;case '=': // 降低曝光exposure -= 1;capture.set(cv::CAP_PROP_EXPOSURE, exposure);qDebug() << __FILE__ << __LINE__ << "调整曝光:" << exposure;break;default:break;}}}拓展:视频属性OpenCV中提供了一个函数,来获取视频文件的一些属性:cvGetCaptureProperty(Capture* cap,int property_index);相机的画,可以直接使用cv::VedioCapture::get()。

基于opencv,开发摄像头播放程序

基于opencv,开发摄像头播放程序

基于opencv,开发摄像头播放程序前⾔ Windows下实现摄像视频捕捉有多种实现⽅式;各种⽅式的优劣,本⽂不做对⽐。

但是,opencv是⼀款⽼牌开发库,在图像处理领域声名显赫。

采⽤opencv来处理摄像视频,在性能和稳定性上,是有保障的。

并且,opencv包含很多图像处理函数,可以更⽅便的对视频处理。

执⾏程序是⽤wpf开发的,所以先将opencv封装成c语⾔接⼝,以供调⽤。

opencv也不可能提供现成的控件供wpf使⽤,两种不同的开发语⾔“沟通”起来有些困难。

其实稍作变通,就可以实现摄像头播放功能。

1 对opencv封装opencv的类VideoCapture封装了对摄像头的操作,使⽤起来也⾮常简单。

bool open(int device); device为摄像头设备序号。

如果有多个摄像头,怎么知道哪个摄像头的序号那?可以通过如下函数,获取摄像头列表。

摄像头在list中索引即为设备序号。

int GetCameraDevices(vector<wstring>& list){ICreateDevEnum *pDevEnum = NULL;IEnumMoniker *pEnum = NULL;int deviceCounter = 0;CoInitialize(NULL);HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,reinterpret_cast<void**>(&pDevEnum));if (SUCCEEDED(hr)){// Create an enumerator for the video capture category.hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);if (hr == S_OK) {//if (!silent)printf("SETUP: Looking For Capture Devices\n");IMoniker *pMoniker = NULL;while (pEnum->Next(1, &pMoniker, NULL) == S_OK) {IPropertyBag *pPropBag;hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,(void**)(&pPropBag));if (FAILED(hr)) {pMoniker->Release();continue; // Skip this one, maybe the next one will work.}// Find the description or friendly name.VARIANT varName;VariantInit(&varName);hr = pPropBag->Read(L"Description", &varName, 0);if (FAILED(hr))hr = pPropBag->Read(L"FriendlyName", &varName, 0);if (SUCCEEDED(hr)) {hr = pPropBag->Read(L"FriendlyName", &varName, 0);int count = 0;wstring str2 = varName.bstrVal;list.push_back(str2);}pPropBag->Release();pPropBag = NULL;pMoniker->Release();pMoniker = NULL;deviceCounter++;}pDevEnum->Release();pDevEnum = NULL;pEnum->Release();pEnum = NULL;}}return deviceCounter;}总之,使⽤opencv打开摄像头⾮常简单。

树莓派用python中的OpenCV输出USB摄像头画面

树莓派用python中的OpenCV输出USB摄像头画面

树莓派⽤python中的OpenCV输出USB摄像头画⾯本⽂实例为⼤家分享了python OpenCV来表⽰USB摄像头画⾯的具体代码,供⼤家参考,具体内容如下确认Python版本$ pythonPython 2.7.13 (default, Jan 19 2019, 14:48:08)[GCC 6.3.0 20170124] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> quit()确认OS版本$ uname -aLinux raspberrypi 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l GNU/Linux$ lsb_release -aNo LSB modules are available.Distributor ID: RaspbianDescription: Raspbian GNU/Linux 9.1 (stretch)Release: 9.1安装OpenCV和Python版的OpenCV安装包$ sudo apt-get install libopencv-dev$ sudo apt-get install python-opencvPython的例程import cv2#初期化USB摄像头cap = cv2.VideoCapture(0)while( cap.isOpened() ):#USB摄像头⼯作时,读取⼀帧图像ret, frame = cap.read()#显⽰图像窗⼝在树莓派的屏幕上cv2.imshow('Capture',frame)#按下q键退出key = cv2.waitKey(1)#print( '%08X' % (key&0xFFFFFFFF) )if key & 0x00FF == ord('q'):break# 释放资源和关闭窗⼝cap.release()cv2.destroyAllWindows()图像输出的树莓派截屏以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

开摄像头的按钮,一个关闭摄像头的按钮。

有一个PictureBox的控件。

1.CvCapture* capture;2.CRect rect;3.CDC *pDC;4.HDC hDC;5.CWnd *pwnd;这里特别注意,这些变量一定要是全局变量。

再来看一下这些变量的添加位置:[cpp]view plaincopyprint?1.#include "stdafx.h"2.#include "VideoMFC.h"3.#include "VideoMFCDlg.h"4.#include "afxdialogex.h"5.6.#ifdef _DEBUG7.#define new DEBUG_NEW8.#endif9.10.11.CvCapture* capture;12.CRect rect;13.CDC *pDC;14.HDC hDC;15.CWnd *pwnd;16.17.// CAboutDlg dialog used for App About18.19.class CAboutDlg : public CDialogEx20.{21.public:然后在窗口的初始化函数中进行句柄的初始化:[cpp]view plaincopyprint?1.OnInitDialog()这个函数,BOOL CVideoMFCDlg::OnInitDialog()初始化代码:[cpp]view plaincopyprint?1.// CVideoMFCDlg message handlers2.3.BOOL CVideoMFCDlg::OnInitDialog()4.{5. CDialogEx::OnInitDialog();6.7. // Add "About..." menu item to system menu.8.9. // IDM_ABOUTBOX must be in the system command range.10. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);11. ASSERT(IDM_ABOUTBOX < 0xF000);12.13. CMenu* pSysMenu = GetSystemMenu(FALSE);14. if (pSysMenu != NULL)15. {16.BOOL bNameValid;17. CString strAboutMenu;18. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);19. ASSERT(bNameValid);20. if (!strAboutMenu.IsEmpty())21. {22. pSysMenu->AppendMenu(MF_SEPARATOR);23. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);24. }25. }26.27.28. // Set the icon for this dialog. The framework does this automatically29. // when the application's main window is not a dialog30. SetIcon(m_hIcon, TRUE); // Set big icon31. SetIcon(m_hIcon, FALSE); // Set small icon32.33. // TODO: Add extra initialization here34. pwnd = GetDlgItem(IDC_ShowImage);35. //pwnd->MoveWindow(35,30,352,288);36. pDC =pwnd->GetDC();37. //pDC =GetDC();38. hDC= pDC->GetSafeHdc();39. pwnd->GetClientRect(&rect);40.41.42.43. return TRUE; // return TRUE unless you set the focus to a control44.}这里的初始化代码只有Todo后面的是自己添加的,目的是获得图像控件的句柄,将来好在上面显示图像。

这一步也可以放在具体的显示图像的时候在进行,但是就需要每显示一帧,都获得一次句柄。

在控制台程序中,我们可以很简单的通过for(;;)的空循环来不停的实现获取摄像头的每一帧,但是我发现这么做在MFC里面是不可行的。

一个是因为MFC是用户界面程序,如果这么写的话,所有的界面都会卡住,而且这么写的话其他的功能按钮就失去作用了。

这里为了实现获取摄像头的每一帧,我们要通过设定一个时间事件,让每隔一定时间,比如20ms,就调用一个函数,通过这个时间调用来获取摄像头的帧。

这样,我们就可以实现在图像控件中显示视频,并且用户界面不会卡住了。

看一下打开摄像头按钮的代码:[cpp]view plaincopyprint?1.void CVideoMFCDlg::OnBnClickedButton1()2.{3. // TODO: Add your control notification handler code here4. //AfxMessageBox("OK");5. if(!capture)6. {7. capture = cvCaptureFromCAM(0);8. //AfxMessageBox("OK");9. }10.11. if (!capture)12. {13. AfxMessageBox("无法打开摄像头");14. return;15. }16.17. // 测试18. IplImage* m_Frame;19. m_Frame=cvQueryFrame(capture);20. CvvImage m_CvvImage;21. m_CvvImage.CopyOf(m_Frame,1);22. if (true)23. {24. m_CvvImage.DrawToHDC(hDC, &rect);25. //cvWaitKey(10);26. }27.28. // 设置计时器,每10ms触发一次事件29. SetTimer(1,10,NULL);30.}这里有一个SetTimer();函数,这个函数就是调用win32函数实现每隔指定的时间调用一次我们指定的事件。

这个函数有两种用法,一种是指定一个回调函数,一个是通过MFC的ClassWizard指定的回调函数。

SetTimer()的具体用法请见:/view/998104.htm这里我们使用了通过MFC的ClassWizard设定回调函数。

在VS中,用户界面设计右击打开Class Wizard, 切换到Message选项卡,然后找到WM_TIMER这个message, 双击右边的OnTimer句柄,然后进入回调函数的代码。

回调函数的代码如下:[cpp]view plaincopyprint?1.void CVideoMFCDlg::OnTimer(UINT_PTR nIDEvent)2.{3. // TODO: Add your message handler code here and/or call default4. /************************************************************************/5. /* 显示摄像头 */6. /************************************************************************/7. IplImage* m_Frame;8. m_Frame=cvQueryFrame(capture);9. CvvImage m_CvvImage;10. m_CvvImage.CopyOf(m_Frame,1);11. if (true)12. {13. m_CvvImage.DrawToHDC(hDC, &rect);14. //cvWaitKey(10);15. }16.17. CDialogEx::OnTimer(nIDEvent);18.}关闭摄像头代码:[cpp]view plaincopyprint?1.void CVideoMFCDlg::OnBnClickedButton2()2.{3. // TODO: Add your control notification handler code here4. cvReleaseCapture(&capture);5. CDC MemDC;6. CBitmap m_Bitmap1;7. m_Bitmap1.LoadBitmap(IDB_BITMAP1);8. MemDC.CreateCompatibleDC(NULL);9. MemDC.SelectObject(&m_Bitmap1);10. pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,0,0,48,48,SRCCOPY);11.}系统运行截图:如果需要保存摄像头视屏的操作,请看链接中的文章:/weixingstudio/article/details/7588505整个工程的下载地址:/detail/weixingstudio/4284066。

在这个工程中保存视频的功能。

相关文档
最新文档