0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C#使用Halcon開發(fā)視覺檢測程序

新機器視覺 ? 來源:博客園-二次元攻城獅 ? 2023-01-11 09:53 ? 次閱讀

簡介

本文的初衷是希望幫助那些有其它平臺視覺算法開發(fā)經驗的人能快速轉入Halcon平臺下,通過文中的示例開發(fā)者能快速了解一個Halcon項目開發(fā)的基本步驟,讓開發(fā)者能把精力完全集中到算法的開發(fā)上面。

首先,你需要安裝Halcon,HALCON 18.11.0.1的安裝包會放在文章末尾。安裝包分開發(fā)和運行時兩個版本,運行時版本一般用于生產環(huán)境。

注:開發(fā)版本自帶運行時可替代運行時版本,但安裝的東西會比較多。

然后,你需要學會查看Halcon的幫助手冊,這是很重要的一件事。

本文涉及到幫助文檔的主要章節(jié)如下:

原文 HALCON 18.11.0.1 / Programmer's Guide / Programming With HALCON/.NET
翻譯 HALCON 18.11.0.1/程序員指南/使用 HALCON/.NET 編程

原文 HALCON 18.11.0.1 / HALCON Operator Reference
翻譯 HALCON 18.11.0.1/ HALCON 運算符參考

文中的示例是我第一次接觸Halcon時的學習測試用例,在電腦里面躺了一年,最近才有時間整理一下發(fā)出來,希望能對你有所幫助。

注:運行本文示例程序前至少安裝Halcon的運行時,否則Halcon的dll無法正常使用。

將 HALCON/.NET 添加到應用程序

添加控件

右鍵單擊工具箱,然后選擇“選擇項”,彈出的對話框選擇“**.NET Framework組件”,單擊下面的“瀏覽”,導航到HALCON安裝目錄下的indotnet35(VS2008以下版本的選擇dotnet20) ,然后選擇halcondotnet.dll**。

完成上述操作后,HSmartWindowControl和HWindowControl控件就會出現(xiàn)在工具箱中,其中HWindowControl控件已經過時官方不再推薦使用。

與HWindowControl相比,HSmartWindowControl控件具有以下幾個優(yōu)點:

可以像任何其他控件一樣使用

提供預定義的鼠標交互(移動窗口內容并使用鼠標滾輪進行縮放), 可以通過雙擊窗口來重置視圖

控件會自動重新縮放,而不會閃爍

注:與HSmartWindowControlWPF 相反,HSmartWindowControl需要一個回調才能使用鼠標滾輪進行縮放

引用dll

在HALCON安裝目錄下的**indotnet35**中,引用以下dll:

hdevenginedotnet.dll

halcondotnet.dll

注:使用HALCON XL開發(fā)應用程序時,必須選擇以xl結尾的dll,hhdevelop xl適用于大分辨率的圖像(大于 32k x 32k )。

引用以下命名空間:

HalconDotNet:控件所在的命名空間

HalconTypeLine、Rectangle2等數(shù)據(jù)類型所在的命名空間

調用Halcon算子

ReadImage操作為例,函數(shù)原型如下:

staticvoidHOperatorSet.ReadImage(outHObjectimage,HTuplefileName)

publicHImage(HTuplefileName)

publicHImage(stringfileName)

voidHImage.ReadImage(HTuplefileName)

voidHImage.ReadImage(stringfileName)

注:這些內容幫助手冊上都有,在文章開頭列出來的章節(jié)。

C#調用HALCON 算子有兩種選擇:函數(shù)式、對象式,前值通過HOperatorSet調用算子并通過out關鍵字傳入關鍵對象,后者直接在關鍵對象上調用對應的方法。兩種方法完全等價,C#是一門面向對象的語言,建議使用對象式的方式調用算子會好一點。

程序示例

本示例只實現(xiàn)下面幾種關鍵功能:

加載、保存圖片

畫線、框并保存

抓邊算法、測寬算法

先新建一個Winform項目,界面設計如下:

c8ca887a-911b-11ed-bfe3-dac502259ad0.png

注:項目的解決方案平臺不能使用AnyCPU,只能根據(jù)安裝的Halcon位數(shù)選擇x64x86,我使用的是x64平臺。

HSmartWindowControl控件使用

將HSmartWindowControl控件拖入主界面即可,在窗體類里面定義一個HWindow類型的成員引用控件內部的窗體,同時設置控件的回調函數(shù)(WPF則不需要)。

代碼如下:

//窗口實例
privateHWindowhwindow;

publicForm1()
{
InitializeComponent();
hwindow=hSmartWindowControl1.HalconWindow;//初始化窗口變量
hSmartWindowControl1.MouseWheel+=HSmartWindow_MouseWheel;
}

//鼠標滾輪回調
privatevoidHSmartWindow_MouseWheel(objectsender,MouseEventArgse)
{
Pointpt=this.Location;
MouseEventArgsnewe=newMouseEventArgs(e.Button,e.Clicks,e.X-pt.X,e.Y-pt.Y,e.Delta);
hSmartWindowControl1.HSmartWindowControl_MouseWheel(sender,newe);
}

加載、保存圖像

加載、保存圖像也比較簡單,我們需要先定義一個HImage實例,然后按鈕單擊事件在該實例上調用對應的算子,代碼如下:

//圖片變量
privateHImageimage=newHImage();
//加載圖片
privatevoidbutton_ReadImage_Click(objectsender,EventArgse)
{
stringimagePath="TestRead.bmp";
image.ReadImage(imagePath);
hwindow.DispImage(image);
//自動適應圖片(相當于控件上面的雙擊操作)
hwindow.SetPart(0,0,-2,-2);
}
//保存圖片
privatevoidbutton_WriteImage_Click(objectsender,EventArgse)
{
stringimagePath="TestWrite.bmp";
image.WriteImage("bmp",0,imagePath);
hwindow.DispImage(image);
}

上面代碼是從程序啟動目下加載TestRead.bmp圖片,保存圖片到程序啟動目下的TestWrite.bmp,實際路徑可以根據(jù)項目情況自己定義。

上面的圖片是自己生成的,不是生產環(huán)境下的產品圖片,僅用于程序演示。

擴展:加載相機圖像

大部分項目都是從相機加載圖片,但這涉及到相機驅動的一些知識,全部介紹一邊會偏移文章主題。簡單來說,加載相機圖像分兩步:

將相機圖像保存到內存

將內存中的圖像傳入Halcon

將相機圖像保存到內存是相機驅動的工作,下面只討論怎么將內存中的圖像傳入Halcon,代碼如下:

privatevoidGenImageByPtr()
{
//這三個參數(shù)都可以通過相機驅動得到
byte[]imageBuf=null;//圖像緩存數(shù)組
intwidth=0;//圖像寬度
intheigth=0;//圖像高度
//獲取內存圖像中間的指針
IntPtrptr=Marshal.UnsafeAddrOfPinnedArrayElement(imageBuf,0);
//加載內存中的圖像
image.GenImage1("byte",width,heigth,ptr);
hwindow.DispImage(image);
}

這里只列一個簡單的示例,類似的算子還有copy_image、gen_image3等。

畫線、畫框并保存

在圖像上畫線、框是機器視覺里面常見的需求,根據(jù)線、框確定算法搜索的區(qū)域和特征。

在窗體類中定義一個HDrawingObject對象并附加到現(xiàn)有窗口用于交互,同時定義好Line對象、Rectangle2對象用于保存繪圖的結果。

先在圖像窗口上面畫出線和框,然后再用鼠標手動調整大小、位置,代碼如下:

//繪圖對象
privateHDrawingObjectdrawingObject=newHDrawingObject();
//線ROI
privateLineline=newLine();
//框ROI
privateRectangle2rectangle2=newRectangle2();

privatevoidbutton_DrawLine_Click(objectsender,EventArgse)
{
drawingObject.CreateDrawingObjectLine(100,100,200,200);
//將繪圖對象關聯(lián)到Halcon窗口
hwindow.AttachDrawingObjectToWindow(drawingObject);
}
privatevoidbutton_SaveLine_Click(objectsender,EventArgse)
{
HTupleparamName,param;
paramName=newHTuple(newstring[]{"row1","column1","row2","column2"});
param=drawingObject.GetDrawingObjectParams(paramName);
//保存參數(shù)
line.SetValue(param.ToDArr());
paramName.Dispose();
param.Dispose();
//清除繪圖內容
drawingObject.ClearDrawingObject();
}
privatevoidbutton_DrawRect_Click(objectsender,EventArgse)
{
drawingObject.CreateDrawingObjectRectangle2(300,400,0,300,200);
//將繪圖對象關聯(lián)到Halcon窗口
hwindow.AttachDrawingObjectToWindow(drawingObject);
}
privatevoidbutton_SaveRect_Click(objectsender,EventArgse)
{
HTupleparamName,param;
paramName=newHTuple(newstring[]{"row","column","phi","length1","length2"});
param=drawingObject.GetDrawingObjectParams(paramName);
//保存參數(shù)
rectangle2.SetValue(param.ToDArr());
paramName.Dispose();
param.Dispose();
//清除繪圖內容
drawingObject.ClearDrawingObject();
}

上面的paramName可以取以下值,里面包含了Line、Rectangle2類屬性名:

"color","column","column1","column2","end_angle","font","length1","length2","line_style",
"line_width","phi","radius","radius1","radius2","row","row1","row2","start_angle","string","type"

檢測算法

用Halcon開發(fā)檢測算法一般有兩種方法:

根據(jù)直接調用Halcon在對應語言平臺下的算子接口

用Halcon自帶的腳本語言開發(fā)算法然后轉成C#類

第一種自由度比較高,代碼看起來也比較簡潔易懂,但上手比較困難。第二種更簡單,但生成的類很難看,而且與程序集成的時候需要做一些改動。兩種方法并不是絕對對立的,一般會先用Halcon驗證算法,然后參考導出的C#類實現(xiàn)自己的檢測算法。

抓邊算法

c8d3b2ba-911b-11ed-bfe3-dac502259ad0.png

2D測量模型

簡述一下2D 測量的使用步驟:

創(chuàng)建測量模型并指定圖像大小:首先必須使用create_metrology_model創(chuàng)建測量模型,然后使用set_metrology_model_image_size指定測量結果所在的圖像的大小。

提供近似值:將測量對象添加到測量模型中,每個測量對象由圖像中相應對象的近似形狀參數(shù)控制測量的參數(shù)組成,控制測量的參數(shù)包括例如指定測量區(qū)域的尺寸和分布的參數(shù),測量對象有以下幾種:

:add_metrology_object_circle_measure

橢圓:add_metrology_object_ellipse_measure

矩形:add_metrology_object_rectangle2_measure

:add_metrology_object_line_measure

使用一個運算符創(chuàng)建不同形狀:add_metrology_object_generic

要直觀檢查定義的度量對象,可以使用運算符get_metrology_object_model_contour訪問其XLD輪廓。要直觀檢查創(chuàng)建的測量區(qū)域,可以使用運算符get_metrology_object_measures訪問其XLD輪廓。

修改模型參數(shù):如果已執(zhí)行相機校準,則可以使用set_metrology_model_param,沒有就忽略(本示例沒有使用)。

修改對象參數(shù):當將測量對象添加到測量模型時,可以設置許多參數(shù),之后還可以使用運算符set_metrology_object_param修改其中的一些(本示例是在添加時設置的參數(shù),所以沒有此步驟)。

調整測量模型:在執(zhí)行下一次測量之前平移和旋轉測量模型,可以使用操作員align_metrology_model。通常使用基于形狀的匹配來獲得對準參數(shù),相當于測量前的位置就糾偏(本示例比較簡單沒有此步驟)。

應用測量:使用apply_metrology_model執(zhí)行測量過程。

訪問結果:測量后,可以使用get_metrology_object_result訪問結果,也可以使用get_metrology_object_measures獲取定位邊的行坐標和列坐標再進一步處理(本示例使用前者)。

代碼實現(xiàn)

抓變算法的C#代碼如下:

privatevoidbutton_FindEdge_Click(objectsender,EventArgse)
{
//創(chuàng)建測量對象
HMetrologyModelhMetrologyModely=newHMetrologyModel();
//設置圖片大小
image.GetImageSize(outintwidth,outintheight);
hMetrologyModely.SetMetrologyModelImageSize(width,height);
//添加直線測量
doublemeasureLength1=30,measureLength2=30,measureSigma=1,measureThreshold=30;
HTuplegenParamName=newHTuple(),genParamValue=newHTuple();
hMetrologyModely.AddMetrologyObjectLineMeasure(line.Row1,line.Column1,line.Row2,line.Column2,measureLength1,measureLength2,measureSigma,measureThreshold,genParamName,genParamValue);
//執(zhí)行并獲取結果
hMetrologyModely.ApplyMetrologyModel(image);
//獲取測量區(qū)域
HTuplemRow=newHTuple(),mCol=newHTuple();
HXLDContmContours=hMetrologyModely.GetMetrologyObjectMeasures("all","all",outmRow,outmCol);//檢測區(qū)域輪廓
HXLDContmmContours=hMetrologyModely.GetMetrologyObjectModelContour("all",1);//測量對象輪廓
//參數(shù)順序["row_begin","column_begin","row_end","column_end"]
HTuplelineRet=hMetrologyModely.GetMetrologyObjectResult("all","all","result_type","all_param");
double[]retAry=lineRet.DArr;
//打印結果
hwindow.SetLineWidth(2);
hwindow.SetColor("green");
hwindow.DispLine(retAry[0],retAry[1],retAry[2],retAry[3]);
hwindow.SetColor("blue");
hwindow.DispXld(mContours);
hwindow.SetColor("yellow");
hwindow.DispXld(mmContours);
//清空測量對象
hMetrologyModely.ClearMetrologyModel();
//清理對象
hMetrologyModely?.Dispose();
genParamName?.Dispose();
genParamValue?.Dispose();
mRow.Dispose();
mCol.Dispose();
mContours.Dispose();
mmContours.Dispose();
}

Halcon的代碼如下:

*讀取圖片
read_image (Image, 'D:/test.bmp')
dev_get_window (WindowHandle)

*畫線
Row1:=1218.79
Column1:=1002.95
Row2:=1242.07
Column2:=2786.18
*draw_line (WindowHandle, Row1, Column1, Row2, Column2)
*gen_region_line (RegionLines, Row1, Column1, Row2, Column2)

*創(chuàng)建測量幾何形狀所需的數(shù)據(jù)結構
create_metrology_model (MetrologyHandle)
get_image_size (Image, Width, Height)
set_metrology_model_image_size (MetrologyHandle, Width, Height)  
add_metrology_object_line_measure (MetrologyHandle, Row1, Column1, Row2, Column2, 100, 50, 1, 30, [], [], Index)

apply_metrology_model (Image, MetrologyHandle)

get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type','all_param', Parameter)

get_metrology_object_measures(Contours, MetrologyHandle, 'all', 'all', Row, Column)

get_metrology_object_model_contour (Contour, MetrologyHandle, 0, 1.5)

*清空測量對象,否則會導致內存泄露
clear_metrology_model (MetrologyHandle)

*可視化
dev_clear_window ()
dev_display(Image)
dev_set_color('green')
dev_set_line_width(1)
disp_line (WindowHandle, Parameter[0], Parameter[1], Parameter[2], Parameter[3])
dev_display (Contours)
dev_display (Contour)

使用方法

直接在界面上點擊“打開圖片”->“畫線ROI”(默認位置我都調好了,你也可以自己調整大小、位置)->“抓邊”,過程如下:c8dbc162-911b-11ed-bfe3-dac502259ad0.png

c8ea02c2-911b-11ed-bfe3-dac502259ad0.png

測寬算法

測寬算法使用一維測量中的measure_pairs算子提取直邊對,然后計算兩個直邊的距離。代碼太長這里就不貼了,完整的項目源碼會在文章末尾給出。

需要注意,measure_pairs算子的搜索框必須和目標邊緣完全垂直,否則寬度數(shù)據(jù)會不準確,算子原理如下:

c8f03318-911b-11ed-bfe3-dac502259ad0.png

直接在界面上點擊“打開圖片”->“畫框ROI”(默認位置我都調好了,你也可以自己調整大小、位置)->“測寬”,過程如下:

c8f7ae68-911b-11ed-bfe3-dac502259ad0.pngc8fd0db8-911b-11ed-bfe3-dac502259ad0.png

上面的箭頭就是框的方向,測量邊必須與框的方向接近垂直否則會運算失敗,實際項目中還是建議用2D測量單獨抓兩個邊來測寬度。

源碼里面顯示邊緣的DispEdgeMarker方法,是直接從measure_pairs算子示例里面導出轉C#的,所以風格會比較奇怪。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 程序
    +關注

    關注

    115

    文章

    3720

    瀏覽量

    80357
  • 應用程序
    +關注

    關注

    37

    文章

    3198

    瀏覽量

    57360
  • 視覺檢測
    +關注

    關注

    2

    文章

    361

    瀏覽量

    19108
  • HALCON
    +關注

    關注

    16

    文章

    63

    瀏覽量

    27104

原文標題:C# 使用Halcon開發(fā)視覺檢測程序

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何選擇Halcon算法庫應用軟件集成開發(fā)環(huán)境

    大多數(shù)HALCON解決方案都必須嵌入到PC端的應用程序中(例如,提供圖形用戶界面),然后大多數(shù)機器視覺應用程序使用C ++或
    發(fā)表于 06-25 11:07 ?375次閱讀

    LABVIEW通過C#調用halcon算子

    本人看過不少LABVIEW直接調用HALCON的例子,感覺不如調用C#速度快,方便簡潔。今天就把本人的經驗分享一下。第一次發(fā)帖。。。。首先打開HALCON 例如:我們要把下面的算子轉換
    發(fā)表于 02-18 10:54

    Labview 調用C#封裝halcon

    Labview 調用C#封裝halcon庫,內存釋放能做到最好
    發(fā)表于 08-30 15:37

    Visual C# .NET程序設計教程

    Visual C# .NET 程序設計教程第1章  Visual Studio .NET基礎1.1  Visual Studio .NET概述1.2  C#.NET
    發(fā)表于 09-19 09:35 ?42次下載
    Visual <b class='flag-5'>C#</b> .NET<b class='flag-5'>程序</b>設計教程

    C#程序設計與案例教程

    C#程序設計與案例教程全書共分九章,按C#知識的系統(tǒng)性,由淺入深安排內容,全面介紹了C# 語言基礎,面向對象程序設計,GUI
    發(fā)表于 10-22 11:05 ?158次下載
    <b class='flag-5'>C#</b><b class='flag-5'>程序</b>設計與案例教程

    C#串口通信程序

    C#串口通信程序
    發(fā)表于 01-02 19:57 ?0次下載

    《Visual C# 2005開發(fā)技術》C#程序設計基礎

    《Visual C# 2005開發(fā)技術》C#程序設計基礎
    發(fā)表于 02-07 15:11 ?0次下載

    《Visual C# 2005開發(fā)技術》應用程序部署

    《Visual C# 2005開發(fā)技術》應用程序部署
    發(fā)表于 02-07 15:17 ?0次下載

    HALCON項目應使用哪種編程語言

    來源:機器視覺算法與應用 大多數(shù)HALCON解決方案都必須嵌入到PC端的應用程序中(例如,提供圖形用戶界面),然后大多數(shù)機器視覺應用程序使用
    的頭像 發(fā)表于 08-18 10:36 ?6751次閱讀

    HALCON機器視覺軟件有哪些優(yōu)點?

    最近一直在使用機器人與上位機進行視覺抓取技術的調試,對C# 也稍有了解,就這樣我開始接觸到了HALCON. HALCON是德國MVtec公司開發(fā)
    的頭像 發(fā)表于 08-25 16:03 ?1.1w次閱讀

    HALCON機器視覺算法包解析

    最近一直在使用機器人與上位機進行視覺抓取技術的調試,對C# 也稍有了解,就這樣我開始接觸到了HALCON.
    的頭像 發(fā)表于 02-01 09:24 ?1890次閱讀

    基于C#開發(fā)一個簡單的窗體應用程序

    使用過的編程語言不少了,初步接觸C#,以一個簡單的窗體應用程序開發(fā)入手,以下是開發(fā)的詳細過程。
    的頭像 發(fā)表于 04-25 11:49 ?6969次閱讀
    基于<b class='flag-5'>C#</b><b class='flag-5'>開發(fā)</b>一個簡單的窗體應用<b class='flag-5'>程序</b>

    如何用halconC#進行聯(lián)合開發(fā)

    ? 導出文件? 如需與其他語言進行聯(lián)合編程,可以在文件--->導出中導出所需要的相應語言。? 導出的函數(shù)文件可以被C# 調用.? 視覺計算程序+通訊程序+機器人控制
    的頭像 發(fā)表于 05-22 14:52 ?7973次閱讀
    如何用<b class='flag-5'>halcon</b>和<b class='flag-5'>C#</b>進行聯(lián)合<b class='flag-5'>開發(fā)</b>

    HALCON項目應該使用哪種主機語言

    大多數(shù)HALCON解決方案必須嵌入到主應用程序中(例如,提供圖形用戶界面),然后大多數(shù)機器視覺應用程序都是用c++或
    發(fā)表于 06-25 09:30 ?442次閱讀

    HalconC#二次開發(fā)及經驗分享

    使用C#的語法方式逐句改寫Halcon代碼
    的頭像 發(fā)表于 06-27 14:51 ?2966次閱讀