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