|
1.使用向?qū)?chuàng)建基于對(duì)話框的應(yīng)用程序。
2.環(huán)境變量設(shè)置,這步只要配置一次就可以。具體可以參加相關(guān)文章。
3.添加附加庫halconcpp.lib,project->properties->configuration
properties->linker->Input->Additional
dependecies后面添加。
4.添加頭文件和命名空間
在***Dlg.h頭文件中添加如下的頭文件和命名空間:
#include
"halconcpp.h"
using
namespace
Halcon;
5.創(chuàng)建halcon顯示窗口
5.1定義窗口句柄(在***Dlg.h頭文件中添加):HTuple
m_HWindowID
5.2添加初始化窗口函數(shù)(在***Dlg.h頭文件中添加):public:void
InitHalconWindow();
5.3在對(duì)話框窗口添加一Picture控件,ID為:IDC_PIC_HWINDOW,用于顯示圖像。
5.4實(shí)例化初始化窗口函數(shù)(在***Dlg.cpp文件中添加),如下所示:
void C***Dlg::InitHalconWindow()
{
//定義顯示的起點(diǎn)和長(zhǎng)寬高
HTuple
HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
//定義窗口ID
HTuple
HWindowID;
//定義一個(gè)CRect類的對(duì)象,用于獲取圖像框的尺寸和位置
CRect
Rect;
CWnd
*pWnd =
GetDlgItem(IDC_PIC_HWINDOW);
CDC
*pDC =
pWnd->GetDC();
pWnd->GetWindowRect(&Rect);
//設(shè)置顯示窗口的起點(diǎn)和寬高
HWindowRow
= 0;
HWindowColumn
= 0;
HWindowWidth
= Rect.Width();
HWindowHeight
= Rect.Height();
//設(shè)定固定的窗口大小,而不是根據(jù)控件大小設(shè)定
//GetDlgItem(IDC_PIC_HWINDOW)->SetWindowPos(NULL,0,0,322,242,SWP_NOZORDER
| SWP_NOMOVE);
try
{
set_window_attr("border_width",0);
//獲取當(dāng)前窗口指針
HWindowID
= (Hlong)pWnd->m_hWnd;
set_check("~father");
open_window(HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight,HWindowID,"visible","",&m_HWindowID);
set_check("father");
//設(shè)置顯示模式是margin(邊緣)
set_draw(m_HWindowID,"margin");
}
catch
(HException&
except)
{
TRACE(except.message);
}
}
然后把此函數(shù)放到程序的初始化函數(shù)中(即放到OnInitDialog()函數(shù)中),之后程序運(yùn)行就可以打開窗口,窗口句柄為m_HWindowID。
6添加打開相機(jī)的函數(shù)
6.1定義相機(jī)句柄和圖像的寬高(在***Dlg.h頭文件中添加):HTuple
m_FGHandle,m_ImageWidth, m_ImageHeight;
6.2定義打開相機(jī)函數(shù)(在***Dlg.h頭文件中添加):void
OpenCam(CString strCamDrv);
6.3打開相機(jī)的函數(shù)實(shí)例化(在***Dlg.cpp文件中添加),如下所示:
void C***Dlg::OpenCam()
{
try
{
//根據(jù)使用的相機(jī),選擇合適的參數(shù)
open_framegrabber("DirectShow",
1, 1,
0, 0,
0, 0,
"default", 8, "rgb",
-1,
"false", "default", "USB
視頻設(shè)備", 0, -1, &m_FGHandle);
//設(shè)置相機(jī)參數(shù)的一些算子
//……
//打開異步采集
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);
//使圖像顯示適應(yīng)窗口大小
set_part(m_HWindowID,
0, 0,
m_ImageHeight - 1, m_ImageWidth -1);
}
catch
(HException&
except)
{
TRACE(except.message);
}
}
然后把此函數(shù)放到程序的初始化函數(shù)中(即放到OnInitDialog()函數(shù)中),之后程序運(yùn)行就可以打開相機(jī),相機(jī)句柄為m_FGHandle。當(dāng)然也可以放到其他合適的地方。
7添加線程函數(shù),用于實(shí)時(shí)采集圖像和處理
7.1定義:添加線程布爾變量、線程句柄、事件和ID
//是否采集布爾變量
BOOL
m_bStartSnap;
//線程句柄和事件
HANDLE
m_hSnapHandle, m_hEvent;
//線程ID
DWORD
m_dwThreadID;
//定義采集到的圖像對(duì)象
Hobject
m_LiveImage;
//定義線程函數(shù)
Static
DWORD CALLBACK SnapThread(LPVOID lpParam);
7.2添加線程體函數(shù)如下:
DWORD WINAPI C***Dlg::SnapThread(LPVOID lpParam)
{
CGrabberDlg
*pDlg =
(C***Dlg *)AfxGetApp()->m_pMainWnd;
Hobject
SymbolRegions;
try
{
while
(pDlg->m_bStartSnap)
{
//抓取圖像
grab_image(&pDlg->m_LiveImage,pDlg->m_FGHandle);
//窗口中顯示圖像
disp_obj(pDlg->m_LiveImage,
pDlg->m_HWindowID);
if
(pDlg->m_bStartInc)
{
//處理采集的圖像
{
pDlg->BarCodeInc(pDlg->m_LiveImage);
}
}
}
}
catch
(HException&
except)
{
TRACE(except.message);
}
return
0;
}
7.3添加按鈕創(chuàng)建線程,在.2中描述了創(chuàng)建線程體函數(shù)的過程,這一段主要描述怎樣創(chuàng)建線程,上.2中的線程體函數(shù)開始運(yùn)行。
在OnInitDialog()初始化函數(shù)中初始化采集圖像的布爾變量,m_bStartSnap =
FALSE;
在對(duì)畫框中添加一個(gè)按鈕,ID為:IDC_BUTTON_STARTSNAP,名稱為開始采集。為此按鈕添加事件如下:
void C***Dlg::OnBnClickedButtonStartsnap()
{
//
TODO: Add your control notification handler code here
DWORD
dwExit = 0;
MSG
msg;
if
(!m_bStartSnap)
{
//采集圖像的布爾變量為TRUE
m_bStartSnap
= TRUE;
m_hEvent
=
CreateEvent(NULL,TRUE,FALSE,NULL);
//創(chuàng)建線程
m_hSnapHandle=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)SnapThread, m_hEvent, 0, &m_dwThreadID);
SetEvent(m_hEvent);
}
else
{
m_bStartSnap
= FALSE;
do
{
Sleep(1);
GetExitCodeThread(m_hSnapHandle,
&dwExit);
if
(::PeekMessage(&msg, NULL, 0, 0,
PM_REMOVE))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}while(dwExit
== STILL_ACTIVE);
//關(guān)閉線程和事件
CloseHandle(m_hEvent);
CloseHandle(m_hSnapHandle);
}
}
完成以上七步以后,運(yùn)行程序,點(diǎn)擊開始采集按鈕,如果連接上相機(jī)的話此時(shí)在窗口中會(huì)實(shí)時(shí)顯示采集到的圖像。
8添加煙盒一維條碼識(shí)別程序。
把編寫好的Hdev程序?qū)С鯟PP文件,從cpp文件中找出我們需要部分,添加到程序中。
8.1定義條碼識(shí)別的各種變量,包括條碼句柄、條碼類型和識(shí)別的條碼結(jié)果。
HTuple
m_BarCodeHandle, m_CodeTypes,
m_DecodedDataStrings;
8.2在OnInitDialog()初始化函數(shù)中創(chuàng)建條碼句柄和設(shè)置條碼類型,如下所示:
create_bar_code_model(HTuple(),
HTuple(), &m_BarCodeHandle);
m_CodeTypes
= "auto";
8.3添加條碼識(shí)別函數(shù)
定義://條碼識(shí)別函數(shù)
void BarCodeInc(Hobject
Image);
實(shí)例化該函數(shù)的代碼如下:
void C***Dlg::BarCodeInc(Hobject Image)
{
Hobject
SymbolRegions;
try
{
//在圖像中找到條碼并進(jìn)行識(shí)別
//find_bar_code(Image,
&SymbolRegions, m_BarCodeHandle, m_CodeTypes,
&m_DecodedDataStrings);
//設(shè)置條碼的顯示位置
//set_tposition(m_HWindowID2,
24, 12);
//在窗口的相應(yīng)位置顯示是別的條碼數(shù)據(jù)
//write_string(m_HWindowID,
"條碼:"+m_DecodedDataStrings);
//用于測(cè)試
threshold(Image,&SymbolRegions,0,125);
disp_obj(SymbolRegions,m_HWindowID);
}
catch
(HException&
except)
{
TRACE(except.message);
}
}
8.4在對(duì)話框界面中添加一個(gè)按鈕控件,ID為:
IDC_BUTTON_STARTINC,名稱為:開始檢測(cè)
雙擊此按鈕控件添加一個(gè)消息響應(yīng)函數(shù):void
C***Dlg::OnBnClickedButtonStartinc()
定義:在***Dlg.h中添加一個(gè)是否開始檢測(cè)的布爾變量:BOOL
m_bStartInc,并在OnInitDialog()初始化函數(shù)中把布爾變量設(shè)置為: bStartInc =
FALSE;
在OnBnClickedButtonStartinc()函數(shù)中添加如下內(nèi)容:
void CGrabberDlg::OnBnClickedButtonStartinc()
{
//
TODO: Add your control notification handler code here
if
(!m_bStartInc)
{
m_bStartInc
= TRUE;
}
else
{
m_bStartInc
= FALSE;
}
}
8.5在SnapThread(LPVOID
lpParam)函數(shù)中添加如下內(nèi)容:
if
(pDlg->m_bStartInc)
{
//處理采集的圖像
{
pDlg->BarCodeInc(pDlg->m_LiveImage);
}
}nbsp;//定義窗口ID
&//定義一個(gè)CRect類的對(duì)象,用于獲取圖像框的尺寸和位置
&
&*pWnd = GetDlgItem(IDC_PIC_HWINDOW);
&*pDC = pWnd-&GetDC();
|