分享

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

 学海无涯GL 2014-02-17
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
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, 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, 'black', '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, 0, Tuple.TupleDiv( _  
  22.       hv_Width, 2), Tuple.TupleDiv(hv_Height, 2), 0, "", "", hv_WindowHandle)  
  23.   COMExpWinHandleStack.Push (hv_WindowHandle)  
  24.   Call set_display_font(hv_WindowHandle, 14, "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, "F:/image/lena.jpg")  
  14.   Call Op.GetImageSize(ho_Lena, hv_Width, hv_Height)  
  15.   'dev_close_window(...);  
  16.   'dev_open_window(...);  
  17.   Call set_display_font(hv_ExpDefaultWinHandle, 14, "mono", "true", "false")  
  18.   Call Op.DispObj(ho_Lena, hv_ExpDefaultWinHandle)  
  19.   Call disp_continue_message(hv_ExpDefaultWinHandle, "black", "true")  
  20.   HDevelopStop  
  21. End Sub  
  22.   
  23.   
  24.   
  25. Sub InitHalcon()  
  26.   ' Default settings used in HDevelop  
  27.   Call Op.SetSystem("do_low_error", "false")  
  28. End Sub  
  29.   
  30. Sub RunHalcon(ByRef Window As HWindowX)  
  31.   hv_ExpDefaultWinHandle = Window.HalconID  
  32.   Call action  
  33. 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, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', 'Vimicro USB PC Camera (ZC030x)', 0, -1, 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", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, _  
  14.       "false", "default", "Vimicro USB PC Camera (ZC030x)", 0, -1, 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  
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, Row, 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, GrayImage, Region;  
  7.   
  8.     // Local control variables   
  9.     HTuple  Area, Row, 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, &Area, &Row, &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,0,0,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,HWindowColumn,HWindowWidth,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", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "USB 视频设备", 0, -1, &m_FGHandle);  
  4.         open_framegrabber ("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "Vimicro USB PC Camera (ZC030x)", 0, -1, &m_FGHandle);  
  5.         //打开异步采集  
  6.         grab_image_start (m_FGHandle, -1);  
  7.           
  8.         while (1)  
  9.         {  
  10.             grab_image_async(&m_LiveImage, m_FGHandle, -1);//采集一副图像  
  11.             get_image_pointer1(m_LiveImage, NULL, NULL, &m_ImageWidth, &m_ImageHeight);//得到图像的宽高和指针  
  12.             set_part(m_HWindowID, 0, 0, m_ImageHeight - 1, m_ImageWidth -1);//使图像显示适应窗口大小  
  13.             disp_obj(m_LiveImage, m_HWindowID);    //窗口中显示图像  
  14.         }  
  15.   
  16.         close_framegrabber(m_FGHandle);  
  17.     }  
  18.     catch (HException& except)  
  19.     {  
  20.         TRACE(except.message);  
  21.     }  
源码  halcon 显示图像


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多