在MFC图片控件中打开摄像头实时拍照
2017-04-23 00:02
162 查看
1.功能简介
用大恒相机实时拍摄电池照片,然后根据模板对样品进行检测,然后根据模板进行匹配,结果匹配成功的进行画圈。
2.安装大恒相机的驱动,保证用自带软件可以打开相机
3.打开halcon12,打开相机采集助手,然后识别设备,点击实时,看能否打开相机进行实时拍照,如果可以的话说明在MFC对话框中就可以实现打开相机。
4.点击生成代码将打开相机的代码转成C++,复制代码到MFC中,但是导出代码后在我的MFC对话框上无法显示相机图像,一直报错。后来搞了好久才在网上找到答案:在halcon安装目录下找到关于我所用大恒相机的那个DLL文件拷贝到MFC工程目录下,问题解决。
5.相机打开后只能拍一张,while循环有问题,发现无法实时拍照,所以决定重载一个消息ON_WM_TIME,设置一个定时器调用ontimer函数。
6.如果要保证实时检测和手动检测可以随时地切换的话,那么在图片控件的窗口句柄那里就要建立一个公共的变量,方便随时转换。oninitdialog函数代码:
7.显示的图片假如格式是PNG的话,那么显示出来是黑白的效果,所以需要改成bmp或者jpg的格式。
8.实时显示的样品检测假如匹配成功后需要画圆,圆的半径可以从模板上获取,代码如下:
9.创建模板
10.选择模板
11.实时检测
12.手动检测
13.停止检测
14.检测效果
用大恒相机实时拍摄电池照片,然后根据模板对样品进行检测,然后根据模板进行匹配,结果匹配成功的进行画圈。
2.安装大恒相机的驱动,保证用自带软件可以打开相机
3.打开halcon12,打开相机采集助手,然后识别设备,点击实时,看能否打开相机进行实时拍照,如果可以的话说明在MFC对话框中就可以实现打开相机。
4.点击生成代码将打开相机的代码转成C++,复制代码到MFC中,但是导出代码后在我的MFC对话框上无法显示相机图像,一直报错。后来搞了好久才在网上找到答案:在halcon安装目录下找到关于我所用大恒相机的那个DLL文件拷贝到MFC工程目录下,问题解决。
5.相机打开后只能拍一张,while循环有问题,发现无法实时拍照,所以决定重载一个消息ON_WM_TIME,设置一个定时器调用ontimer函数。
6.如果要保证实时检测和手动检测可以随时地切换的话,那么在图片控件的窗口句柄那里就要建立一个公共的变量,方便随时转换。oninitdialog函数代码:
CRect rtWindow; HWND hImgWnd = GetDlgItem(IDC_PIC1)->m_hWnd; GetDlgItem(IDC_PIC1)->GetClientRect(&rtWindow); SetWindowAttr("background_color", "white"); OpenWindow(rtWindow.left, rtWindow.top, rtWindow.Width(), rtWindow.Height(), (Hlong)hImgWnd, "visible", "", &hv_WindowHandle); SetColor(hv_WindowHandle, "red"); SetLineWidth(hv_WindowHandle, 3);
7.显示的图片假如格式是PNG的话,那么显示出来是黑白的效果,所以需要改成bmp或者jpg的格式。
8.实时显示的样品检测假如匹配成功后需要画圆,圆的半径可以从模板上获取,代码如下:
void CWSBCRDlg::OnTimer(UINT_PTR nIDEvent) if (hv_Score > 0.1) { HTuple hv_Row, hv_Column, hv_Radius, hv_StartPhi; HTuple hv_EndPhi, hv_PointOrder; GenContourRegionXld(ho_model, &ho_Contours, "border"); FitCircleContourXld(ho_Contours, "ahuber", -1, 0, 0, 3, 2, &hv_Row, &hv_Column, &hv_Radius, &hv_StartPhi, &hv_EndPhi, &hv_PointOrder); GenCircle(&ho_ImageSearch1, hv_RowCheck, hv_ColumnCheck, hv_Radius); GenContourRegionXld(ho_ImageSearch1, &ho_Contours, "border"); DispObj(ho_Contours, hv_WindowHandle); }
9.创建模板
void CWSBCRDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 KillTimer(1); DrawCircle(hv_WindowHandle, &hv_Row, &hv_Column, &hv_Radius); GenCircle(&ho_circleout, hv_Row, hv_Column, hv_Radius); ReduceDomain(ho_Image, ho_circleout, &ho_ImageReduced); WriteImage(ho_ImageReduced, "png", 0, "C:/Users/Administrator/Desktop/电池字符识别分类/02图片/有无检测/1.png"); MessageBox("模板已存至指定目录!"); modelnum++; }
10.选择模板
void CWSBCRDlg::OnBnClickedButton14() { // TODO: 在此添加控件通知处理程序代码 char* pcsun = "图片文件(*.bmp *.png *.jpg)|*.bmp;*.png;*jpg|All Files (*.*)|*.*||"; CFileDialog OpenDialog(TRUE, NULL, 0, OFN_OVERWRITEPROMPT, pcsun, NULL); if (OpenDialog.DoModal() == IDCANCEL) return; //返回带文件名的路径,并传递给编辑控件变量 CString str = OpenDialog.GetPathName(); //CString str = "C:/Users/Administrator/Desktop/1.png"; char* ch = (char*)LPCTSTR(str); ReadImage(&ho_model, ch); HTuple width, height,hv_WindowHandle1; GetImageSize(ho_model, &height, &width); CRect rtWindow; HWND hImgWnd = GetDlgItem(IDC_PIC2)->m_hWnd; GetDlgItem(IDC_PIC2)->GetClientRect(&rtWindow); OpenWindow(rtWindow.left, rtWindow.top, rtWindow.Width(), rtWindow.Height(), (Hlong)hImgWnd, "visible", "", &hv_WindowHandle1); SetPart(hv_WindowHandle1, 0, 0, width, height); DispObj(ho_model, hv_WindowHandle1); failnum = 1; }
11.实时检测
void CWSBCRDlg::OnBnClickedButton8() { // TODO: 在此添加控件通知处理程序代码 OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0, "interlaced", 8, "gray", -1, "false", "HV-xx51", "1", 1, -1, &hv_AcqHandle); GrabImageStart(hv_AcqHandle, -1); GrabImageAsync(&ho_Image, hv_AcqHandle, -1); GetImageSize(ho_Image, &height, &width); SetPart(hv_WindowHandle, 0, 0, width, height); DispObj(ho_Image, hv_WindowHandle); CloseFramegrabber(hv_AcqHandle); SetTimer(1, 100, NULL); } void CWSBCRDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调用默认值 OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0, "interlaced", 8, "gray", -1, "false", "HV-xx51", "1", 1, -1, &hv_AcqHandle); GrabImageStart(hv_AcqHandle, -1); GrabImageAsync(&ho_Image, hv_AcqHandle, -1); GetImageSize(ho_Image, &height, &width); SetPart(hv_WindowHandle, 0, 0, width, height); DispObj(ho_Image, hv_WindowHandle); CloseFramegrabber(hv_AcqHandle); if (failnum == 1) { CreateAnisoShapeModel(ho_model, "auto", HTuple(0).TupleRad(), HTuple(360).TupleRad(), "auto", 0.98, 1.02, "auto", 0.98, 1.02, "auto", "auto", "use_polarity", "auto", "auto", &hv_ModelID); FindAnisoShapeModel(ho_Image, hv_ModelID, HTuple(0).TupleRad(), HTuple(360).TupleRad(), 0.98, 3.02, 0.98, 1.02, 0.5, 1, 0.5, "least_squares_very_high", 0, 0.8, &hv_RowCheck, &hv_ColumnCheck, &hv_AngleCheck, &hv_ScaleR, &hv_ScaleC, &hv_Score); if (hv_Score > 0.1) { HTuple hv_Row, hv_Column, hv_Radius, hv_StartPhi; HTuple hv_EndPhi, hv_PointOrder; GenContourRegionXld(ho_model, &ho_Contours, "border"); FitCircleContourXld(ho_Contours, "ahuber", -1, 0, 0, 3, 2, &hv_Row, &hv_Column, &hv_Radius, &hv_StartPhi, &hv_EndPhi, &hv_PointOrder); GenCircle(&ho_ImageSearch1, hv_RowCheck, hv_ColumnCheck, hv_Radius); GenContourRegionXld(ho_ImageSearch1, &ho_Contours, "border"); DispObj(ho_Contours, hv_WindowHandle); } ClearShapeModel(hv_ModelID); } CDialogEx::OnTimer(nIDEvent); }
12.手动检测
void CWSBCRDlg::OnBnClickedButton11() { // TODO: 在此添加控件通知处理程序代码 char* pcsun = "图片文件(*.bmp *.png *.jpg)|*.bmp;*.png;*jpg|All Files (*.*)|*.*||"; CFileDialog OpenDialog(TRUE, NULL, 0, OFN_OVERWRITEPROMPT, pcsun, NULL); if (OpenDialog.DoModal() == IDCANCEL) return; //返回带文件名的路径,并传递给编辑控件变量 CString str = OpenDialog.GetPathName(); //CString str = "C:/Users/Administrator/Desktop/1.png"; char* ch = (char*)LPCTSTR(str); ReadImage(&ho_ImageSearch, ch); //ReadImage(&ho_ImageSearch, "C:/Users/Administrator/Desktop/电池字符识别分类/02图片/有无检测/2.jpg"); GetImageSize(ho_ImageSearch, &height, &width); SetPart(hv_WindowHandle, 0, 0, width, height); DispObj(ho_ImageSearch, hv_WindowHandle); CreateAnisoShapeModel(ho_model, "auto", HTuple(0).TupleRad(), HTuple(360).TupleRad(), "auto", 0.98, 1.02, "auto", 0.98, 1.02, "auto", "auto", "use_polarity", "auto", "auto", &hv_ModelID); FindAnisoShapeModel(ho_ImageSearch, hv_ModelID, HTuple(0).TupleRad(), HTuple(360).TupleRad(), 0.98, 1.02, 0.98, 1.02, 0.5, 1, 0.5, "least_squares_very_high", 0, 0.8, &hv_RowCheck, &hv_ColumnCheck, &hv_AngleCheck, &hv_ScaleR, &hv_ScaleC, &hv_Score); /*GenCircle(&ho_ImageSearch1, hv_RowCheck, hv_ColumnCheck, hv_Radius); GenContourRegionXld(ho_ImageSearch1, &ho_Contours, "border"); DispObj(ho_Contours, hv_WindowHandle);*/ if (hv_Score > 0.85) { //SetColor(hv_WindowHandle, "blue"); HTuple hv_Row, hv_Column, hv_Radius, hv_StartPhi; HTuple hv_EndPhi, hv_PointOrder; GenContourRegionXld(ho_model, &ho_Contours, "border"); FitCircleContourXld(ho_Contours, "ahuber", -1, 0, 0, 3, 2, &hv_Row, &hv_Column, &hv_Radius, &hv_StartPhi, &hv_EndPhi, &hv_PointOrder); GenCircle(&ho_ImageSearch1, hv_RowCheck, hv_ColumnCheck, hv_Radius); GenContourRegionXld(ho_ImageSearch1, &ho_Contours, "border"); DispObj(ho_Contours, hv_WindowHandle); MessageBox("识别成功!"); } ClearShapeModel(hv_ModelID); }
13.停止检测
void CWSBCRDlg::OnBnClickedButton9() { // TODO: 在此添加控件通知处理程序代码 KillTimer(1); //ReadImage(&ho_Image, "C:/Users/Administrator/Desktop/电池字符识别分类/02图片/有无检测/1.bmp"); ReadImage(&ho_Image, "res/1.bmp"); GetImageSize(ho_Image, &height, &width); SetPart(hv_WindowHandle, 0, 0, width, height); DispObj(ho_Image, hv_WindowHandle); }
14.检测效果
相关文章推荐
- VS2013 MFC+opencv2.4.9打开摄像头拍照图片处理
- 打开摄像头 拍照 存储拍照图片
- 用OpenCV在MFC Dialog中Picture控件上显示摄像头采集实时视频
- 【C++ MFC+opencv】打开文件夹中的图片并在picture控件中显示
- vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control
- MFC 通过opencv打开摄像头 拍照后显示保存
- 手机端file限制只能选择图片、视频、音频,直接打开摄像头拍照或录像
- H5实现调用本地摄像头实现实时视频以及拍照功能
- [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧
- android 打开默认的系统相册,或拍照选取图片,并图片裁剪;
- VS2010 / MFC + OpenCV 2.4.1打开图片
- MFC完全自绘Tab控件,支持图片背景
- mfc里面 有没有显示图片的列表控件啊
- 调用摄像头拍照以及上传图片
- MFC中Pictrue控件显示图片+播放视频
- WebView使用input file控件打开相册上传图片
- MFC基于对话框添加图片控件
- iOS10 拍照打开相册选择图片
- 1.0.3-学习Opencv与MFC混合编程之---打开本地摄像头
- HTML打开摄像头,进行拍照上传