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角度分佈

22. 判斷Region 是否爲空 ?

首先一般region是多個region存在一個regions 變量裏面 。所以 先使用count_obj 獲得有多少個 obj;然後使用 select_obj ,選出一個區域處理;接着使用 area_center ,VC可以使用 region.Id()!=H_EMPTY_REGION 判斷是否爲空 。

23. 新手入門書籍?

首推 《機器視覺算法與應用》,這本書前面更多的是闡述一些通用的機器視覺經驗 ,後面有跟示例,代碼爲halcon8.0,實際使用可能會有部分函數已經被拋棄使用;

其次,岡薩雷斯綠皮書 《數字圖像處理》,介紹內容豐富,全面,但是可能講得比較深,沒有實際實踐或再找資料展開會比較,常讀不深入。是數字圖像處理基礎理論不可多得的書籍。

24. 用halcon調用

halcon支持的品牌相機,使用相機自帶的廠家軟件 可以發現相機,可是halcon總是提示:圖像獲取設備未初始化。這是爲什麼?

把對應品牌的相機配置文件加到採集助手的

使當前halcon調用的相機參數與廠家軟件一致;再確保 相機驅動,採集卡驅動安裝完畢。

25. 屏幕/窗口截圖 。

使用dump_window_image 保存對應窗口截圖,截圖爲當前肉眼所見圖像,包括已經繪製到圖像上的region,xld等。

26.導出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++代碼 ,所以是 此處添加該項。

27. 標定助手的 “平均誤差”是指什麼 ?

這個平均誤差的計算是按如下方式:

1. 計算標定板圖像的 標誌點位置,此處記爲Mark1 ;

2. 標定結束後,將標準標誌點 ,按照得出的轉換矩陣,進行轉換得到Mark2;

3. 由於可以得到Mark1 和 Mark2 點之間對應關係,點對應相減 ,絕對值累加(此處累加方式請具體查標定程序查找具體平均誤差計算函數,很久,已記憶不詳) ,然後除以 標誌點數目 。

4. 此時得到的就是平均誤差 。

28. Halcon參數函數裏面的四個冒號 (::::)是什麼意思?

四個冒號按照參數類型和輸入輸出不同進行了分隔 。 從左到右依次是 (輸入的obj對象 : 輸出的obkj對象 : 輸入的控制變量 : 輸出的控制變量 ) 。

29. 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)

參數名(參數類型) 具體類型->(支持內部參數類型)

30.多線程調用代碼,代碼中包含halcon窗口代碼 ,報錯。

Halcon涉及到窗口的代碼都不能跨線程調用,硬是跨線程調用可能出現參數輸入錯誤等異常情況。參見函數 F1 說明 的 Parallelization 並行性 說明 。最好的辦法是 當前窗口當前線程聲明,定義並使用,其它線程可以對MFC的picturebox 控件進行關聯(不同線程調用該代碼穩定性待測試),然後不同線程自己定義變量進行具體操作。

31.region或者xld繪製或畫到圖像上用哪個函數?

Halcon繪製有paint和overpaint,區別是overpaint是繪製自身,paint輸出可以是其他圖像。

發佈了40 篇原創文章 · 獲贊 67 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章