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

前端之家收集整理的这篇文章主要介绍了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.读取图像
  1. read_image (Lena,'F:/image/lena.jpg')
  2. get_image_size (Lena,Width,Height)
  3. dev_close_window ()
  4. dev_open_window (0,Width/2,Height/2,'black',WindowHandle)
  5. set_display_font (WindowHandle,14,'mono','true','false')
  6. dev_display (Lena)
  7. disp_continue_message (WindowHandle,'true')
  8. stop ()
2.导出vb的bas代码
选择文件/导出,弹出

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

  1. ...
  2.  
  3. ' Main procedure
  4. Private Sub action()
  5.  
  6. ' Local iconic variables
  7. Dim ho_Lena As HUntypedObjectX
  8.  
  9.  
  10. ' Local control variables
  11. Dim hv_Width As Variant,hv_Height As Variant
  12. Dim hv_WindowHandle As Variant
  13.  
  14.  
  15. Call Op.ReadImage(ho_Lena,"F:/image/lena.jpg")
  16. Call Op.GetImageSize(ho_Lena,hv_Width,hv_Height)
  17. If COMExpWinHandleStack.IsOpen() Then
  18. Op.CloseWindow (COMExpWinHandleStack.Pop())
  19. End If
  20. Call Op.SetWindowAttr("background_color","black")
  21. Call Op.OpenWindow(0,Tuple.TupleDiv( _
  22. hv_Width,2),Tuple.TupleDiv(hv_Height,"",hv_WindowHandle)
  23. COMExpWinHandleStack.Push (hv_WindowHandle)
  24. Call set_display_font(hv_WindowHandle,"mono","true","false")
  25. If COMExpWinHandleStack.IsOpen() Then
  26. Call Op.DispObj(ho_Lena,COMExpWinHandleStack.GetActive())
  27. End If
  28. Call disp_continue_message(hv_WindowHandle,"black","true")
  29. HDevelopStop
  30. End Sub
  31.  
  32.  
  33.  
  34. #If Not NO_EXPORT_APP_MAIN Then
  35. Sub InitHalcon()
  36. ' Default settings used in HDevelop
  37. Call Op.SetSystem("do_low_error","false")
  38. End Sub
  39.  
  40. Sub Main()
  41. Call InitHalcon
  42. Call action
  43. End Sub
  44.  
  45. #End If
3.1.新建一个exe的project,然后保存,然后添加read_image.bas文件到此project

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

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

双击commanbutton,加入代码

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

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

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

  1. ...
  2. ' Main procedure
  3. Private Sub action()
  4.  
  5. ' Local iconic variables
  6. Dim ho_Lena As HUntypedObjectX
  7.  
  8.  
  9. ' Local control variables
  10. Dim hv_Width As Variant,hv_Height As Variant
  11. Dim hv_WindowHandle As Variant
  12.  
  13. Call Op.ReadImage(ho_Lena,hv_Height)
  14. 'dev_close_window(...);
  15. 'dev_open_window(...);
  16. Call set_display_font(hv_ExpDefaultWinHandle,"false")
  17. Call Op.DispObj(ho_Lena,hv_ExpDefaultWinHandle)
  18. Call disp_continue_message(hv_ExpDefaultWinHandle,"true")
  19. HDevelopStop
  20. End Sub
  21.  
  22.  
  23.  
  24. Sub InitHalcon()
  25. ' Default settings used in HDevelop
  26. Call Op.SetSystem("do_low_error","false")
  27. End Sub
  28.  
  29. Sub RunHalcon(ByRef Window As HWindowX)
  30. hv_ExpDefaultWinHandle = Window.HalconID
  31. Call action
  32. End Sub
在上面的3.3中拖入一个commandbutton2,双击添加代码
  1. Private Sub Form_Load()
  2. Call InitHalcon
  3. End Sub
  4.  
  5. Private Sub Command2_Click()
  6. Call RunHalcon(HWindowXCtrl.HalconWindow)
  7. End Sub

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

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

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

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


选择插入代码,如下
  1. * Code generated by Image Acquisition 01
  2. open_framegrabber ('DirectShow',1,'default',8,'rgb',-1,'false','Vimicro USB PC Camera (ZC030x)',AcqHandle)
  3. while (true)
  4. grab_image (Image,AcqHandle)
  5. * Do something
  6. endwhile
  7. 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代码

如下,
  1. ...
  2. ' Main procedure
  3. Private Sub action()
  4.  
  5. ' Local iconic variables
  6. Dim ho_Image As HUntypedObjectX
  7.  
  8.  
  9. ' Local control variables
  10. Dim hv_AcqHandle As Variant
  11.  
  12. 'Code generated by Image Acquisition 01
  13. Call Op.OpenFramegrabber("DirectShow","default","rgb",_
  14. "false","Vimicro USB PC Camera (ZC030x)",hv_AcqHandle)
  15. Do While 1
  16. Call Op.GrabImage(ho_Image,hv_AcqHandle)
  17. Call Op.DispObj(ho_Image,hv_ExpDefaultWinHandle)
  18. 'Do something
  19. #If USE_DO_EVENTS Then
  20. ' Please note: The call of DoEvents() is only a hack to
  21. ' enable VB to react on events. Please change the code
  22. ' so that it can handle events in a standard way.
  23. DoEvents
  24. #End If
  25. Loop
  26. Call Op.CloseFramegrabber(hv_AcqHandle)
  27. End Sub
  28.  
  29.  
  30.  
  31. Sub InitHalcon()
  32. ' Default settings used in HDevelop
  33. Call Op.SetSystem("do_low_error","false")
  34. End Sub
  35.  
  36. Sub RunHalcon(ByRef Window As HWindowX)
  37. hv_ExpDefaultWinHandle = Window.HalconID
  38. Call action
  39. End Sub
  40.  
vb中调用方式很简单仍然是inithalocn和runhalcon
把read_camera.bas加进vb,添加代码
  1. Private Sub Form_Load()
  2. Call InitHalcon
  3. End Sub
  4.  
  5. Private Sub Command3_Click()
  6. Call RunHalcon(HWindowXCtrl.HalconWindow)
  7. End Sub


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

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

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







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




vc使用halcon
使用hdevelop导出halcon程序的c++代码之后,比如
  1. read_image (image,'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp')
  2. rgb1_to_gray (image,GrayImage)
  3. dev_set_color('blue')
  4. *bin_threshold (GrayImage,Region)
  5. threshold(GrayImage,Region,100,255)
  6. area_center (Region,Area,Row,Column)
生成c++代码
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // File generated by HDevelop for HALCON/C++ Version 10.0
  3. ///////////////////////////////////////////////////////////////////////////////
  4.  
  5.  
  6.  
  7. #include "HalconCpp.h"
  8.  
  9.  
  10.  
  11. using namespace Halcon;
  12.  
  13.  
  14. #ifndef NO_EXPORT_MAIN
  15. // Main procedure
  16. void action()
  17. {
  18. using namespace Halcon;
  19.  
  20. // Local iconic variables
  21. Hobject image,GrayImage,Region;
  22.  
  23.  
  24. // Local control variables
  25. HTuple Area,Column;
  26.  
  27. read_image(&image,"C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
  28. rgb1_to_gray(image,&GrayImage);
  29. if (HDevWindowStack::IsOpen())
  30. set_color(HDevWindowStack::GetActive(),"blue");
  31. bin_threshold(GrayImage,&Region);
  32. area_center(Region,&Area,&Row,&Column);
  33.  
  34. }
  35.  
  36.  
  37. #ifndef NO_EXPORT_APP_MAIN
  38. int main(int argc,char *argv[])
  39. {
  40. using namespace Halcon;
  41. // Default settings used in HDevelop (can be omitted)
  42. set_system("do_low_error","false");
  43. action();
  44. return 0;
  45. }
  46. #endif
  47.  
  48.  
  49. #endif

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

  1. // Main procedure
  2. double action( char * p)
  3. {
  4. using namespace Halcon;
  5. // Local iconic variables
  6. Hobject image,Region;
  7.  
  8. // Local control variables
  9. HTuple Area,Column;
  10.  
  11. read_image(&image,p);
  12. rgb1_to_gray(image,&GrayImage);
  13. if (HDevWindowStack::IsOpen())
  14. set_color(HDevWindowStack::GetActive(),"blue");
  15. //bin_threshold(GrayImage,&Region);
  16. threshold(GrayImage,&Region,50,255);
  17. area_center(Region,&Column);
  18. double d=Area[0];
  19. return d;
  20.  
  21. }
  22.  
  23.  
  24. void CabcDlg::OnBnClickedButton1()
  25. {
  26. // TODO: 在此添加控件通知处理程序代码
  27. double d=action("C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp");
  28. CString str;
  29. str.Format("%f",d);
  30. AfxMessageBox(str);
  31. }

编译程序之前需要先设置一下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函数调用之。

  1. // 初始化HALCON显示窗口
  2. void CabcdDlg::InitHalconWindow(void)
  3. {
  4. //定义显示的起点和长宽高
  5. HTuple HWindowRow,HWindowColumn,HWindowWidth,HWindowHeight;
  6. //定义窗口ID
  7. HTuple HWindowID;
  8.  
  9.  
  10. //定义一个CRect类的对象,用于获取图像框的尺寸和位置
  11. CRect Rect;
  12. CWnd *pWnd = GetDlgItem(IDC_PIC_HWINDOW);
  13. CDC *pDC = pWnd->GetDC();
  14. pWnd->GetWindowRect(&Rect);
  15.  
  16.  
  17. //设置显示窗口的起点和宽高
  18. HWindowRow = 0;
  19. HWindowColumn = 0;
  20. HWindowWidth = Rect.Width();
  21. HWindowHeight = Rect.Height();
  22. //设定固定的窗口大小,而不是根据控件大小设定
  23. //GetDlgItem(IDC_PIC_HWINDOW)->SetWindowPos(NULL,322,242,SWP_NOZORDER | SWP_NOMOVE);
  24. try
  25. {
  26. set_window_attr("border_width",0);
  27. HWindowID = (Hlong)pWnd->m_hWnd;
  28. open_window(HWindowRow,HWindowHeight,HWindowID,"visible",&m_HWindowID);
  29. set_draw(m_HWindowID,"margin");//设置显示模式是margin(边缘)
  30. }
  31. catch (HException& except)
  32. {
  33. TRACE(except.message);
  34. }
  35. }

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

如果要显示视频
  1. try
  2. {
  3. //open_framegrabber("DirectShow","false","USB 视频设备",&m_FGHandle);
  4. open_framegrabber ("DirectShow",&m_FGHandle);
  5. //打开异步采集
  6. grab_image_start (m_FGHandle,-1);
  7. while (1)
  8. {
  9. grab_image_async(&m_LiveImage,m_FGHandle,-1);//采集一副图像
  10. get_image_pointer1(m_LiveImage,NULL,&m_ImageWidth,&m_ImageHeight);//得到图像的宽高和指针
  11. set_part(m_HWindowID,m_ImageHeight - 1,m_ImageWidth -1);//使图像显示适应窗口大小
  12. disp_obj(m_LiveImage,m_HWindowID); //窗口中显示图像
  13. }
  14.  
  15. close_framegrabber(m_FGHandle);
  16. }
  17. catch (HException& except)
  18. {
  19. TRACE(except.message);
  20. }
源码 halcon 显示图像

猜你在找的VB相关文章