Halcon例程(基于3D形狀匹配識別方法)詳解 —— create_shape_model_3d_lowest_model_level.hdev

一、例程簡介

最近在研究3D識別方面的東西,查了不少資料,發現halcon里有不少關于三維物體識別的例程,這里對其中一個做出詳解。該例程是基于三維匹配方法的,因為有三維模型SM3,所以不需要自己創建;另因為例程中的圖像有多種不同的姿態,建立三維模型所需要的內存會很大,所以設定最低模型級別,顯著降低了算法運行時間,但相對的,會損失算法的魯棒性和檢索時間。
在這里插入圖片描述

二、例程詳解

dev_update_off ()
* 設置面掃相機參數,參數可通過相機校正來獲取。此算子為庫函數,通過Division畸變模型生成一個相機參數元組。
* 其中參數含義為(焦距,模擬徑向透鏡畸變的畸變系數,傳感器上兩個相鄰單元之間的水平距離,傳感器上兩個相鄰單元之間的垂直距離,光心列坐標,光心行坐標,圖寬,圖高,輸出相機參數)
gen_cam_par_area_scan_division (0.0269462, -354.842, 1.27964e-005, 1.28e-005, 254.24, 201.977, 512, 384, CamParam)
{ CameraParam :=['area_scan_division',Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight]
return () }
* 獲取相機參數,返回要求的圖像寬參數。
get_cam_par_data (CamParam, 'image_width', IWidth)
{
*返回相機的類型和參數名
get_cam_par_names (CameraParam, CameraType, CameraParamNames)
* 
* 找到相機數據的索引并返回對應的值。
ParamValue := []
*依次讀取參數名,ParamName在get_cam_par_names已被賦值,為'image_width'
for Index := 0 to |ParamName| - 1 by 1ParamNameInd := ParamName[Index]if (ParamNameInd == 'camera_type')ParamValue := [ParamValue,CameraType]continueendif* I為'image_width'在CameraParamNames的索引值,為7I := find(CameraParamNames,ParamNameInd)if (I != -1)*將圖寬值賦值給ParamValueParamValue := [ParamValue,CameraParam[I]]elsethrow ('Unknown camera parameter ' + ParamNameInd)endif
endfor
return () }
get_cam_par_data (CamParam, 'image_height', IHeight)
* 
read_image (Image, 'tile_spacers/tile_spacers_color_01')
dev_close_window ()
dev_open_window (0, 0, 512 * 1.5, 384 * 1.5, 'white', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (3)
dev_clear_window ()
disp_message (WindowHandle, 'Reading the 3D shape model file from disk ...', 'window', 12, 12, 'black', 'false')
* 如果磁盤沒有可用的話就創建3D模型
try
*  讀取3D形狀模型,具體地址在C盤MVTec文件夾下examples\hdevelop\3D-Matching\Shape-Based。read_shape_model_3d ('tile_spacer.sm3', ShapeModel3DID)
catch (Exception)* 讀目標3D模型的DXF文件,CAD格式,但因為上一步可以運行,所以這一部分沒用了。* 參數(文件名,文件單位的轉換尺度(單位為100um),參數名,參數值,3D模型句柄,狀態信息)read_object_model_3d ('tile_spacer.dxf', 0.0001, [], [], ObjectModel3DID, DXFStatus)*為指定操作準備3D模型,可以計算所需要的值并儲存在objectModel3D*參數(3D模型句柄,目的,指定是否應覆蓋已存在的數據,參數名,參數值)prepare_object_model_3d (ObjectModel3DID, 'shape_based_matching_3d', 'true', [], [])disp_message (WindowHandle, 'Reading the 3D shape model file from disk ... not found!', 'window', 12, 12, 'red', 'false')disp_message (WindowHandle, 'Creating the 3D shape model (may take a few seconds) ...', 'window', 42, 12, 'black', 'false')count_seconds (S1)* 創建3D形狀模型,是通過計算三維物體模型在用戶指定的姿勢范圍內的不同視圖而生成的。通過在三維物體模型周圍放置虛擬攝像機,并將三維物體模型投影到每個虛擬攝像機位置的圖像平面上,自動生成視圖;* 因此,在生成三維形狀模型時,不使用對象的圖像,只使用在objectModel3D中傳遞的三維對象模型,所有視圖的形狀表示都存儲在三維形狀模型中,該模型返回到shapeModel3DID中。在創建三維形狀模型之前,必須校準相機,以防止畸變。* 參數(3D模型句柄,相機參數,沿x軸/x分量旋轉的羅德里格斯矢量,y軸,z軸,參考向量的旋轉值,模型視圖的最小經度,* 最大經度,模型視圖的最小緯度,最大緯度,模型視圖的最小攝影機滾動角度,最大角度,模型視圖的最小攝影機對象距離,最大距離,搜索圖像中對象的最小對比度,用于控制運算符行為的(可選)參數的名稱(最低模型級別),可選參數值,句柄)create_shape_model_3d (ObjectModel3DID, CamParam, 0, 0, 0, 'gba', -rad(60), rad(60), -rad(60), rad(60), 0, rad(360), 0.26, 0.27, 10, 'lowest_model_level', 3, ShapeModel3DID)count_seconds (S2)T := S2 - S1disp_message (WindowHandle, 'Creation time: ' + T$'.3' + ' s', 'window', 72, 12, 'black', 'false')trydisp_message (WindowHandle, 'Writing model to disk ...', 'window', 102, 12, 'black', 'false')*存儲3D模型write_shape_model_3d (ShapeModel3DID, 'tile_spacer.sm3')catch (Exception)disp_message (WindowHandle, 'Writing model to disk ... failed!', 'window', 102, 12, 'red', 'false')disp_continue_message (WindowHandle, 'black', 'true')stop ()endtry
endtry
*顯示模型信息
disp_lowest_model_level_info (WindowHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 匹配
Times := []
NumImages := 12
for I := 1 to NumImages by 1read_image (Image, 'tile_spacers/tile_spacers_color_' + I$'02')dev_display (Image)* * 查找三個三維模型的實例,將“border”模型設置為“true”,因為對象可能會接觸圖像邊界* 程序開始到現在過去的時間count_seconds (Seconds1)*在圖像中找出一個3D模型的最佳匹配*參數(輸入圖像,3D模型的句柄,最低分數(值越大,搜索速度越快),貪婪度(值越大,搜索越快,但更容易失敗),(該值決定搜索過程中金字塔層的數量,設為0,則數量為創建模型時的指定值),控制操作行為的參數名,參數值,模型的3D位姿,姿態參數的36個協方差或6個標準差,分數)find_shape_model_3d (Image,  ShapeModel3DID,0.7, 0.85, 0, ['num_matches','max_overlap','border_model'], [3,0.75,'true'], Pose, CovPose, Score)count_seconds (Seconds2)計算匹配時間Time := Seconds2 - Seconds1Times := [Times,Time]*通過使用匹配的姿勢將三維形狀模型投影到圖像中,將找到的匹配項可視化for J := 0 to |Score| - 1 by 1*顯示輪廓PoseTmp := Pose[J * 7:J * 7 + 6]*將三維形狀模型的邊投影到圖像坐標中。project_shape_model_3d (ModelContours, ShapeModel3DID, CamParam, PoseTmp, 'true', rad(30))dev_set_color ('yellow')dev_display (ModelContours)* 顯示3D模型的坐標系dev_set_colored (3)disp_3d_coord_system (WindowHandle, CamParam, PoseTmp, 0.015)endforfor K := 0 to |Score| - 1 by 1* 顯示找到的位姿的參數PoseTmp := Pose[K * 7:K * 7 + 6]*自定義函數,顯示位姿信息display_match_pose (ShapeModel3DID, PoseTmp, WindowHandle){*查找模型參數(參考點坐標),get_shape_model_3d_params (ShapeModel3DID, 'reference_point', ReferencePoint)*查找相機參數get_shape_model_3d_params (ShapeModel3DID, 'cam_param', CamParam)
* 
* Project the reference point
* 將三維姿態轉換為齊次變換矩陣。
pose_to_hom_mat3d (Pose, HomMat3D)
*對點應用任意仿射3D變換
affine_trans_point_3d (HomMat3D, ReferencePoint[0], ReferencePoint[1], ReferencePoint[2], X, Y, Z)
*將3D點投影到(亞)像素圖像坐標中。
project_3d_point (X, Y, Z, CamParam, Row, Column)
* 顯示參考點坐標
Message := 'Pose:'
Message[1] := '   X: ' + (1000 * Pose[0])$'4.1f' + ' mm'
Message[2] := '   Y: ' + (1000 * Pose[1])$'4.1f' + ' mm'
Message[3] := '   Z: ' + (1000 * Pose[2])$'4.1f' + ' mm'
Message[4] := '   Alpha: ' + Pose[3]$'4.1f' + '°'
Message[5] := '   Beta: ' + Pose[4]$'4.1f' + '°'
Message[6] := '   Gamma: ' + Pose[5]$'4.1f' + '°'
disp_message (WindowHandle, Message, 'image', Row, Column - 30, 'black', ['#ffffffcc','false'])
return () }endfor*在左上角顯示匹配用時disp_message (WindowHandle, |Score| + ' Match(es) found in ' + Time$'4.2f' + ' s', 'window', 12, 12, 'dark green', ['white','false'])if (I < NumImages)disp_continue_message (WindowHandle, 'black', ['white','false'])stop ()endif
endfor
* 
disp_end_of_program_message (WindowHandle, 'black', ['white','false'])

三、總結

下面對上述基于形狀的3D匹配方法進行總結,主要包含以下幾個步驟:
1.讀取/創建3D模型read_object_model_3d/create_shape_model_3d;
2.對二維圖像進行3D匹配,計算得分,find_shape_model_3d
3將匹配結果可視化,project_shape_model_3d,project_3d_point
總的來看,這種3D匹配方法還是比較好用的,對于物體間遮擋的情況也可以進行識別,難點在于調參吧。該方法的原理根據三維模型的位姿信息來對圖像中的目標進行搜索并判斷,返回一個匹配度值,網上沒有更為詳細的代碼,應該是比較難吧,基于點云的還有不少資料,目前業界關于3D識別方面的項目還沒有很普遍,研究者較少,希望后面有所改善。
如果大家有意見和想法,可以一起交流,注意點贊評論哦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256391.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256391.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256391.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

15.瀑布流、測量

排行界面TopProtocol &#xff1a;json數據就是寫字符串&#xff0c;所以不需要寫bean對象public class TopProtocol extends BaseProtocol<List<String>> { Override public List<String> paserJson(String json) { List<String> datasnew ArrayList&…

linear-gradient線性漸變

background:linear-gradient(180deg, sliver 20%, skyblue 80%, gray 100%);180deg 是線性漸變的角度,水平方向;如果是90deg,則是垂直方向. silver 20% 是最上面的顏色和該顏色所在的位置,可以為負值,,如 linear-gradient(180deg, silver -7%, pink 80%, skyblue 127%);的效果是…

numpy——stack

np.stack(array,axis,outNone)&#xff0c;函數原型。 其中最重要是的這個axis怎么理解的。 舉例說明&#xff1a;arrays [np.random.randn(3, 4) for _ in range(10)] 會生成一個 10 *( 3 * 4 )的矩陣列表。十個矩陣&#xff0c;每個矩陣是(3 * 4)大小。 首先說明一下axis的映…

C# —— 簡單工廠設計模式詳述

一、基本概念 眾所周知&#xff0c;C#是一種面向對象的語言&#xff0c;而其中封裝&#xff0c;繼承&#xff0c;多態是面向對象的三大重要特征&#xff0c;簡單工廠的設計模式則可以完全體現這些特征。要徹底理解這個模式&#xff0c;必須要先將封裝&#xff08;訪問修飾符的…

【計算機視覺】計算機視覺、模式識別、機器學習常用牛人主頁鏈接

計算機視覺、模式識別、機器學習常用牛人主頁鏈接 牛人主頁&#xff08;主頁有很多論文代碼&#xff09; Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager類引用方法

c#添加了Configuration;后&#xff0c;竟然找不到 ConfigurationManager 這個類&#xff0c;后來才發現&#xff1a;雖然引用了using System.Configuration;這個包&#xff0c;但是還是不行的。 后來終于找到一個解決方法&#xff0c;就是在解決方案資源管理器里找到類文件選擇…

機器學習——支持向量機SVM之python實現簡單實例一(含數據預處理、交叉驗證、參數優化等)

目錄 一、SVM理論 二、numpy的相關函數介紹 三、python實現之準備 1、數據集的下載

工業相機常用類型詳述

一、工業相機定義 工業相機是應用于工業領域、安防和交通等對相機要求較高領域的攝像機&#xff0c;功能就是將光信號轉變成有序的電信號&#xff0c;此信號經過模數轉換為數字信號&#xff0c;然后傳遞給圖像處理器。與一般的家用相機相比&#xff0c;其具有更高的穩定性能&a…

機器學習——SVM之python實現數據樣本標準化和歸一化

目錄 一、標準化和歸一化的目的 1、標準化 2、歸一化 二、標準化和歸一化常用的理論公式 1、歸一化 2、標準化 三、python實現SVM樣本數據標準化和歸一化 1、標準化 2、歸一化 本文源代碼&#xff1a;《機器學習——支持向量機SVM之python實現簡單實例一》 一、標準化…

[黑群暉經典教程] 一步一步建立自己的黑群暉

【申明&#xff1a;本文并非本人所作&#xff0c;為內部網絡中一位大神所寫&#xff0c;個人覺得寫得很好&#xff0c;遂原文搬了過來&#xff0c;如有侵犯原作者的權利&#xff0c;請及時與我聯系】 PS:有好幾個兄弟覺得我擅自轉發&#xff0c;不是很妥。解釋一下&#xff1a;…

Java為什么能跨平臺運行

因為java程序編譯之后的代碼不是能被硬件系統直接運行的代碼&#xff0c;而是一種“中間碼”--字節碼。不同的硬件平臺上裝有不同的java虛擬機&#xff08;JVM&#xff09;&#xff0c;由JVM來把字節碼再翻譯成所對應的硬件平臺能夠執行的代碼&#xff0c;因此java可以跨平臺運…

C++和Opencv4.5 實現全景圖像拼接

前言 最近剛下了最新版的opencv4.5&#xff0c;急不可待的試下操作&#xff0c;就用了opencv自帶的Stitcher類拼接下圖像&#xff0c;結果傻眼了&#xff0c;程序顯示Stitcher沒有createDefault成員&#xff0c;看了好久&#xff0c;終于找到了解決方法。 Stitcher原理 Stit…

機器學習——python實現SVM模型w,b的查看

基于源代碼&#xff1a;《機器學習——支持向量機SVM之python實現簡單實例一》進行講解 1、線性模型 這里以二特征三類&#xff0c;一對多策略為案例 kernel “linear”&#xff1a;線性核&#xff0c;參數有w&#xff0c;b 線性模型的決策邊界是&#xff1a;w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

轉載于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移動端輸入框彈出鍵盤控制

在移動端&#xff0c;我們公司通過輸入框主要收集用戶的姓名和電話&#xff0c;以下是對輸入框獲取焦點時&#xff0c;控制彈出鍵盤的樣式來增強用戶體驗。 輸入姓名 我們的用戶都是中國人&#xff0c;輸入用戶名為中文&#xff0c;所以彈出鍵盤是輸入中文狀態即可&#xff0c;…

Opencv4.5-C++ 攝像頭畫面鏡像顯示及文件保存

前言 想試下新買電腦的攝像頭好用不&#xff0c;就寫了個攝像頭調用程序&#xff0c;實現了鏡像和圖片截取保存。 代碼 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

機器學習之支持向量機SVM之python實現ROC曲線繪制(二分類和多分類)

目錄 一、ROC曲線 二、TP、FP、TN、FN 三、 python繪制ROC曲線(二分類) 1、思路 2、關鍵代碼

easyui datagrid 列拖動

實現代碼-code <script type"text/javascript"> $.extend($.fn.datagrid.methods, { columnMoving: function(jq) { return jq.each(function() { var target this; var cells $(this).datagrid(getPanel).find(div.datagrid-header td[field]); cells.dragg…

window linux IPC ftok BY_HANDLE_FILE_INFORMATION

看這題目就很亂&#xff0c;心情當然也是不怎么美好了。前一段時間做了一個項目&#xff0c;AIX(Unix的一種&#xff09;中的一個系統向WINDOWS移植&#xff0c;開發環境由IBM的C/C(叫什么忘記了&#xff0c;好像是xlC)變為VC。 這是算過來&#xff0c;但是最近進程通信的信號量…

相機標定(一) —— 深入理解齊次坐標及其作用

一、什么是齊次坐標和齊次坐標系 齊次坐標 齊次坐標是一個相機標定問題的關鍵理論之一&#xff0c;所以就此問題分析一下。 單從定義上來講&#xff0c;齊次坐標&#xff08;投影坐標&#xff09;就是用N1維來代表N維坐標&#xff08;點和向量&#xff09;&#xff0c;也可說…