HALCON到VC说明文档
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
然后把此函数放到程序的初始化函数中(即放到 OnInitDialog()函数中),之后程序运行就可以 打开窗口,窗口句柄为 m_HWindowID
3、 添加打开相机的函数 定义相机句柄和图像的宽高(在 SrcDlg.h 头文件中添加): HTuple m_FGHandle,m_ImageWidth, m_ImageHeight; 定义打开相机函数(在 SrcDlg.h 头文件中添加): //打开相机 void OpenCam(CString strCamDrv); 打开相机的函数实例化(在 SrcDlg.cpp 文件中添加)
set_window_attr("border_width",0); //获取当前窗口指针 HWindowID = (Hlong)pWnd->m_hWnd; set_check("~father"); open_window(HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight,
CRect Rect;
CWnd *pWnd = GetDlgItem(IDC_PIC_HWINDOW); CDC *pDC = pWnd->GetDC(); pWnd->GetWindowRect(&Rect); //设置显示窗口的起点和宽高 HWindowRow = 0; HWindowColumn = 0; HWindowWidth = Rect.Width(); HWindowHeight = Rect.Height(); try {
Sleep(1); GetExitCodeThread(m_hSnapHandle, &dwExit); if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg); ::DispatchMessage(&msg); } }while(dwExit == STILL_ACTIVE); //关闭线程和事件 CloseHandle(m_hEvent); CloseHandle(m_hSnapHandle); } }
void BarCodeInc(Hobject Image); 实例化函数:
void CSrcDlg::BarCodeInc(Hobject Image) {
Hobject SymbolRegions; HTuple Number, Start;
try {
//在图像中找到条码并进行识别 find_bar_code(Image, &SymbolRegions, m_BarCodeHandle, m_CodeTypes, &m_DecodedDataStrings); //设置条码的显示位置 set_tposition(m_HWindowID, 24, 12); //在窗口的相应位置显示是别的条码数据 write_string(m_HWindowID, "条码:"+m_DecodedDataStrings); } catch (HException& except) { TRACE(except.message); } }
void CSrcDlg::OnButtonStartincrtInc = TRUE; } else {
//窗口中显示图像 disp_obj(pDlg->m_LiveImage, pDlg->m_HWindowID);
}
}
catch (HException& except)
{
TRACE(except.message);
}
return 0;
}
5、 添加按钮创建线程,在 4 中描述了创建线程体函数的过程,这一段主要描述怎样创建线 程,上 4 中的线程体函数开始运行。 在 OnInitDialog()初始化函数中初始化采集图像的布尔变量, m_bStartSnap = FALSE; 在对画框中添加一个按钮,ID 为:IDC_BUTTON_STARTSNAP,名称为开始采集。双击此
//采集图像的布尔变量为 TRUE m_bStartSnap = TRUE; m_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建线程 m_hSnapHandle=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)SnapThread, m_hEvent, 0, &m_dwThreadID); SetEvent(m_hEvent); } else { m_bStartSnap = FALSE; do{
catchhexceptionexcept然后把此函数放到程序的初始化函数中即放到oninitdialog函数中之后程序运行就可以打开窗口窗口句柄为mhwindowid添加打开相机的函数定义相机句柄和图像的宽高在srcdlgh头文件中添加
一、 创建 MFC 首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下,工程名为 Src
void CSrcDlg::InitHalconWindow()
{
//定义显示的起点和长宽高
HTuple
HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
//定义窗口 ID
HTuple HWindowID;
//定义一个 CRect 类的对象,用于获取图像框的尺寸和位置
按钮,此时会出现一个添加函数的对话框,点击 OK 按钮,添加一个函数:void CSrcDlg::OnButtonStartsnap() ,然后在此函数中添加如下代码:
void CSrcDlg::OnButtonStartsnap() {
DWORD dwExit = 0; MSG msg; if (!m_bStartSnap) {
DWORD WINAPI CSrcDlg::SnapThread(LPVOID lpParam)
{
CSrcDlg *pDlg = (CSrcDlg *)AfxGetMainWnd();
try
{
while (pDlg->m_bStartSnap)
{ //抓取图像 grab_image(&pDlg->m_LiveImage,pDlg->m_FGHandle);
HWindowID,"visible","",&m_HWindowID); set_check("father"); //设置显示模式是 margin(边缘) set_draw(m_HWindowID,"margin"); } catch (HException& except) { TRACE(except.message); } }
catch (HException& except)
{
TRACE(except.message);
}
}
然后把此函数放到程序的初始化函数中(即放到 OnInitDialog()函数中),之后程序运行就可 以打开相机,相机句柄为 m_FGHandle。 4、 添加线程函数,用于实时采集图像和处理 定义:添加线程布尔变量、线程句柄、事件和 ID //是否采集布尔变量 BOOL m_bStartSnap; //线程句柄和事件 HANDLE m_hSnapHandle, m_hEvent; //线程 ID DWORD m_dwThreadID; 定义采集到的图像对象 Hobject m_LiveImage; 定义线程函数 Static DWORD CALLBACK SnapThread(LPVOID lpParam); 添加线程体函数
Additional library path 下面添加$(HALCONROOT)\lib\$(HALCONARCH)路径。
3、 Project 菜单->Settings->C/C++,在 Category 下拉菜单下选择 Preprocessor,在此属性页中
的
Additional
include
directories
二、 环境变量设置
1、 Project 菜单->Settings->Link,在 Category 下拉菜单下选择 General,在此属性页中的
Object/library modules 下面添加 halconcpp.lib 静态库。
2、 Project 菜单->Settings->Link,在 Category 下拉菜单下选择 Input,在此属性页中的
2、 创建 halcon 显示窗口 定义窗口句柄(在 SrcDlg.h 头文件中添加): HTuple m_HWindowID 添加初始化窗口函数(在 SrcDlg.h 头文件中添加):
public: //初始化 HALCON 显示窗口 void InitHalconWindow(); 在对话框窗口添加一 Picture 控件,ID 为:IDC_PIC_HWINDOW,在此控件上显示图像。 实例化初始化窗口函数(在 SrcDlg.cpp 文件中添加),如下所示:
下添加
$(HALCONROOT)\include,$(HALCONROOT)\include\cpp 路径。
以上设置如下图所示:
三、 添加程序 1、 添加头文件和命名空间,
在 SrcDlg.h 头文件中添加如下的头文件和命名空间: #include "halconcpp.h" using namespace Halcon; 如下图所示:
4、 在对话框界面中添加一个按钮控件,ID 为: IDC_BUTTON_STARTINC,名称为:开始检测 双击此按钮控件添加一个消息响应函数:void CSrcDlg::OnButtonStartinc() 定义:在 SrcDlg.h 中添加一个是否开始检测的布尔变量:BOOL m_bStartInc,并在 OnInitDialog()初始化函数中把布尔变量设置为: bStartInc = FALSE; 在 OnButtonStartinc()函数中添加如下内容:
void CSrcDlg::OpenCam(CString strCamDrv) {
try {
//大恒相机 open_framegrabber(“DahengCAM”,
1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "default", "default", "1", 1, -1, &m_FGHandle); //设置相机曝光时间单位为微妙 set_framegrabber_param(m_FGHandle,"shutter_unit","ms"); //设置相机增益 set_framegrabber_param(m_FGHandle,"gain",100); //设置相机曝光时间 set_framegrabber_param(m_FGHandle,"shutter", 60); //打开异步采集 grab_image_start(m_FGHandle, -1); //采集一副图像 grab_image_async(&m_LiveImage, m_FGHandle, -1); //得到图像的宽高和指针 get_image_pointer1(m_LiveImage, NULL, NULL, &m_ImageWidth, &m_ImageHeight); //使图像显示适应窗口大小 set_part(m_HWindowID, 0, 0, m_ImageHeight - 1, m_ImageWidth -1); }
6、 运行程序,点击开始采集按钮,如果连接上相机的话此时在窗口中会实时显示采集到的 图像。
四、 添加烟盒一维条码识别程序。 把编写好的 Hdev 程序导出 CPP 文件,从 cpp 文件中找出我们需要部分,添加到程序中。 1、 定义,条码识别的各种变量,条码句柄、条码类型和识别的条码结果。 HTuple m_BarCodeHandle, m_CodeTypes, m_DecodedDataStrings; 2、 在 OnInitDialog()初始化函数中创建条码句柄和设置条码类型,如下所示: create_bar_code_model(HTuple(), HTuple(), &m_BarCodeHandle); m_CodeTypes = "auto"; 3、 添加条码识别函数 定义://条码识别函数
3、 添加打开相机的函数 定义相机句柄和图像的宽高(在 SrcDlg.h 头文件中添加): HTuple m_FGHandle,m_ImageWidth, m_ImageHeight; 定义打开相机函数(在 SrcDlg.h 头文件中添加): //打开相机 void OpenCam(CString strCamDrv); 打开相机的函数实例化(在 SrcDlg.cpp 文件中添加)
set_window_attr("border_width",0); //获取当前窗口指针 HWindowID = (Hlong)pWnd->m_hWnd; set_check("~father"); open_window(HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight,
CRect Rect;
CWnd *pWnd = GetDlgItem(IDC_PIC_HWINDOW); CDC *pDC = pWnd->GetDC(); pWnd->GetWindowRect(&Rect); //设置显示窗口的起点和宽高 HWindowRow = 0; HWindowColumn = 0; HWindowWidth = Rect.Width(); HWindowHeight = Rect.Height(); try {
Sleep(1); GetExitCodeThread(m_hSnapHandle, &dwExit); if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
::TranslateMessage(&msg); ::DispatchMessage(&msg); } }while(dwExit == STILL_ACTIVE); //关闭线程和事件 CloseHandle(m_hEvent); CloseHandle(m_hSnapHandle); } }
void BarCodeInc(Hobject Image); 实例化函数:
void CSrcDlg::BarCodeInc(Hobject Image) {
Hobject SymbolRegions; HTuple Number, Start;
try {
//在图像中找到条码并进行识别 find_bar_code(Image, &SymbolRegions, m_BarCodeHandle, m_CodeTypes, &m_DecodedDataStrings); //设置条码的显示位置 set_tposition(m_HWindowID, 24, 12); //在窗口的相应位置显示是别的条码数据 write_string(m_HWindowID, "条码:"+m_DecodedDataStrings); } catch (HException& except) { TRACE(except.message); } }
void CSrcDlg::OnButtonStartincrtInc = TRUE; } else {
//窗口中显示图像 disp_obj(pDlg->m_LiveImage, pDlg->m_HWindowID);
}
}
catch (HException& except)
{
TRACE(except.message);
}
return 0;
}
5、 添加按钮创建线程,在 4 中描述了创建线程体函数的过程,这一段主要描述怎样创建线 程,上 4 中的线程体函数开始运行。 在 OnInitDialog()初始化函数中初始化采集图像的布尔变量, m_bStartSnap = FALSE; 在对画框中添加一个按钮,ID 为:IDC_BUTTON_STARTSNAP,名称为开始采集。双击此
//采集图像的布尔变量为 TRUE m_bStartSnap = TRUE; m_hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); //创建线程 m_hSnapHandle=CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)SnapThread, m_hEvent, 0, &m_dwThreadID); SetEvent(m_hEvent); } else { m_bStartSnap = FALSE; do{
catchhexceptionexcept然后把此函数放到程序的初始化函数中即放到oninitdialog函数中之后程序运行就可以打开窗口窗口句柄为mhwindowid添加打开相机的函数定义相机句柄和图像的宽高在srcdlgh头文件中添加
一、 创建 MFC 首先创建一个 MFC 对话框应用程序(Dialog-based Application)如下,工程名为 Src
void CSrcDlg::InitHalconWindow()
{
//定义显示的起点和长宽高
HTuple
HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
//定义窗口 ID
HTuple HWindowID;
//定义一个 CRect 类的对象,用于获取图像框的尺寸和位置
按钮,此时会出现一个添加函数的对话框,点击 OK 按钮,添加一个函数:void CSrcDlg::OnButtonStartsnap() ,然后在此函数中添加如下代码:
void CSrcDlg::OnButtonStartsnap() {
DWORD dwExit = 0; MSG msg; if (!m_bStartSnap) {
DWORD WINAPI CSrcDlg::SnapThread(LPVOID lpParam)
{
CSrcDlg *pDlg = (CSrcDlg *)AfxGetMainWnd();
try
{
while (pDlg->m_bStartSnap)
{ //抓取图像 grab_image(&pDlg->m_LiveImage,pDlg->m_FGHandle);
HWindowID,"visible","",&m_HWindowID); set_check("father"); //设置显示模式是 margin(边缘) set_draw(m_HWindowID,"margin"); } catch (HException& except) { TRACE(except.message); } }
catch (HException& except)
{
TRACE(except.message);
}
}
然后把此函数放到程序的初始化函数中(即放到 OnInitDialog()函数中),之后程序运行就可 以打开相机,相机句柄为 m_FGHandle。 4、 添加线程函数,用于实时采集图像和处理 定义:添加线程布尔变量、线程句柄、事件和 ID //是否采集布尔变量 BOOL m_bStartSnap; //线程句柄和事件 HANDLE m_hSnapHandle, m_hEvent; //线程 ID DWORD m_dwThreadID; 定义采集到的图像对象 Hobject m_LiveImage; 定义线程函数 Static DWORD CALLBACK SnapThread(LPVOID lpParam); 添加线程体函数
Additional library path 下面添加$(HALCONROOT)\lib\$(HALCONARCH)路径。
3、 Project 菜单->Settings->C/C++,在 Category 下拉菜单下选择 Preprocessor,在此属性页中
的
Additional
include
directories
二、 环境变量设置
1、 Project 菜单->Settings->Link,在 Category 下拉菜单下选择 General,在此属性页中的
Object/library modules 下面添加 halconcpp.lib 静态库。
2、 Project 菜单->Settings->Link,在 Category 下拉菜单下选择 Input,在此属性页中的
2、 创建 halcon 显示窗口 定义窗口句柄(在 SrcDlg.h 头文件中添加): HTuple m_HWindowID 添加初始化窗口函数(在 SrcDlg.h 头文件中添加):
public: //初始化 HALCON 显示窗口 void InitHalconWindow(); 在对话框窗口添加一 Picture 控件,ID 为:IDC_PIC_HWINDOW,在此控件上显示图像。 实例化初始化窗口函数(在 SrcDlg.cpp 文件中添加),如下所示:
下添加
$(HALCONROOT)\include,$(HALCONROOT)\include\cpp 路径。
以上设置如下图所示:
三、 添加程序 1、 添加头文件和命名空间,
在 SrcDlg.h 头文件中添加如下的头文件和命名空间: #include "halconcpp.h" using namespace Halcon; 如下图所示:
4、 在对话框界面中添加一个按钮控件,ID 为: IDC_BUTTON_STARTINC,名称为:开始检测 双击此按钮控件添加一个消息响应函数:void CSrcDlg::OnButtonStartinc() 定义:在 SrcDlg.h 中添加一个是否开始检测的布尔变量:BOOL m_bStartInc,并在 OnInitDialog()初始化函数中把布尔变量设置为: bStartInc = FALSE; 在 OnButtonStartinc()函数中添加如下内容:
void CSrcDlg::OpenCam(CString strCamDrv) {
try {
//大恒相机 open_framegrabber(“DahengCAM”,
1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "default", "default", "1", 1, -1, &m_FGHandle); //设置相机曝光时间单位为微妙 set_framegrabber_param(m_FGHandle,"shutter_unit","ms"); //设置相机增益 set_framegrabber_param(m_FGHandle,"gain",100); //设置相机曝光时间 set_framegrabber_param(m_FGHandle,"shutter", 60); //打开异步采集 grab_image_start(m_FGHandle, -1); //采集一副图像 grab_image_async(&m_LiveImage, m_FGHandle, -1); //得到图像的宽高和指针 get_image_pointer1(m_LiveImage, NULL, NULL, &m_ImageWidth, &m_ImageHeight); //使图像显示适应窗口大小 set_part(m_HWindowID, 0, 0, m_ImageHeight - 1, m_ImageWidth -1); }
6、 运行程序,点击开始采集按钮,如果连接上相机的话此时在窗口中会实时显示采集到的 图像。
四、 添加烟盒一维条码识别程序。 把编写好的 Hdev 程序导出 CPP 文件,从 cpp 文件中找出我们需要部分,添加到程序中。 1、 定义,条码识别的各种变量,条码句柄、条码类型和识别的条码结果。 HTuple m_BarCodeHandle, m_CodeTypes, m_DecodedDataStrings; 2、 在 OnInitDialog()初始化函数中创建条码句柄和设置条码类型,如下所示: create_bar_code_model(HTuple(), HTuple(), &m_BarCodeHandle); m_CodeTypes = "auto"; 3、 添加条码识别函数 定义://条码识别函数