#include"halconcpp.h"
usingnamespaceHalcon;
void C***Dlg::InitHalconWindow()
{
//定义显示的起点和长宽高
HTupleHWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
//定义窗口ID
HTupleHWindowID;
//定义一个CRect类的对象,用于获取图像框的尺寸和位置
CRectRect;
CWnd*pWnd =GetDlgItem(IDC_PIC_HWINDOW);
CDC*pDC =pWnd->GetDC();
pWnd->GetWindowRect(&Rect);
//设置显示窗口的起点和宽高
HWindowRow= 0;
HWindowColumn= 0;
HWindowWidth= Rect.Width();
HWindowHeight= Rect.Height();
//设定固定的窗口大小,而不是根据控件大小设定
//GetDlgItem(IDC_PIC_HWINDOW)->SetWindowPos(NULL,0,0,322,242,SWP_NOZORDER| SWP_NOMOVE);
try
{
set_window_attr("border_width",0);
//获取当前窗口指针
HWindowID= (Hlong)pWnd->m_hWnd;
set_check("~father");
open_window(HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight,HWindowID,"visible","",&m_HWindowID);
set_check("father");
//设置显示模式是margin(边缘)
set_draw(m_HWindowID,"margin");
}
catch(HException&except)
{
TRACE(except.message);
}
}
void C***Dlg::OpenCam()
{
try
{
//根据使用的相机,选择合适的参数
open_framegrabber("DirectShow",1, 1,0, 0,0, 0,"default", 8, "rgb",-1,"false", "default", "USB视频设备", 0, -1, &m_FGHandle);
//设置相机参数的一些算子
//……
//打开异步采集
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);
}
catch(HException&except)
{
TRACE(except.message);
}
}
//是否采集布尔变量
BOOLm_bStartSnap;
//线程句柄和事件
HANDLEm_hSnapHandle, m_hEvent;
//线程ID
DWORDm_dwThreadID;
//定义采集到的图像对象
Hobjectm_LiveImage;
//定义线程函数
StaticDWORD CALLBACK SnapThread(LPVOID lpParam);
DWORD WINAPI C***Dlg::SnapThread(LPVOID lpParam)
{
CGrabberDlg*pDlg =(C***Dlg *)AfxGetApp()->m_pMainWnd;
HobjectSymbolRegions;
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);
}
return0;
}
void C***Dlg::OnBnClickedButtonStartsnap()
{
//TODO: Add your control notification handler code here
DWORDdwExit = 0;
MSGmsg;
if(!m_bStartSnap)
{
//采集图像的布尔变量为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
{
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);
}
}
HTuplem_BarCodeHandle, m_CodeTypes,m_DecodedDataStrings;
create_bar_code_model(HTuple(),HTuple(), &m_BarCodeHandle);
m_CodeTypes= "auto";
void C***Dlg::BarCodeInc(Hobject Image)
{
HobjectSymbolRegions;
try
{
//在图像中找到条码并进行识别
//find_bar_code(Image,&SymbolRegions, m_BarCodeHandle, m_CodeTypes,&m_DecodedDataStrings);
//设置条码的显示位置
//set_tposition(m_HWindowID2,24, 12);
//在窗口的相应位置显示是别的条码数据
//write_string(m_HWindowID,"条码:"+m_DecodedDataStrings);
//用于测试
threshold(Image,&SymbolRegions,0,125);
disp_obj(SymbolRegions,m_HWindowID);
}
catch(HException&except)
{
TRACE(except.message);
}
}
void CGrabberDlg::OnBnClickedButtonStartinc()
{
//TODO: Add your control notification handler code here
if(!m_bStartInc)
{
m_bStartInc= TRUE;
}
else
{
m_bStartInc= FALSE;
}
}
if(pDlg->m_bStartInc)
{
//处理采集的图像
{
pDlg->BarCodeInc(pDlg->m_LiveImage);
}
}nbsp;//定义窗口ID
&//定义一个CRect类的对象,用于获取图像框的尺寸和位置
&
&*pWnd = GetDlgItem(IDC_PIC_HWINDOW);
&*pDC = pWnd-&GetDC();
联系客服