關(guān)于0基礎(chǔ)新手入門(mén)HALCON的問(wèn)題簡(jiǎn)答
1.?無(wú)論讀入什么圖像,讀入圖像顯示效果明顯和原始圖像不一致,哪怕是從相機(jī)讀入的圖像,也是明顯顏色差異。什么原因引起?
? 答:初步診斷是,顯示的時(shí)候調(diào)用的顏色查找表存在異常不是 default ,而是其它選項(xiàng)。此時(shí)可以通過(guò)查閱相關(guān)參數(shù),調(diào)用set_system解決,也可以 在 編輯-》參數(shù)選擇-》顏色查找表進(jìn)行更改 。
2.?裁剪圖像;從圖像上截取某段圖像進(jìn)行保存。如何實(shí)現(xiàn)該操作 ?
? 答:首先應(yīng)該知道,region不具有單獨(dú)構(gòu)成圖像的要素,他沒(méi)有灰度值。有用過(guò)opencv的應(yīng)該知道 ROI(感興趣區(qū)域),設(shè)置好它后,對(duì)圖像的大部分操作就轉(zhuǎn)為 圖像的一個(gè)矩形區(qū)域內(nèi)進(jìn)行。類(lèi)似的,halcon有domain 概念。 首先 設(shè)置好一個(gè)矩形區(qū),然后使用 reduce_domain(是一個(gè)矩形區(qū)域)后,再使用crop_domain 就裁剪出圖像。
3.?讀入bmp,或tiff 圖像 顯示 該圖不是bmp文件或不能讀。原因是什么?
? 答:這個(gè)常有新手詢(xún)問(wèn),畫(huà)圖,圖像管理器都能打開(kāi),又或者是相機(jī)采集完直接存到硬盤(pán)。Halcon 讀取圖像 在windows下面到最后是調(diào)用windows庫(kù)函數(shù) 實(shí)現(xiàn)讀圖功能。咱不清楚到底是怎么調(diào)用的。對(duì)于圖像格式,在讀圖函數(shù)F1說(shuō)明很細(xì)?;?bmp 如果 文件頭不是bw還是bm(百度百科bmp格式查找,編寫(xiě)此處時(shí)無(wú)網(wǎng)絡(luò),后續(xù)可能忘記),就讀不進(jìn)來(lái) 。其他規(guī)格歡迎補(bǔ)充。解決辦法,如果是相機(jī)采集,就在內(nèi)存直接轉(zhuǎn)換(參見(jiàn) halcon到VC.pdf 里面的 halcon和bitmap互轉(zhuǎn));如果是采完的圖片,大部分通過(guò)畫(huà)圖工具轉(zhuǎn)換為 24位bmp格式,即可解決。、
4.?讀入avi文件報(bào)錯(cuò)。
? 答:Halcon 通過(guò) directshow或另一個(gè)格式解析視頻,正常來(lái)說(shuō)應(yīng)該可以讀入市面大部分視頻,實(shí)際測(cè)試發(fā)現(xiàn)只能讀入最標(biāo)準(zhǔn)的avi文件格式。如果需要臨時(shí)處理,需要下格式工廠等工具轉(zhuǎn)化為最標(biāo)準(zhǔn)的avi文件格式(論壇葉諾有發(fā)帖說(shuō)明)。
5.?Region 或 xld 篩選 。
? 答:Halcon提供了豐富的region 和xld篩選方法。Region可以使用select_shape_xld,選擇出符合要求的區(qū)域,如果 不能滿(mǎn)足還可以通過(guò) 類(lèi)似 region feature 這樣關(guān)鍵字組合成的算子獲取區(qū)域特征,然后通過(guò) tuple 排序或相加減,再通過(guò) tuple_find 確定是對(duì)應(yīng)哪個(gè)區(qū)域的特征。同樣的halcon也提供了 select_contours_xld 進(jìn)行輪廓篩選 。
6.?Halcon分幾類(lèi)對(duì)象,每個(gè)類(lèi)的功用是?
? 答:Halcon總分倆大類(lèi),tuple和圖標(biāo)對(duì)象obj 。Tuple涵蓋了對(duì) 所有基礎(chǔ)數(shù)據(jù)類(lèi)型的封裝,可以理解為她是halcon定義的數(shù)組類(lèi)。Obj 是alcon定義圖標(biāo)類(lèi)基類(lèi)。衍生出了許多類(lèi)型,其中 Region ,Xld,Image 其中最主要的類(lèi)型。
7.?F1說(shuō)明,參數(shù)部分 -array 是什么意思?
? 答:該符號(hào)說(shuō)明,該參數(shù)接受一組輸入,對(duì)tuple就是一組tuple,對(duì)obj 就是通過(guò)concat_obj或其它操作產(chǎn)生的一組obj元組。
8.?倆個(gè)相對(duì)方形物體的距離計(jì)算。
? 答:如果這倆個(gè)物體和背景對(duì)比清晰,最近的距離在倆條邊下則可以再預(yù)處理之后進(jìn)行如下操作:
1.Segement_contours_xld 分割邊緣線(xiàn)段(edgeXXXX等得到的邊緣);
2.select_contours_xld 選擇出特定的長(zhǎng)度或方向邊緣;
3.假設(shè)此時(shí)剛好獲取倆條線(xiàn) ,則可以利用 distance_ll ,求得 距離,也可以自己fit_lineXXXX 擬合直線(xiàn)再求距離;
? 以上是一種方法,另一種常見(jiàn)方法是利用 measure_pos? 或measure_pair 進(jìn)行測(cè)量,不熟悉的可以翻看示例或者使用 測(cè)量助手進(jìn)行測(cè)量 。
9.?創(chuàng)建過(guò)程或函數(shù),或者全文編輯。
? 答:在算子編輯窗口,main所在行右邊,有四個(gè)按鈕,將鼠標(biāo)移到該位置,將有中文提示,按提示點(diǎn)擊按鈕。
10.?從其它halcon環(huán)境窗口復(fù)制函數(shù)或算子 復(fù)制 到新建的halcon窗口,無(wú)法使用,提示不識(shí)別。
? 答:除了敲錯(cuò),此種情況都是由于該函數(shù)式本地或全局函數(shù),而不是halcon算子。確定的方法:注意該算子顏色然后去 編輯 參數(shù)選擇 查看該顏色代表的算子屬于什么類(lèi)型函數(shù)。亦可以直接右鍵,如果有查看函數(shù)。為黑色可點(diǎn)擊,這種情況也是本地或全局函數(shù)。
?? 解決方法:如果是全局函數(shù),可以在halcon目錄下面找到該函數(shù),加載到新窗口就行;也可以新建輸入輸出一致的過(guò)程,將代碼復(fù)制過(guò)來(lái),然后使用。本地函數(shù)只能使用后一種方法解決。
11.?64位系統(tǒng),VS2010及以下版本 報(bào) error LNK1112:模塊計(jì)算機(jī)類(lèi)型”X86” 與目標(biāo)計(jì)算機(jī)類(lèi)型”X64” 沖突 。
? 答:?jiǎn)栴}原因是默認(rèn)情況,halcon在64位系統(tǒng)會(huì)自動(dòng)安裝64位halcondll,并且添加到環(huán)境變量;而vs一般是默認(rèn)X86編譯環(huán)境,倆者dll庫(kù)不一致,換句話(huà)說(shuō)是底層機(jī)器指令不一致。解決辦法是 將編譯環(huán)境設(shè)置為64位,詳見(jiàn)百度 ;或者再次安裝halcon選擇32位dll,并修改環(huán)境變量 VC++路徑為32位庫(kù)路徑,bin 指向32位dll 路徑。
12.?64位系統(tǒng),VS2012 。無(wú)論怎么更改庫(kù)文件,頭文件,名空間,最好的提示也是找不到函數(shù)定義。
?? 答:反復(fù)出現(xiàn),無(wú)法解決時(shí),有可能是 問(wèn)題11所述問(wèn)題,解決辦法見(jiàn)11.至于為何不提示error LNK1112,可能是VS更改了前面檢測(cè)等級(jí),在編譯階段就攔截到錯(cuò)誤。應(yīng)該說(shuō)是更先進(jìn)了,只是比較不合情理。
13.?如何查找halcon算子?
?答:Halcon算子命名大部分所見(jiàn)即所得,也就是如果你記得你要找的算子漢字名稱(chēng),輸入到翻譯器得到英文單詞,在F1 的算子分欄 從頭開(kāi)始輸大部分能找到一些算子,這時(shí)候再點(diǎn)擊進(jìn)去注意算子功能解釋?zhuān)耸亲约阂木湍闷饋?lái)到例程搜索示例,查閱功能;不懂就看說(shuō)明部分;再不懂進(jìn)群?jiǎn)枴?br/>? 另外 ,對(duì)于近半算子是 按 動(dòng)作_類(lèi)型/目標(biāo)_屬性 命名。 Obj 是 region,xld,image的父類(lèi),后三者找不到的算子可以輸入 obj查找 。
14.?Halcon 相等,不等于,異或,或等操作符。
?? 答:直接在F1 出來(lái)的分欄 輸入 operation ,查找可得。
15.?在halcon環(huán)境 使用 get_grayval 進(jìn)行像素操作太慢 ,如何加速?
?? 答:注意到halcon環(huán)境是解釋執(zhí)行,get_grayval 可以一次獲取多個(gè),可以預(yù)先把行數(shù)據(jù)存入一個(gè)tuple對(duì)象,存一次以后可用多次。因此提速方法,建議事先創(chuàng)建好行tuple (用tuple_add 加一,即可實(shí)現(xiàn)所有行加一),列的tuple 數(shù)組 (創(chuàng)建好可以用多次) 。這時(shí)每次再調(diào)用get_grayval ,速度將顯著提升,因?yàn)楣?jié)省了逐行解釋時(shí)間 。注意:如果導(dǎo)出到VC,則建議用get_image_pointer 獲取指針進(jìn)行操作 。
16.?從一組region或xld,image中獲取單個(gè)對(duì)象,或多個(gè)halcon同類(lèi)對(duì)象構(gòu)成
-array 元組。
? 答:select_obj負(fù)責(zé)從 多個(gè)對(duì)象的元組選出指定序號(hào)對(duì)象;concat_obj執(zhí)行將倆個(gè)對(duì)象(或元組)鏈接成一個(gè)對(duì)象元組。
17.?更改halcon顏色查找表,顯示不同顏色空間 。
? 答:在編輯 參數(shù)選擇 顏色查找表進(jìn)行更改;也可以在F1輸入lut進(jìn)行查找設(shè)置函數(shù)。
18.?創(chuàng)建空對(duì)象 ,空Region ,空數(shù)組。
? 答:gen_empty_obj 創(chuàng)建空的對(duì)象;gen_emtpy_region 創(chuàng)建空數(shù)組;halcon環(huán)境中tuple 用 :=[] 。
19.?Region和xld 互相轉(zhuǎn)化 ;多邊形創(chuàng)建xld;直方圖,直線(xiàn),點(diǎn)集,多邊形,行程編碼創(chuàng)建region 。
? 答:Halcon里對(duì)象之間的相互轉(zhuǎn)換,一般可以轉(zhuǎn)化為gen_目標(biāo)對(duì)象_源對(duì)象 形式 。如:gen_region_contour_xld? 使用xld創(chuàng)建一個(gè)region ;gen_contour_region_xld 從區(qū)域region創(chuàng)建一個(gè)輪廓xld 。直方圖histo;直線(xiàn)是line,點(diǎn)集是points,行程編碼runs,黑森線(xiàn)hline,多邊形polygon 。按照上面格式進(jìn)行查找 。
20.?Halcon偽彩色
? 答:可以參照岡薩雷斯偽彩色 章節(jié) 。
21.?Halcon角度分布
?
?????
????????90~180 ??????????????????????0~90
?
?
?
????????180~270 ?????????????????????270~360
?
?
22.?判斷Region 是否為空 ?
?? 答:首先一般region是多個(gè)region存在一個(gè)regions 變量里面 。所以 先使用count_obj 獲得有多少個(gè) obj;然后使用 select_obj ,選出一個(gè)區(qū)域處理;接著使用 area_center ,VC可以使用 region.Id()!=H_EMPTY_REGION 判斷是否為空 。
23.?用halcon調(diào)用halcon支持的品牌相機(jī),使用相機(jī)自帶的廠家軟件 可以發(fā)現(xiàn)相機(jī),可是halcon總是提示:圖像獲取設(shè)備未初始化。這是為什么?
?? 答:把對(duì)應(yīng)品牌的相機(jī)配置文件加到采集助手的,使當(dāng)前halcon調(diào)用的相機(jī)參數(shù)與廠家軟件一致;再確保 相機(jī)驅(qū)動(dòng),采集卡驅(qū)動(dòng)安裝完畢。
24.?屏幕/窗口截圖 。
?? 答:使用dump_window_image 保存對(duì)應(yīng)窗口截圖,截圖為當(dāng)前肉眼所見(jiàn)圖像,包括已經(jīng)繪制到圖像上的region,xld等。
25.?導(dǎo)出halcon 11 代碼為C++ 代碼,經(jīng)常提示不識(shí)別 ,或者 名空間名字沒(méi)找到 。解決辦法 是什么?
?? 答:首先 halcon11 導(dǎo)出如果沒(méi)有勾選10 ,默認(rèn)產(chǎn)生的C++代碼,對(duì)應(yīng)的主要頭文件是 HalconCPP.h 和 using namespace HalconCPP 。
配置如下 頭文件 #include “HalconCPP.h” ,代碼在導(dǎo)出時(shí)已經(jīng)自動(dòng)生成 。
using namespace HalconCPP;?? 代碼導(dǎo)出時(shí)已經(jīng)自動(dòng)生成 。
在VC++目錄 ,配置include路徑 ,一個(gè)是 默認(rèn)Halcon安裝文件夾下面的include ,另外一個(gè)根據(jù)你導(dǎo)出的代碼而定,上面是 halconCPP ,所以對(duì)應(yīng)添加 include文件夾下面的 HalconCPP文件夾到路徑里面 。
此外配置? 將安裝文件夾下的lib添加到 庫(kù)文件 目錄 。
最后將 HalconCPP.lib添加到 庫(kù)的 依賴(lài)項(xiàng)。注意此處要一句導(dǎo)出代碼而定,上述導(dǎo)出的是halcon -C++代碼 ,所以是 此處添加該項(xiàng)。
26.?標(biāo)定助手的 “平均誤差”是指什么 ?
?答:這個(gè)平均誤差的計(jì)算是按如下方式:
1).計(jì)算標(biāo)定板圖像的 標(biāo)志點(diǎn)位置,此處記為Mark1 ;
2).標(biāo)定結(jié)束后,將標(biāo)準(zhǔn)標(biāo)志點(diǎn) ,按照得出的轉(zhuǎn)換矩陣,進(jìn)行轉(zhuǎn)換得到Mark2;
3).由于可以得到Mark1 和 Mark2 點(diǎn)之間對(duì)應(yīng)關(guān)系,點(diǎn)對(duì)應(yīng)相減 ,絕對(duì)值累加(此處累加方式請(qǐng)具體查標(biāo)定程序查找具體平均誤差計(jì)算函數(shù),很久,已記憶不詳) ,然后除以 標(biāo)志點(diǎn)數(shù)目 。
4).此時(shí)得到的就是平均誤差 。
27.?Halcon參數(shù)函數(shù)里面的四個(gè)冒號(hào) (::::)是什么意思?
?答:四個(gè)冒號(hào)按照參數(shù)類(lèi)型和輸入輸出不同進(jìn)行了分隔 。 從左到右依次是? (輸入的obj對(duì)象 : 輸出的obkj對(duì)象 : 輸入的控制變量 : 輸出的控制變量 ) 。
28.?Halcon F1 算子 Parameters 格式說(shuō)明 。
?答:例1:Image1 (input_object)? (multichannel-)image(-array) → object (byte* / int1* / int2* / uint2* / int4* / int8 / real*) *allowed for compute devices
Input image 1.
???????? Image1 對(duì)應(yīng)參數(shù)名??? input_object? 指示對(duì)象參數(shù)類(lèi)型 是輸入對(duì)象
???????? (multichannel-) 指示是可以是多通道圖像?? image? 指示 參數(shù)是一個(gè) image類(lèi)型
???????? (-array)? 指示可以一次輸入多個(gè)??? object(……) 指示輸入的是object,其中支持的object參數(shù)的內(nèi)部類(lèi)型如(……)所示 。
例2: Mult (input_control)? number → (real / integer)
?????? 參數(shù)名(參數(shù)類(lèi)型)??? 具體類(lèi)型->(支持內(nèi)部參數(shù)類(lèi)型)
29.?多線(xiàn)程調(diào)用代碼,代碼中包含halcon窗口代碼 ,報(bào)錯(cuò)。
? 答:Halcon涉及到窗口的代碼都不能跨線(xiàn)程調(diào)用,硬是跨線(xiàn)程調(diào)用可能出現(xiàn)參數(shù)輸入錯(cuò)誤等異常情況。參見(jiàn)函數(shù) F1 說(shuō)明 的 Parallelization 并行性 說(shuō)明 。最好的辦法是 當(dāng)前窗口當(dāng)前線(xiàn)程聲明,定義并使用,其它線(xiàn)程可以對(duì)MFC的picturebox 控件進(jìn)行關(guān)聯(lián)(不同線(xiàn)程調(diào)用該代碼穩(wěn)定性待測(cè)試),然后不同線(xiàn)程自己定義變量進(jìn)行具體操作。
30.?region或者xld繪制或畫(huà)到圖像上用哪個(gè)函數(shù)?
? 答:Halcon繪制有paint和overpaint,區(qū)別是overpaint是繪制自身,paint輸出可以是其他圖像。
?? 繪制region:paint_region 繪制xld: paint_xld 。
31.?線(xiàn)觸發(fā),軟觸發(fā),外觸發(fā)
? 答:軟觸發(fā):顧名思義就是到達(dá)設(shè)定的采集條件時(shí),通過(guò)軟件設(shè)置觸發(fā)采集;
???? 線(xiàn)觸發(fā):也稱(chēng)外觸發(fā),是利用相機(jī)自帶觸發(fā)線(xiàn),在到達(dá)設(shè)定的采集條件時(shí),觸發(fā)相機(jī)采集,線(xiàn)的信號(hào)通常是由其他設(shè)備如:紅外傳感器,探測(cè)到目標(biāo)物體出現(xiàn)在預(yù)定位置,就進(jìn)行采集
32.?編寫(xiě)程序過(guò)程中,程序崩潰,環(huán)境保存路徑 。(待驗(yàn)證)
? 答: 對(duì)于windows系統(tǒng),路徑是 C:\Documents and Settings\login\Local Settings\Temp\hdevelop.? 其中l(wèi)ogin為登錄的系統(tǒng)用戶(hù)名 。
?? 注意1: 在win xp 下測(cè)試 ,在調(diào)試程序過(guò)程中未發(fā)現(xiàn)臨時(shí)文本 。所以待驗(yàn)證 。
?? 注意2:win7要求版本為11.0.1之后 ,之前版本存在bug 。