机器人及视觉技术实验指导书
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图5
四、将工程文件的树形结构展开,添加“CameraDS.cpp”至“Source Files”,添加 “CameraDS.h”至“Header Files”。右键单击“Source Files”弹出菜单,选择“Add Files
6
to Folder”,弹出窗口,选择“CameraDS.cpp”文件,并确定;同理添加“CameraDS.h” 文件。添加后,这两个文件出现在目录树中。
图 10
九、在 CCameraDlg 类中(即在 cameraDlg.h 文件中),添加公共变量。
CDC *pDCL, *pDCR ;
//图形设备环境指针
HDC hDCL, hDCR ;
//设备上下文的句柄
CRect rectL, rectR;
//窗口区域
CCameraDS camera ;//CCameraDS类的对象
CCameraDlg *pDlg = (CCameraDlg*)param ; while(1) {
if(!pDlg->m_bImageShow) {
return 0 ; } //获取一帧 IplImage *pFrame = pDlg->camera.QueryFrame();
//左边显示窗口,显示原始图像 pDlg->m_imageL.CopyOf(pFrame); SetRect(pDlg->rectL, 0,0,pFrame->width,pFrame->height); pDlg->m_imageL.DrawToHDC(pDlg->hDCL,&(pDlg->rectL));
机器人及视觉技术实验指导书
浙江工业大学机械学院 2012 年 1 月
1
目录
第一部分:基础编程方法.................................................................................................................4 (一)、实验目的.......................................................................................................................4 (二)、实验设备.......................................................................................................................4 (三)、实验方法.......................................................................................................................4
十三、为按钮“显示图像”添加函数,调用线程函数。 void CCameraDlg::OnImageShow() {
if(!m_bCameraOpen) {
return ; } m_bImageShow = true ; AfxBeginThread(ReceiveThread, this) ; }
图 15
bool m_bImageShow ; //图像是否正在显示
图 11
十、对上述定义的部分变量进行初始化,初始化放在构造函数中。 m_iWidth = 320 ; m_iHeight = 240 ; m_bCameraOpen = false ; m_bImageShow = false ;
图 12
十一、添加按钮,实现查找摄像头,并对摄像头进行初始化。 void CCameraDlg::OnOpenCamera() {
第二部分:分组实验内容...............................................................................................................19 题目一:基于机器视觉的叶片面积测量系统...................................................................... 19 题目二:基于机器视觉的硬币计数系统.............................................................................. 19 题目三:基于机器视觉的实时测距系统.............................................................................. 19 题目四:基于机器视觉的实时定位系统.............................................................................. 19 题目五:基于机器视觉的水果识别系统.............................................................................. 20 题目六:基于机器视觉的目标位姿测定系统...................................................................... 20 题目七:基于机器视觉的形状识别系统.............................................................................. 20
图6
五、项目配置,Project —>Setting…弹出图 7 所示的对话框,选择“C++”标签 页,在“Category”中选择“preprocessor”,在“Additional include directories”中 添加“DirectShow/Include”;选择“Link”标签页,在“Category”中选择“Input”, 在“Additional include path”中添加“DirectShow/Lib”;在“Object/library modules” 中添加“cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib”。选择“C++”标签页, 在“Category”中选择“Precompiled Headers”,修改默认选项为“Automatic use of precompiled headers”。
//将代码添加到这个函数中 }
10
图 13
void CCameraDlg::OnOpenCamera() {
if(m_bCameraOpen) {
return ; } cam_count = CCameraDS::CameraCount(); if(!cam_count) {
MessageBox("未查找到摄像头!","",MB_ICONINFORMATION); } else {
十四、添加“停止显示”按钮,并为其添加函数。
14
void CCameraDlg::OnImageStop() {
//获取所有摄像头的名称 CString str ; for(int i=0; i < cam_count; i++) {
char camera_name[1024]; int retval = CCameraDS::CameraName(i, camera_name,
11
sizeof(camera_name) );
CvvImage m_imageL ;//左窗口图像数据
CvvImage m_imageR ;//右窗口图像数据
int m_iWidth;
//图像宽度百度文库
int m_iHeight;
//图像高度
bool m_bCameraOpen ;//判断图像是否已经打开,标志变量
9
int cam_count;
//摄像头数目
} else {
MessageBox("摄像头初始完毕!","",MB_ICONINFORMATION); m_bCameraOpen = true ;
12
} } } 十二、添加多线程函数,实现图像的采集和处理。
图 14
UINT CCameraDlg::ReceiveThread(void *param) {
if(retval >0) {
str.Format("编号为%d摄像机的名字为%s",i,camera_name) ; //MessageBox(str,"",MB_ICONINFORMATION); } else { str.Format("不能获得编号为%d摄像机的名字",i) ; MessageBox(str,"",MB_ICONINFORMATION); } } //左边显示窗口设置关联 pDCL = GetDlgItem(IDC_PICL)->GetDC() ; hDCL= pDCL->GetSafeHdc(); GetDlgItem(IDC_PICL)->GetClientRect(&rectL); //右边显示窗口设置关联 pDCR = GetDlgItem(IDC_PICR)->GetDC() ; hDCR= pDCR->GetSafeHdc(); GetDlgItem(IDC_PICR)->GetClientRect(&rectR); if(!camera.OpenCamera(0,0,320,240)) { MessageBox("不能打开摄像头!","",MB_ICONINFORMATION);
2
3
第一部分:基础编程方法
(一)、实验目的
1、了解 VC6.0 的运行环境及基本操作; 2、了解基于对话框的程序的编写; 3、了解 PC 机 USB 摄像头的控制; 4、熟悉数字图像的存储形式以及常用处理方法; 5、利用 VC 对摄像头对图像进行采集与处理。
(二)、实验设备
1、硬件环境:PC 机与 USB 摄像头; 2、软件环境:Windows 操作系统、VC6.0 编辑器、OpenCV1.0 开源库。
7
图7
六、编译程序,打开对话框资源,如图 8 所示。
图8
七、将“Picture”控件拖入窗口,设置合适的大小,并修改其属性,更改 ID 为 “IDC_PICL”,“IDC_PICR”。
8
图9
八、在“cameraDlg.h”中添加头文件,"camerads.h"、"highgui.h"、<cv.h>。
(三)、实验方法
编写程序前,首先下载 OpenCV1.0,下载地址: http://www.opencv.org.cn/index.php/Download ,按照网站的“VC6 下安装与配置 OpenCV1.0”,对 VC 和操作系统进行设置,正确操作完成后,按照下面的步骤 编写程序。
一、开始菜单—>Microsoft Visual Studio 6.0—> Microsoft Visual C++ 6.0,如图 1 所示,VC6.0 运行界面如图 2 所示。
4
图1
图2
二、File —>new…弹出图 3 所示的对话框。
图3
在对话框中选择“MFC AppWizard(exe)”,并在“Project name”对话框中填写程序名 称,点击“OK”退出对话框。
5
图4
三、添加文件至 camera 文件下,包括“DirectShow”文件夹、“CameraDS.cpp”和 “CameraDS.h”。
//可以添加一个函数用于图像处理,将处理后的结果显示在右边窗口 //图像处理函数到添加这里
13
//右边显示窗口,显示处理后的图像 pDlg->m_imageR.CopyOf(pFrame,1); SetRect(pDlg->rectR, 0,0,pFrame->width,pFrame->height); pDlg->m_imageR.DrawToHDC(pDlg->hDCR,&(pDlg->rectR)); //延时200毫秒 Sleep(200) ; } return 0 ; }
四、将工程文件的树形结构展开,添加“CameraDS.cpp”至“Source Files”,添加 “CameraDS.h”至“Header Files”。右键单击“Source Files”弹出菜单,选择“Add Files
6
to Folder”,弹出窗口,选择“CameraDS.cpp”文件,并确定;同理添加“CameraDS.h” 文件。添加后,这两个文件出现在目录树中。
图 10
九、在 CCameraDlg 类中(即在 cameraDlg.h 文件中),添加公共变量。
CDC *pDCL, *pDCR ;
//图形设备环境指针
HDC hDCL, hDCR ;
//设备上下文的句柄
CRect rectL, rectR;
//窗口区域
CCameraDS camera ;//CCameraDS类的对象
CCameraDlg *pDlg = (CCameraDlg*)param ; while(1) {
if(!pDlg->m_bImageShow) {
return 0 ; } //获取一帧 IplImage *pFrame = pDlg->camera.QueryFrame();
//左边显示窗口,显示原始图像 pDlg->m_imageL.CopyOf(pFrame); SetRect(pDlg->rectL, 0,0,pFrame->width,pFrame->height); pDlg->m_imageL.DrawToHDC(pDlg->hDCL,&(pDlg->rectL));
机器人及视觉技术实验指导书
浙江工业大学机械学院 2012 年 1 月
1
目录
第一部分:基础编程方法.................................................................................................................4 (一)、实验目的.......................................................................................................................4 (二)、实验设备.......................................................................................................................4 (三)、实验方法.......................................................................................................................4
十三、为按钮“显示图像”添加函数,调用线程函数。 void CCameraDlg::OnImageShow() {
if(!m_bCameraOpen) {
return ; } m_bImageShow = true ; AfxBeginThread(ReceiveThread, this) ; }
图 15
bool m_bImageShow ; //图像是否正在显示
图 11
十、对上述定义的部分变量进行初始化,初始化放在构造函数中。 m_iWidth = 320 ; m_iHeight = 240 ; m_bCameraOpen = false ; m_bImageShow = false ;
图 12
十一、添加按钮,实现查找摄像头,并对摄像头进行初始化。 void CCameraDlg::OnOpenCamera() {
第二部分:分组实验内容...............................................................................................................19 题目一:基于机器视觉的叶片面积测量系统...................................................................... 19 题目二:基于机器视觉的硬币计数系统.............................................................................. 19 题目三:基于机器视觉的实时测距系统.............................................................................. 19 题目四:基于机器视觉的实时定位系统.............................................................................. 19 题目五:基于机器视觉的水果识别系统.............................................................................. 20 题目六:基于机器视觉的目标位姿测定系统...................................................................... 20 题目七:基于机器视觉的形状识别系统.............................................................................. 20
图6
五、项目配置,Project —>Setting…弹出图 7 所示的对话框,选择“C++”标签 页,在“Category”中选择“preprocessor”,在“Additional include directories”中 添加“DirectShow/Include”;选择“Link”标签页,在“Category”中选择“Input”, 在“Additional include path”中添加“DirectShow/Lib”;在“Object/library modules” 中添加“cxcore.lib cv.lib cvaux.lib highgui.lib cvcam.lib”。选择“C++”标签页, 在“Category”中选择“Precompiled Headers”,修改默认选项为“Automatic use of precompiled headers”。
//将代码添加到这个函数中 }
10
图 13
void CCameraDlg::OnOpenCamera() {
if(m_bCameraOpen) {
return ; } cam_count = CCameraDS::CameraCount(); if(!cam_count) {
MessageBox("未查找到摄像头!","",MB_ICONINFORMATION); } else {
十四、添加“停止显示”按钮,并为其添加函数。
14
void CCameraDlg::OnImageStop() {
//获取所有摄像头的名称 CString str ; for(int i=0; i < cam_count; i++) {
char camera_name[1024]; int retval = CCameraDS::CameraName(i, camera_name,
11
sizeof(camera_name) );
CvvImage m_imageL ;//左窗口图像数据
CvvImage m_imageR ;//右窗口图像数据
int m_iWidth;
//图像宽度百度文库
int m_iHeight;
//图像高度
bool m_bCameraOpen ;//判断图像是否已经打开,标志变量
9
int cam_count;
//摄像头数目
} else {
MessageBox("摄像头初始完毕!","",MB_ICONINFORMATION); m_bCameraOpen = true ;
12
} } } 十二、添加多线程函数,实现图像的采集和处理。
图 14
UINT CCameraDlg::ReceiveThread(void *param) {
if(retval >0) {
str.Format("编号为%d摄像机的名字为%s",i,camera_name) ; //MessageBox(str,"",MB_ICONINFORMATION); } else { str.Format("不能获得编号为%d摄像机的名字",i) ; MessageBox(str,"",MB_ICONINFORMATION); } } //左边显示窗口设置关联 pDCL = GetDlgItem(IDC_PICL)->GetDC() ; hDCL= pDCL->GetSafeHdc(); GetDlgItem(IDC_PICL)->GetClientRect(&rectL); //右边显示窗口设置关联 pDCR = GetDlgItem(IDC_PICR)->GetDC() ; hDCR= pDCR->GetSafeHdc(); GetDlgItem(IDC_PICR)->GetClientRect(&rectR); if(!camera.OpenCamera(0,0,320,240)) { MessageBox("不能打开摄像头!","",MB_ICONINFORMATION);
2
3
第一部分:基础编程方法
(一)、实验目的
1、了解 VC6.0 的运行环境及基本操作; 2、了解基于对话框的程序的编写; 3、了解 PC 机 USB 摄像头的控制; 4、熟悉数字图像的存储形式以及常用处理方法; 5、利用 VC 对摄像头对图像进行采集与处理。
(二)、实验设备
1、硬件环境:PC 机与 USB 摄像头; 2、软件环境:Windows 操作系统、VC6.0 编辑器、OpenCV1.0 开源库。
7
图7
六、编译程序,打开对话框资源,如图 8 所示。
图8
七、将“Picture”控件拖入窗口,设置合适的大小,并修改其属性,更改 ID 为 “IDC_PICL”,“IDC_PICR”。
8
图9
八、在“cameraDlg.h”中添加头文件,"camerads.h"、"highgui.h"、<cv.h>。
(三)、实验方法
编写程序前,首先下载 OpenCV1.0,下载地址: http://www.opencv.org.cn/index.php/Download ,按照网站的“VC6 下安装与配置 OpenCV1.0”,对 VC 和操作系统进行设置,正确操作完成后,按照下面的步骤 编写程序。
一、开始菜单—>Microsoft Visual Studio 6.0—> Microsoft Visual C++ 6.0,如图 1 所示,VC6.0 运行界面如图 2 所示。
4
图1
图2
二、File —>new…弹出图 3 所示的对话框。
图3
在对话框中选择“MFC AppWizard(exe)”,并在“Project name”对话框中填写程序名 称,点击“OK”退出对话框。
5
图4
三、添加文件至 camera 文件下,包括“DirectShow”文件夹、“CameraDS.cpp”和 “CameraDS.h”。
//可以添加一个函数用于图像处理,将处理后的结果显示在右边窗口 //图像处理函数到添加这里
13
//右边显示窗口,显示处理后的图像 pDlg->m_imageR.CopyOf(pFrame,1); SetRect(pDlg->rectR, 0,0,pFrame->width,pFrame->height); pDlg->m_imageR.DrawToHDC(pDlg->hDCR,&(pDlg->rectR)); //延时200毫秒 Sleep(200) ; } return 0 ; }