1、Halcon二次開(kāi)發(fā)的兩種方式
① 使用C#的語(yǔ)法方式逐句改寫(xiě)Halcon代碼
優(yōu)點(diǎn):各種變量的類(lèi)型清楚,可讀性強(qiáng),改寫(xiě)后代碼行數(shù)幾乎不會(huì)增加多少。
缺點(diǎn):改寫(xiě)工作量大,容易出錯(cuò),如果Halcon代碼量大,后期將難以更新維護(hù)。
② 封裝成函數(shù)導(dǎo)出(推薦)
優(yōu)點(diǎn):操作簡(jiǎn)單,對(duì)開(kāi)發(fā)人員編程能力要求低,工作量少,且便于維護(hù)。
缺點(diǎn):Halcon函數(shù)導(dǎo)出的代碼可讀性極低,一旦丟失原Halcon文件,二次開(kāi)發(fā)程序?qū)㈦y以更新維護(hù)。
建議:主二副一。
2、Halcon聯(lián)合C#開(kāi)發(fā)必備的設(shè)置步驟(Halcon 12 + Visual studio 2013)
① 在項(xiàng)目“引用”中添加halcondotnet.dll。其一般路徑如下:
C:Program FilesMVTecHALCON-12.0indotnet35halcondotnet.dll
② 在“工具箱”的“選擇項(xiàng)”中添加hWindowControl控件,這是Halcon 12唯一提供的控件
③ 在用到Halcon代碼的類(lèi)頂部添加using HalconDotNet;
④ 在“屬性”——“生成”中將目標(biāo)平臺(tái)由“Any CPU”改為“x64”(計(jì)算機(jī)推薦使用64位系統(tǒng))
⑤ 如果安裝Halcon時(shí)不是安裝在默認(rèn)路徑,可能需要將halcon.dll文件復(fù)制到當(dāng)前項(xiàng)目的輸出路徑下,halcon.dll的路徑為:C:Program FilesMVTecHALCON-12.0inx64-win64halcon.dll
3、Halcon圖形元素的顯示
hWindowControl1.HalconWindow.DispObj(image);//顯示圖像、Region、Xld
hWindowControl1.HalconWindow.SetDraw("margin");//設(shè)置填充的模式
hWindowControl1.HalconWindow.SetColor("green");//設(shè)置顯示顏色
4、系統(tǒng)全局參數(shù)設(shè)置(非必要,但建議設(shè)置)
HOperatorSet.SetSystem("do_low_error","false");//少報(bào)錯(cuò)
HOperatorSet.SetSystem("clip_region","false");//region在圖像外不切掉
HOperatorSet.SetSystem("border_shape_models","true");//依然匹配邊緣的圖形
5、調(diào)試
C#中Halcon部分代碼的調(diào)試不太方便,但也不是毫無(wú)辦法。
① 調(diào)試時(shí)HTuple類(lèi)型的變量可以直接查看值。
② Image、Region、Xld的變量一般只能通過(guò)“保存文件到本地”來(lái)查看變量情況。
HOperatorSet.WriteImage(image,"jpg",0x000000,"1.jpg");//彩色圖像
HOperatorSet.WriteImage(image,"jpg",0,"1.jpg");//灰度圖像
HOperatorSet.WriteRegion(ho_RegionUnion,"1.hobj");//后綴用.reg也行
HOperatorSet.WriteContourXldDxf(contours,"1.dxf");
③ 安裝Halcon的變量檢查插件到Visual Studio。該安裝文件所在的默認(rèn)路徑為:
C:Program FilesMVTecHALCON-12.0miscHALCON_Variable_Inspect.vsix
6、在hWindowControl控件中顯示文字
以下兩個(gè)函數(shù)的內(nèi)容由Halcon中的set_display_font和disp_message算子導(dǎo)出,可完成控件中的文字顯示。
set_display_font(windowHandle,hv_TextSize,"mono","true","false");
disp_message(windowHandle,hv_Text,"window",row,col,hv_Color,"true");
7、格式轉(zhuǎn)換
① HTuple兼容int、double等數(shù)據(jù)類(lèi)型
② HObject類(lèi)型的圖像兼容HImage類(lèi)型的圖像
③ Bitmap轉(zhuǎn)Himage(24位或8位的)的方法如下:
public static HImage Bitmap2HImage_24(Bitmap bImage) { Bitmap bImage24; BitmapData bmData = null; Rectangle rect; IntPtr pBitmap; IntPtr pPixels; HImage hImage = new HImage(); rect = new Rectangle(0, 0, bImage.Width, bImage.Height); bImage24 = new Bitmap(bImage.Width, bImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bImage24); g.DrawImage(bImage, rect); g.Dispose(); bmData = bImage24.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); pBitmap = bmData.Scan0; pPixels = pBitmap; hImage.GenImageInterleaved(pPixels, "bgr", bImage.Width, bImage.Height, -1, "byte", 0, 0, 0, 0, -1, 0); bImage24.UnlockBits(bmData); return hImage; }
public static HImage Bitmap2HImage_8(Bitmap bImage) { Bitmap bImage8; BitmapData bmData = null; Rectangle rect; IntPtr pBitmap; IntPtr pPixels; var hImage = new HImage(); rect = new Rectangle(0, 0, bImage.Width, bImage.Height); bmData = bImage.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); pBitmap = bmData.Scan0; pPixels = pBitmap; hImage.GenImage1("byte", bImage.Width, bImage.Height, pPixels); bImage.UnlockBits(bmData); //formathimage = hImage; return hImage; }
8、在hWindowControl控件中縮放圖像
在hWindowControl中鼠標(biāo)位置可用GetMposition獲得,SetPart可改變窗口中顯示的圖像部分。
HOperatorSet.GetMposition(hWHandle,outmouseY,outmouseX,outmbutton);
HOperatorSet.SetPart(hWHandle,mRow1,mCol1,mRow2,mCol2);
set_part:用于修改窗口中顯示的圖像部分。(Row1,Column1) 表示要顯示的圖像部分的左上角, (Row2,Column2)表示要顯示的圖像部分的右下角。(詳見(jiàn)dev_set_part和set_part的幫助文檔)
9、Halcon圖形元素與其他圖像算法庫(kù)數(shù)據(jù)的交互
Halcon的Region、Xld是自己的特有格式,它們與外界是不通用的。目前我研究出來(lái)的主要是通過(guò)將坐標(biāo)點(diǎn)作為橋梁來(lái)與外界進(jìn)行數(shù)據(jù)交互。
Region轉(zhuǎn)化為坐標(biāo)點(diǎn):get_region_polygon(Region: :Tolerance:Rows,Columns)
坐標(biāo)點(diǎn)轉(zhuǎn)化為Region:gen_region_polygon_filled( :Region:Rows,Columns: )
Xld轉(zhuǎn)化為坐標(biāo)點(diǎn) :get_contour_xld(Contour: : :Row,Col)
坐標(biāo)點(diǎn)轉(zhuǎn)化為Xld :gen_contour_polygon_xld( :Contour:Row,Col: )
來(lái)源:工控Zero
審核編輯:湯梓紅
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7630瀏覽量
90192 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4371瀏覽量
64205 -
代碼
+關(guān)注
關(guān)注
30文章
4887瀏覽量
70260 -
HALCON
+關(guān)注
關(guān)注
17文章
66瀏覽量
27689
原文標(biāo)題:Halcon的C#二次開(kāi)發(fā)及經(jīng)驗(yàn)分享
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
短信貓二次開(kāi)發(fā)專(zhuān)家(DELPHI/ASP/PB/VB/VC/C#/JAVA/ 中間件數(shù)據(jù)庫(kù)接口
[轉(zhuǎn)帖]短信貓二次開(kāi)發(fā)專(zhuān)家(DELPHI/ASP/PB/VB/VC/C#/JAVA/ 中間件數(shù)據(jù)庫(kù)接口
短信貓二次開(kāi)發(fā)專(zhuān)家(DELPHI/ASP/PB/VB/VC/C#/JAVA/ 中間件數(shù)據(jù)庫(kù)接口)
CAXA2011二次開(kāi)發(fā),CRX; CAX2007二次開(kāi)發(fā)
手機(jī)模塊二次開(kāi)發(fā)
地面站二次開(kāi)發(fā)服務(wù)
AutoCAD的二次開(kāi)發(fā)
ANSYS的二次開(kāi)發(fā)技術(shù)
基于VC的Cadence二次開(kāi)發(fā)

評(píng)論