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