标签:
//打开摄像头,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 ); }
基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)
标签:
原文地址:http://www.cnblogs.com/jsxyhelu/p/5931700.html