halcon基本,vb,vc连接halcon读取图像,视频

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
halcon学习方法安装完halcon之后,在开始里出现一些文档
看完solution_guide_i.pdf就算是入门了,里面讲了大部分应用的需要的步骤及所用算法

quick_guide.pdf
快速入门halcon

hdevelop_users_guide.pdf
详细讲解在hdevelop中使用halcon,及hdevelop的操作

programmers_guide.pdf
详细讲解在高级语言中的使用halcon

reference_hdevelop.pdf
讲解各个算子

安装完halcon会自动添加一个环境变量%HALCONROOT%,比如指向C:\Program Files\MVTec\HALCON-10.0
%HALCONROOT%\examples目录下是各种高级语言使用halcon的源码例子


http://blog.csdn.net/wgluser/article/category/1183275
http://blog.sina.com.cn/s/articlelist_1143733774_0_1.html


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vb中使用halcon窗口加载图像
1.读取图像
read_image (Lena,'F:/image/lena.jpg')
get_image_size (Lena,Width,Height)
dev_close_window ()
dev_open_window (0,Width/2,Height/2,'black',WindowHandle)
set_display_font (WindowHandle,14,'mono','true','false')
dev_display (Lena)
disp_continue_message (WindowHandle,'true')
stop ()
2.导出vb的bas代码
选择文件/导出,弹出

注意:此处选择使用halcon窗口
3.vb中调用read_image.bas
先看一下read_image.bas的内容,可知在需要的地方直接调用main即可

...

' Main procedure
Private Sub action()

  ' Local iconic variables
  Dim ho_Lena As HUntypedobjectX


  ' Local control variables
  Dim hv_Width As Variant,hv_Height As Variant
  Dim hv_WindowHandle As Variant


  Call Op.ReadImage(ho_Lena,"F:/image/lena.jpg")
  Call Op.GetimageSize(ho_Lena,hv_Width,hv_Height)
  If COMExpWinHandleStack.Isopen() Then
    Op.CloseWindow (COMExpWinHandleStack.Pop())
  End If
  Call Op.SetwindowAttr("background_color","black")
  Call Op.OpenWindow(0,Tuple.TupleDiv( _
      hv_Width,2),Tuple.TupleDiv(hv_Height,"",hv_WindowHandle)
  COMExpWinHandleStack.Push (hv_WindowHandle)
  Call set_display_font(hv_WindowHandle,"mono","true","false")
  If COMExpWinHandleStack.Isopen() Then
    Call Op.dispObj(ho_Lena,COMExpWinHandleStack.GetActive())
  End If
  Call disp_continue_message(hv_WindowHandle,"black","true")
  HDevelopStop
End Sub



#If Not NO_EXPORT_APP_MAIN Then
Sub InitHalcon()
  ' Default settings used in HDevelop
  Call Op.SetSystem("do_low_error","false")
End Sub

Sub Main()
  Call InitHalcon
  Call action
End Sub

#End If
3.1.新建一个exe的project,然后保存,然后添加read_image.bas文件到此project

3.2.添加halcon/com控件:选择project/components,弹出的菜单

3.3.在工具箱中会出现HWindowXCtrl控件,拖进form1,然后再拖一个commandbutton,

双击commanbutton,加入代码

Private Sub Command1_Click()
Call Main
End Sub
3.4.按F5运行程序,然后单击command1,弹出

这是一个halcon界面库构造的窗口,脱离vb窗口的。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vb中使用hwindowxctrl的窗口加载图像
在上面第2步选择使用导出模板。
导出的代码如下,可知需要调用的过程是inithalcon和runhalcon

...
' Main procedure
Private Sub action()

  ' Local iconic variables
  Dim ho_Lena As HUntypedobjectX


  ' Local control variables
  Dim hv_Width As Variant,hv_Height As Variant
  Dim hv_WindowHandle As Variant

  Call Op.ReadImage(ho_Lena,hv_Height)
  'dev_close_window(...);
  'dev_open_window(...);
  Call set_display_font(hv_ExpDefaultWinHandle,"false")
  Call Op.dispObj(ho_Lena,hv_ExpDefaultWinHandle)
  Call disp_continue_message(hv_ExpDefaultWinHandle,"true")
  HDevelopStop
End Sub



Sub InitHalcon()
  ' Default settings used in HDevelop
  Call Op.SetSystem("do_low_error","false")
End Sub

Sub RunHalcon(ByRef Window As HWindowX)
  hv_ExpDefaultWinHandle = Window.HalconID
  Call action
End Sub
在上面的3.3中拖入一个commandbutton2,双击添加代码
Private Sub Form_Load()
    Call InitHalcon
End Sub

Private Sub Command2_Click()
Call RunHalcon(HWindowXCtrl.HalconWindow)
End Sub

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
vb中使用hwindowxctrl的窗口加载视频
1.插入摄像头,只要qq视频模块可以使用的摄像头,halcon基本都可以使用吧

2.在halcon中新建一个工程,文件/新程序
3.选择助手/打开新的imageaquisition,点击检测,会检测到directshow

观察连接标签栏里已经识别出中微星的摄像头,可以点击连接,实时查看一下。
颜色空间中可以选择以灰度方式采集图像。

4.选择生成代码标签,如下。同步采集。


选择插入代码,如下
* Code generated by Image Acquisition 01
open_framegrabber ('DirectShow',1,'default',8,'rgb',-1,'false','Vimicro USB PC Camera (ZC030x)',AcqHandle)
while (true)
 grab_image (Image,AcqHandle)
 * Do something
endwhile
close_framegrabber (AcqHandle)
其中
open_framegrabber用于打开摄像头并配置,此函数调用时会测试要指定的设备,并锁定该设备。之后可以使用grab_image,grab_data,grab_image_async,or grab_data_async获取图像,然后处理。使用完之后需要用close_framegrabber释放,否则别的进程无法使用
grab_image采集图像到Image
close_framegrabber 关闭设备
在grab_image (Image,AcqHandle)后面加一句dev_display(Image),把图像显示出来
5.导出vb代码

如下,
...
' Main procedure
Private Sub action()

 ' Local iconic variables
 Dim ho_Image As HUntypedobjectX


 ' Local control variables
 Dim hv_AcqHandle As Variant

 'Code generated by Image Acquisition 01
 Call Op.OpenFramegrabber("DirectShow","default","rgb",_
 "false","Vimicro USB PC Camera (ZC030x)",hv_AcqHandle)
 do while 1
 Call Op.GrabImage(ho_Image,hv_AcqHandle)
 Call Op.dispObj(ho_Image,hv_ExpDefaultWinHandle)
 'Do something
 #If USE_DO_EVENTS Then
 ' Please note: The call of DoEvents() is only a hack to
 ' enable VB to react on events. Please change the code
 ' so that it can handle events in a standard way.
 DoEvents
 #End If
 Loop
 Call Op.CloseFramegrabber(hv_AcqHandle)
End Sub



Sub InitHalcon()
 ' Default settings used in HDevelop
 Call Op.SetSystem("do_low_error","false")
End Sub

Sub RunHalcon(ByRef Window As HWindowX)
 hv_ExpDefaultWinHandle = Window.HalconID
 Call action
End Sub

vb中调用方式很简单仍然是inithalocn和runhalcon
把read_camera.bas加进vb,添加代码
Private Sub Form_Load()
    Call InitHalcon
End Sub

Private Sub Command3_Click()
Call RunHalcon(HWindowXCtrl.HalconWindow)
End Sub


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
需要注意的问题,
在hdevelop中的stop命令导入到vb.bas就变成HDevelopStop

HDevelopStop有两个版本实现,一个是空函数(使用halcon窗口导出时),一个是如下(使用导出模板时)
Public Sub HDevelopStop()
  Call MsgBox("Press button to continue",vbYes,"Program stop",1000)
End Sub

在采集视频时,程序退出之前需要 close_framegrabber,否则会出错
halcon error#5322:image aquisition:timeout.
此时需要重插一下camera
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
halcon播放avi视频







/******************************************************************/




vc使用halcon
使用hdevelop导出halcon程序的c++代码之后,比如
read_image (image,'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp')
rgb1_to_gray (image,GrayImage)
dev_set_color('blue')
*bin_threshold (GrayImage,Region)
threshold(GrayImage,Region,100,255)
area_center (Region,Area,Row,Column)
生成c++代码
///////////////////////////////////////////////////////////////////////////////
//  File generated by HDevelop for HALCON/C++ Version 10.0
///////////////////////////////////////////////////////////////////////////////



#include "HalconCpp.h"



using namespace Halcon;


#ifndef NO_EXPORT_MAIN
// Main procedure 
void action()
{
  using namespace Halcon;

  // Local iconic variables 
  Hobject  image,GrayImage,Region;


  // Local control variables 
  HTuple  Area,Column;

  read_image(&image,"C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
  rgb1_to_gray(image,&GrayImage);
  if (HDevWindowStack::Isopen())
    set_color(HDevWindowStack::GetActive(),"blue");
  bin_threshold(GrayImage,&Region);
  area_center(Region,&Area,&Row,&Column);

}


#ifndef NO_EXPORT_APP_MAIN
int main(int argc,char *argv[])
{
  using namespace Halcon;
  // Default settings used in HDevelop (can be omitted) 
  set_system("do_low_error","false");
  action();
  return 0;
}
#endif


#endif

新建一个对话框mfc程序(vc2008),添加一个按钮button1,加入如下代码(我将action函数稍微改了一下)
当然先要#include "HalconCpp.h"

// Main procedure 
double action( char * p)
{
	using namespace Halcon;
	// Local iconic variables 
	Hobject  image,Region;

	// Local control variables 
	HTuple  Area,Column;

	read_image(&image,p);
	rgb1_to_gray(image,&GrayImage);
	if (HDevWindowStack::Isopen())
		set_color(HDevWindowStack::GetActive(),"blue");
	//bin_threshold(GrayImage,&Region);
	threshold(GrayImage,&Region,50,255);
	area_center(Region,&Column);
	double d=Area[0];
	return d;

}


void CabcDlg::OnBnClickedButton1()
{
	// Todo: 在此添加控件通知处理程序代码
	double d=action("C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
	CString str;
	str.Format("%f",d);
	AfxMessageBox(str);
}

编译程序之前需要先设置一下include和链接环境,对于vc2008
工具/选项/项目解决方案/vc++目录/包含文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\include
C:\Program Files\MVTec\HALCON-10.0\include\cpp
工具/选项/项目解决方案/vc++目录/库文件/ 添加
C:\Program Files\MVTec\HALCON-10.0\lib\x86sse2-win32

后执行即可。



vc使用picture control显示halcon采集的图像
1.在对话框中添加一个picture control,比如IDC_PIC_HWINDOW
2.在xxdlg.h中添加
HTuple m_HWindowID;//picture control经过处理之后标示符,以后显示图像时,直接显示在m_HWindowID即可。
HTuple m_FGHandle,m_ImageWidth,m_ImageHeight;//m_FGHandle是视频设备
Hobject m_LiveImage;//从图片或视频中抓取图像到这个变量里面
3.在xxdlg.cpp中添加初始化picture control的函数。可以在OnInitDialog函数调用之。

// 初始化HALCON显示窗口
void CabcdDlg::InitHalconWindow(void)
{
	//定义显示的起点和长宽高
	HTuple HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
	//定义窗口ID
	HTuple HWindowID;


	//定义一个CRect类的对象,用于获取图像框的尺寸和位置
	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();
	//设定固定的窗口大小,而不是根据控件大小设定
	//GetDlgitem(IDC_PIC_HWINDOW)->SetwindowPos(NULL,322,242,SWP_NOZORDER | SWP_NOMOVE);
	try
	{
		set_window_attr("border_width",0);
		HWindowID = (Hlong)pWnd->m_hWnd;
		open_window(HWindowRow,HWindowHeight,HWindowID,"visible",&m_HWindowID);
		set_draw(m_HWindowID,"margin");//设置显示模式是margin(边缘)
	}
	catch (HException& except)
	{
		TRACE(except.message);
	}
}

如果要显示图像,
	read_image(&m_LiveImage,"C:/Documents and Settings/Administrator/桌面/164226715_126870_3.jpg");
	disp_obj(m_LiveImage,m_HWindowID);	

如果要显示视频
 try
 {
  //open_framegrabber("DirectShow","false","USB 视频设备",&m_FGHandle);
  open_framegrabber ("DirectShow",&m_FGHandle);
  //打开异步采集
  grab_image_start (m_FGHandle,-1);
  
  while (1)
  {
   grab_image_async(&m_LiveImage,m_FGHandle,-1);//采集一副图像
   get_image_pointer1(m_LiveImage,NULL,&m_ImageWidth,&m_ImageHeight);//得到图像的宽高和指针
   set_part(m_HWindowID,m_ImageHeight - 1,m_ImageWidth -1);//使图像显示适应窗口大小
   disp_obj(m_LiveImage,m_HWindowID); //窗口中显示图像
  }

  close_framegrabber(m_FGHandle);
 }
 catch (HException& except)
 {
  TRACE(except.message);
 }
源码 halcon 显示图像

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...