国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價值的文章主要介紹了在C#中使用Halcon開發(fā)視覺檢測程序。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文的初衷是希望幫助那些有其它平臺視覺算法開發(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安裝目錄下的\bin\dotnet35(VS2008以下版本的選擇dotnet20) ,然后選擇halcondotnet.dll。

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

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

  • 可以像任何其他控件一樣使用
  • 提供預定義的鼠標交互(移動窗口內容并使用鼠標滾輪進行縮放), 可以通過雙擊窗口來重置視圖
  • 控件會自動重新縮放,而不會閃爍

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

引用dll#

在HALCON安裝目錄下的\bin\dotnet35中,引用以下dll:

  • hdevenginedotnet.dll
  • halcondotnet.dll

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

引用以下命名空間:

  • HalconDotNet:控件所在的命名空間
  • HalconTypeLine、Rectangle2等數(shù)據類型所在的命名空間

調用Halcon算子#

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

static void HOperatorSet.ReadImage(out HObject image, HTuple fileName)

public HImage(HTuple fileName)

public HImage(string fileName)

void HImage.ReadImage(HTuple fileName)

void HImage.ReadImage(string fileName)

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

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

程序示例#

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

  • 加載、保存圖片
  • 畫線、框并保存
  • 抓邊算法、測寬算法

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

halcon c#,c#,視覺檢測,microsoft

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

HSmartWindowControl控件使用#

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

//窗口實例
private HWindow hwindow;
       
public Form1()
{
    InitializeComponent();
    hwindow = hSmartWindowControl1.HalconWindow;//初始化窗口變量
    hSmartWindowControl1.MouseWheel += HSmartWindow_MouseWheel;
}

//鼠標滾輪回調
private void HSmartWindow_MouseWheel(object sender, MouseEventArgs e)
{
    Point pt = this.Location;
    MouseEventArgs newe = new MouseEventArgs(e.Button, e.Clicks, e.X - pt.X, e.Y - pt.Y, e.Delta);
    hSmartWindowControl1.HSmartWindowControl_MouseWheel(sender, newe);
}

加載、保存圖像#

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

//圖片變量
private HImage image = new HImage();
//加載圖片
private void button_ReadImage_Click(object sender, EventArgs e)
{           
    string imagePath = "TestRead.bmp";
    image.ReadImage(imagePath);
    hwindow.DispImage(image);
    //自動適應圖片(相當于控件上面的雙擊操作)
    hwindow.SetPart(0, 0, -2, -2);
}
//保存圖片
private void button_WriteImage_Click(object sender, EventArgs e)
{
    string imagePath = "TestWrite.bmp";
    image.WriteImage("bmp", 0, imagePath);
    hwindow.DispImage(image);
}

上面代碼是從程序啟動目下加載TestRead.bmp圖片,保存圖片到程序啟動目下的TestWrite.bmp,實際路徑可以根據項目情況自己定義。
上面的圖片是自己生成的,不是生產環(huán)境下的產品圖片,僅用于程序演示。

擴展:加載相機圖像#

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

  • 將相機圖像保存到內存
  • 將內存中的圖像傳入Halcon

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

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

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

畫線、畫框并保存#

在圖像上畫線、框是機器視覺里面常見的需求,根據線、框確定算法搜索的區(qū)域和特征。
在窗體類中定義一個HDrawingObject對象并附加到現(xiàn)有窗口用于交互,同時定義好Line對象、Rectangle2對象用于保存繪圖的結果。
先在圖像窗口上面畫出線和框,然后再用鼠標手動調整大小、位置,代碼如下:

//繪圖對象
private HDrawingObject drawingObject = new HDrawingObject();
//線ROI
private Line line = new Line();
//框ROI
private Rectangle2 rectangle2 = new Rectangle2();

private void button_DrawLine_Click(object sender, EventArgs e)
{
    drawingObject.CreateDrawingObjectLine(100, 100, 200, 200);
    //將繪圖對象關聯(lián)到Halcon窗口
    hwindow.AttachDrawingObjectToWindow(drawingObject);
}
private void button_SaveLine_Click(object sender, EventArgs e)
{
    HTuple paramName, param;            
    paramName = new HTuple(new string[] { "row1", "column1", "row2", "column2" });
    param = drawingObject.GetDrawingObjectParams(paramName);
    //保存參數(shù)
    line.SetValue(param.ToDArr());
    paramName.Dispose();
    param.Dispose();
    //清除繪圖內容
    drawingObject.ClearDrawingObject();           
}

private void button_DrawRect_Click(object sender, EventArgs e)
{
    drawingObject.CreateDrawingObjectRectangle2(300, 400, 0, 300, 200);
    //將繪圖對象關聯(lián)到Halcon窗口
    hwindow.AttachDrawingObjectToWindow(drawingObject);
}
private void button_SaveRect_Click(object sender, EventArgs e)
{
    HTuple paramName, param;
    paramName = new HTuple(new string[] { "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ā)檢測算法一般有兩種方法:

  • 根據直接調用Halcon在對應語言平臺下的算子接口
  • 用Halcon自帶的腳本語言開發(fā)算法然后轉成C#類

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

抓邊算法#

抓變算法直接調用的是Halcon的C#算子接口,里面有用到2D 測量模型

halcon c#,c#,視覺檢測,microsoft

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#代碼如下:

private void button_FindEdge_Click(object sender, EventArgs e)
{
    //創(chuàng)建測量對象
    HMetrologyModel hMetrologyModely = new HMetrologyModel();
    //設置圖片大小            
    image.GetImageSize(out int width, out int height);
    hMetrologyModely.SetMetrologyModelImageSize(width, height);
    //添加直線測量
    double measureLength1= 30, measureLength2=30, measureSigma=1, measureThreshold=30;
    HTuple genParamName = new HTuple(), genParamValue = new HTuple();
    hMetrologyModely.AddMetrologyObjectLineMeasure(line.Row1, line.Column1,line.Row2, line.Column2, measureLength1, measureLength2, measureSigma, measureThreshold, genParamName, genParamValue);
    //執(zhí)行并獲取結果
    hMetrologyModely.ApplyMetrologyModel(image);
    //獲取測量區(qū)域
    HTuple mRow = new HTuple(), mCol = new HTuple();
    HXLDCont mContours = hMetrologyModely.GetMetrologyObjectMeasures("all", "all", out mRow, out mCol); //檢測區(qū)域輪廓
    HXLDCont mmContours = hMetrologyModely.GetMetrologyObjectModelContour("all", 1);    //測量對象輪廓
    //參數(shù)順序 ["row_begin", "column_begin", "row_end", "column_end"]
    HTuple  lineRet =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ù)據結構
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”(默認位置我都調好了,你也可以自己調整大小、位置)->“抓邊”,過程如下:

halcon c#,c#,視覺檢測,microsoft

測寬算法#

測寬算法使用一維測量中的measure_pairs算子提取直邊對,然后計算兩個直邊的距離。代碼太長這里就不貼了,完整的項目源碼會在文章末尾給出。
需要注意,measure_pairs算子的搜索框必須和目標邊緣完全垂直,否則寬度數(shù)據會不準確,算子原理如下:

halcon c#,c#,視覺檢測,microsoft


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

上面的箭頭就是框的方向,測量邊必須與框的方向接近垂直否則會運算失敗,實際項目中還是建議用2D測量單獨抓兩個邊來測寬度。
源碼里面顯示邊緣的DispEdgeMarker方法,是直接從measure_pairs算子示例里面導出轉C#的,所以風格會比較奇怪。文章來源地址http://www.zghlxwxcb.cn/news/detail-776875.html

到了這里,關于在C#中使用Halcon開發(fā)視覺檢測程序的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【朝夕教育】2023年04月 Halcon機器視覺-15種常用缺陷檢測實例

    【朝夕教育】2023年04月 Halcon機器視覺-15種常用缺陷檢測實例

    缺陷檢測是一種通過計算機視覺技術來檢測產品制造過程中的缺陷的方法。該技術可以檢測出產品表面的缺陷,如裂紋、凹陷、劃痕、氣泡等,并且可以實時監(jiān)測和診斷制造過程中的問題。在制造業(yè)中,機器視覺缺陷檢測技術已經被廣泛應用于各種產品的質量控制和檢測工作

    2024年02月04日
    瀏覽(19)
  • C#聯(lián)合halcon開發(fā),連接相機顏色不對,無法連接相機

    C#聯(lián)合halcon開發(fā),連接相機顏色不對,無法連接相機

    相機可以在??弟浖﨧VS中打開(顏色正常),但是在C#開發(fā)的程式中無法打開(彩色相機顏色顯示異常)。 1.查看相機和MVS軟件是否連接成功; 2.如果成功,連接C#程序; 3.程序連接失敗,在MVS中連接相機,查看MVS里面相機的圖像處理-像素格式,確定相機是否為黑白還是彩色

    2024年02月04日
    瀏覽(11)
  • C# halcon SubImage的使用

    SubImage(HObject imageMinuend, HObject imageSubtrahend, out HObject imageSub, HTuple mult, HTuple add) x1=imageMinuend此行此列的灰度 x2=imageSubtrahend此行此列的灰度 則imageSub此行此列的灰度為;(x1-x2)*mult+add 以byte圖為例,小于0,為0;大于255,為255 ??????? private void butTemp_Click(object sender, EventArgs e) ??

    2024年02月09日
    瀏覽(20)
  • 使用halcon實現(xiàn)基于深度學習的目標檢測

    使用halcon實現(xiàn)基于深度學習的目標檢測

    數(shù)據集 數(shù)據集的類別已有不需要另外指定,這是因為在讀取之前已有數(shù)據集的時候,數(shù)據集中就會包含了許多數(shù)據,其中結構如下: 包括類別序號以及類別名字 預訓練模型或者模型 預訓練模型也有了基本的參數(shù),如下所示: 訓練集、驗證集以及測試集的區(qū)別 : 一般會認為

    2024年02月05日
    瀏覽(31)
  • 【機器視覺】線陣相機模型說明以及使用HALCON標定助手對線陣相機進行標定

    【機器視覺】線陣相機模型說明以及使用HALCON標定助手對線陣相機進行標定

    線陣相機矯正所需參數(shù)共17個,其中11個參數(shù)為內參,6個參數(shù)為外參。 線陣相機內參 CamParam 數(shù)量共11個,模型如下: CamParam:= [Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz] ? Focus : 鏡頭焦距; ? Kappa : 鏡頭畸變系數(shù);正:枕形畸變 負:桶狀畸變 ? Sx : 傳感器像元寬度

    2024年02月16日
    瀏覽(20)
  • Halcon視覺軟件庫介紹

    Halcon提供了各種各樣的功能,包括圖像處理,特征提取,模板匹配,形狀識別和三維視覺等。它還包括用于相機校準和三維重建的工具。 優(yōu)點: Halcon具有強大和靈活的圖像處理和機器視覺功能。 它支持多個平臺,并且可以與許多不同的編程語言和開發(fā)環(huán)境集成。 Halcon提供了

    2024年02月16日
    瀏覽(19)
  • [Halcon&3D] 主流的3D光學視覺方案及原理

    [Halcon&3D] 主流的3D光學視覺方案及原理

    ??博客主頁:https://loewen.blog.csdn.net ??歡迎點贊 ?? 收藏 ?留言 ?? 如有錯誤敬請指正! ??本文由 丶布布 原創(chuàng),首發(fā)于 CSDN, 轉載注明出處 ?? ??現(xiàn)在的付出,都會是一種沉淀,只為讓你成為更好的人? 一. 前言 傳統(tǒng)工業(yè)機器視覺中, 3D 視覺與 2D 視覺技術的最大區(qū)別在

    2024年02月06日
    瀏覽(19)
  • 機器視覺Halcon-菜單助手讀取圖片方式及注意點

    機器視覺Halcon-菜單助手讀取圖片方式及注意點

    【助手】→【打開新的image acquisition 】→【圖像助手】→【選擇路徑】→【代碼生成】→【插入代碼】 注意:文件與選擇路徑的區(qū)別,以下是生成代碼 1.文件-生成代碼 輸入參數(shù):目錄/圖片具體夾路徑(C:/Users/CP/Desktop/j/1.bmp) 輸出參數(shù):圖像對象(Image) 2.選擇路徑(分段說

    2024年02月10日
    瀏覽(21)
  • C# +HALCON 工業(yè)相機調試

    HALCON error #5312: Image acquisition:device cannot be initialized in operator ? ?winform和HDevelop同時對相機進行連接導致的。關閉其中一個就可以正常連接相機。 HALCON error #5301 Image acquisition:?wrong color depth ? 取相時,報異常。原因是open_framegrabber的ColorSpace參數(shù)設置為rgb。但是相機是黑白相機。

    2024年02月09日
    瀏覽(22)
  • C#與 Halcon 聯(lián)合編程

    C#與 Halcon 聯(lián)合編程

    顯示圖像C#與 Halcon 聯(lián)合編程: 1、調用 Halcon 圖像處理數(shù)據庫,是否調用成功,是利用 Halcon圖像顯示控件—能否正確顯示圖像進行判斷。 如何利用 C#與 Halcon 聯(lián)合編程 調用 Halcon 圖像顯示控件來顯示圖像。 1.創(chuàng)建 C#項目,創(chuàng)建 Windows 窗體應用程序。 2.項目中引用 Halcon 的 DLL

    2023年04月12日
    瀏覽(13)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包