Halcon|讀取3D相機點云數據

Halcon|讀取3D相機點云數據

最近發現很多小伙伴在使用Halcon處理3D工業相機掃描結果的時候遇到了“如何讀取”的問題。一般的3D工業相機儲存數據的格式有txt格式、tif格式、csv格式、ply格式、ptx格式、bin格式、obj格式等。

txt格式

讀取txt文件生成3D模型一般需要分析txt文件的儲存格式,下圖是我使用的工業相機儲存的部分txt數據:
txt文件
經過分析,前3列為X、Y、Z坐標,第4列到第6列為每一點的法線坐標nX、nY、nZ,第7列到第9列為灰度值。因此我們采用以下代碼重構3D模型:

open_file ('data.txt', 'input', XYZ) #打開文件
X :=[]
Y :=[]
Z :=[]
nX :=[]
nY :=[]
nZ :=[]
Gray :=[]
fread_line (XYZ, OutLine, IsEOF) #讀文件中一行的字符串
tuple_split (OutLine, ' ', Substrings) #根據空格分割一行的字符串
while (IsEOF==0) #將X Y Z nX nY nZ Gray分別存儲在不同的元組中X :=[X,Substrings[0]]Y :=[Y,Substrings[1]]Z :=[Z,Substrings[2]]nX :=[nX,Substrings[3]]nY :=[nY,Substrings[4]]nZ :=[nY,Substrings[5]]Gray :=[Gray,Substrings[6]]fread_line (XYZ, OutLine, IsEOF)tuple_split (OutLine, ' ', Substrings)
endwhile
close_file (XYZ) #關閉文件
tuple_number (X, NumberX) 
tuple_number (Y, NumberY) 
tuple_number (Z, NumberZ)  #將字符串轉化為數字
gen_object_model_3d_from_points (NumberX, NumberY, NumberZ, ObjectModel3D) #構建3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示3D模型

代碼中的IsEOF參數為循環的判斷變量,當文件未到末尾時,IsEOF為0;當文件到達末尾時,IsEOF為1。
3D模型顯示結果如下:
3D模型
注意:1、通過元組生成3D模型時,采用gen_object_model_3d_from_points算子;2、一些3D相機的txt文件的數據之間采用@相連,此時應使用@對字符串進行分割。

tif格式

tif圖片格式是工業相機損失較小的圖片格式。一般3D相機會將不同的數據保存在不同的tif圖片中。下圖是我使用的工業相機儲存的tif文件:
tif文件
其中,PointCloud_X PointCloud_Y PointCloud_Z為將點云的XYZ坐標作為灰度值生成的圖片,NormalMap_X NormalMap_Y NormalMap_Z為將點云的XYZ法線坐標作為灰度值生成的圖片,Texture為一般的灰度圖片。可使用以下代碼重構3D模型:

read_image (PointcloudX, '0-400_IMG_PointCloud_X.tif') 
read_image (PointcloudY, '0-400_IMG_PointCloud_Y.tif')
read_image (PointcloudZ, '0-400_IMG_PointCloud_Z.tif') #分別讀取XYZ坐標
xyz_to_object_model_3d (PointcloudX, PointcloudY, PointcloudZ, ObjectModel3D) #生成3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示3D模型

3D模型
其中,讀取的PointcloudX PointcloudY PointcloudZ等圖片也可以先做Blob分析之后再合成3D模型。此時,若PointcloudX PointcloudY PointcloudZ的大小不一致,代碼:

xyz_to_object_model_3d (PointcloudX, PointcloudY, PointcloudZ, ObjectModel3D) 

生成的3D模型將以PointcloudX為準。
注意:與算子gen_object_model_3d_from_points作對比,當通過圖片生成3D模型時,采用xyz_to_object_model_3d算子

Halcon直接讀取

我購買的工業相機可以直接采用以下代碼實時抓取數據,可以作為其他工業相機實施抓取數據的參考。

open_framegrabber ('PhoXi', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', '2018-08-034-LC3', -1, -1, AcqHandle) #打開相機
get_framegrabber_param (AcqHandle, 'revision', Revision) #得到相機參數
GrabDataItems:=['PointCloud', 'Texture', 'NormalMap', 'ConfidenceMap']
set_framegrabber_param (AcqHandle, 'grab_data_items', GrabDataItems) #設置相機參數
grab_data (ImageData, Region, Contours, AcqHandle, Data) #抓取數據
select_obj (ImageData, XYZ, 1) #選擇3維數據XYZ(點云坐標)
select_obj (ImageData, Texture, 2) #選擇1維度數據Texture
select_obj (ImageData, Normals, 3) #選擇3維數據Normals(法線)
select_obj (ImageData, Confidence, 4) #選擇1維數據Confidence
decompose3 (XYZ, XImage, YImage, ZImage) #將XYZ分解為X Y Z三通道
decompose3(Normals, nX, nY, nZ)  #將Normals分解為nX nY nZ三通道

同樣,可以對其中任意一張圖像做Blob分析等操作,也可采用:

xyz_to_object_model_3d (X, Y, Z, ObjectModel3D) 
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) 

生成3D模型并進行顯示。

CSV格式

CSV格式(Comma-Separated Values)直譯為逗號分隔值(也稱字符分隔值,因為分隔字符也可以不是逗號),是一種以逗號作為分隔符,對數據進行直接記錄的文件。
讀取csv文件生成3D模型一般需要分析csv文件的儲存格式。我們先創建一個csv文件。如下圖所示,直接創建txt文件,每一行保存一個點云坐標,不同坐標之間采用“,”作為分隔符,另存為csv文件即可。
在這里插入圖片描述

open_file ('data.csv', 'input', FileHandle) #打開文件
X :=[]
Y :=[]
Z :=[]
fread_line (FileHandle, OutLine, IsEOF)
while (IsEOF==0)tuple_split (OutLine, ',', Substrings)tuple_number (Substrings, Number)X :=[X,Number[0]]Y :=[Y,Number[1]]Z :=[Z,Number[2]] #讀取XYZfread_line (FileHandle, OutLine, IsEOF)
endwhile
gen_object_model_3d_from_points (X, Y, Z, ObjectModel3D) #生成3D模型
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut) #顯示結果

結果如下:
在這里插入圖片描述

ply格式

ply是Halcon可識別的3D模型儲存格式,可以直接打開。

read_object_model_3d ('data.ply', 'm', [], [], ObjectModel3D, Status)
visualize_object_model_3d (3600, ObjectModel3D, [], [], [], [], [], [], [], PoseOut)

結果如下:
在這里插入圖片描述

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

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

相關文章

FFMPEG解碼流程

1. 注冊所有容器格式和CODEC: av_register_all() 2. 打開文件: av_open_input_file() 3. 從文件中提取流信息: av_find_stream_info() 4. 窮舉所有的流,查找其中種類為CODEC_TYPE_VIDEO 5. 查找對應的解碼器: avcodec_find_decoder() 6. 打開編解碼器: avcodec_open…

linux用戶登錄指定目錄

一、創建用戶和用戶組 [rootweb4 lianyu]# groupadd lianyu [rootweb4 lianyu]# useradd lianyu -g lianyu [rootweb4 lianyu]# passwd lianyu二、用戶登錄指定目錄 [rootweb4 lianyu]# cd /home/lianyu [rootweb4 lianyu]# ls -a . .. .bash_history .bash_logout .bas…

轉載:說一下AI的前景吧

發信人: wdong (萬事休), 信區: Stock標 題: 說一下AI的前景吧這一波AI和前兩年的big data,根本就是兩回事。big data這一波,主要是用數據分析來支撐起各種現有系統的改進,包括銷售業績的提高和用戶體驗的提高等。AI當然也可以應用回這些領域…

藥片粘連物體的分割

藥片粘連物體的分割要求:圖片:處理程序:處理結果:要求: 將藥片分割,統計藥片數量。不能使用模板匹配。 圖片: 先看一下要處理的原圖: 處理程序: read_image (Image…

FFMPEG CODEC使用總結

分類: 視頻編解碼技術 2010-07-15 10:29 283人閱讀 評論(0) 收藏 舉報 ffmpeg里提供了很多的encoder,decoder,詳見avcodec.h里的枚舉變量CodecID。 宏定義 #define REGISTER_ENCODER(X,x) { / extern AVCodec x##_encoder; / …

java 鏈接mysql 產生500W數據模擬生成環境

java 插入數據到mysql 通過sqoop 導入到hive 中,kylin模擬見cube 時間和 數據膨脹率 kylin 數據插入到 HBase Kylin HBase 1.1.3 Hive 1.2.1 Hadoop 2.5.1 create table infoagetime( prod_name char(10), prod_id SMALLINT, ods_date DATE )數據格式 oPmgBZxldW …

中本聰研究所創始人對Core的發展方向感到厭惡

在本月,中本聰研究所(Satoshi Nakamoto Institute)的聯合創始人Daniel Krawisz離開了該研究所,原因是Daniel覺得SNI社區逐漸變得讓他無法忍受,甚至感到厭惡。Daniel發表在SNI上的大量文章被刪除,有關于比特…

BZOJ 1026 [SCOI2009]windy數

1026: [SCOI2009]windy數 Description windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。 windy想知道,在A和B之間,包括A和B,總共有多少個windy數? Input 包含兩個整數,A B。 Outp…

不連續區域的擬合

如下圖,需要把圖中4個半圓分別連接起來 我試過closing 和 dilation,下圖中后三個還可以連接起來, 但是第一個因為不連續地方較長,如果增大closing的值,會導致其它點 出現過度畸形。 有沒有能連接相鄰選區的方法&#…

X264碼率控制流程分析 (轉)

二、編碼器機能20鐘頭前  碼率節制的意見常識:   碼率節制的目的以及意義:   圖象通訊中碼率節制的目的:路程經過過程調治編碼參量,節制單元時間內的編碼視頻文件流的數值量,以使 ... 二、編碼器機能20鐘頭前碼率…

SPSS輸出的結果都要寫到文章中嗎

SPSS輸出的結果都要寫到文章中嗎 經常有人問到,SPSS輸出的結果都要寫到文章中嗎?文章中應該寫什么呢?比如,均值、中位數、眾數、標準差、百分位數、最小值、最大值等等,都要出現在文章中嗎?洋洋灑灑那么多&…

php Closure 類型

2019獨角獸企業重金招聘Python工程師標準>>> <?php /*** Closure 理解* 匿名函數&#xff08;Anonymous functions&#xff09;&#xff0c;* 也叫閉包函數&#xff08;closures&#xff09;* Closure 是匿名函數的php中的稱呼*/// 創建一個Closure$func funct…

ftk學習記(label篇)

【 聲明&#xff1a;版權全部&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】還是接著上面的一篇博文。之前以前答應過大家&#xff0c;讓大家看一下最簡單的ftk程序是怎么執行的。所以&#xff0c;這里我們上傳一下圖片。由于…

扇形特征點提取

處理要求 分別找出扇形左上角&#xff0c;左下角&#xff0c;右上角&#xff0c;右下角&#xff0c;最高點&#xff0c;下面弓形最高點 原圖 halcon 處理程序 read_image (Image14208259e49d7b1cf7c544, 544.bmp) rgb1_to_gray (Image14208259e49d7b1cf7c544, GrayImage) t…

集成顯卡與獨立顯卡的區別

集成的顯卡不帶有顯存&#xff0c;使用系統的一部分主內存作為顯存&#xff0c;顯卡的數量一般是根據需要自然動態調整。顯然&#xff0c;使用集成顯卡運行需要大量占用顯存的程序&#xff0c;對整個系統的影響比較明顯&#xff0c;此外系統內存的頻率通常比獨立的顯存度低很多…

[ CodeVS沖杯之路 ] P3116

不充錢&#xff0c;你怎么AC&#xff1f; 題目&#xff1a;http://codevs.cn/problem/3116/ 基礎的高精度加法&#xff0c;注意一下兩個數長短不一和答案第一位的處理即可&#xff0c;當然也可以用壓位的方法做 1 #include<cstdio>2 #include<cstdlib>3 #include&l…

郵槽

郵槽是基于廣播通信體系設計出來的&#xff0c;采用無連接的不可靠的數據傳輸&#xff1b;郵槽是一種一對一或一對多的單向通信機制&#xff0c;創建郵槽的服務器進程讀取數據&#xff0c;打開郵槽的客戶機進程寫入數據&#xff1b;為保證郵槽在各種Windows平臺下都能正常工作&…

Android Studio maven-metadata.xml 卡著不動原因和解決方法

頭一天好好的&#xff0c;第二天就卡著了。 一直在這個地方不動&#xff0c;如果停止就會報 Error:Could not run build action using Gradle distribution ‘https://services.gradle.org/distributions/gradle-4.1-all.zip‘. 所以直接就去看了下鏈接&#xff1a;https://dl.…

h.264 SODB RBSP EBSP的區別

SODB 數據比特串&#xff0d;&#xff0d;&#xff1e;最原始的編碼數據 RBSP 原始字節序列載荷&#xff0d;&#xff0d;&#xff1e;在SODB的后面填加了結尾比特&#xff08;RBSP trailing bits 一個bit“1”&#xff09;若干比特“0”,以便字節對齊。 EBSP 擴展字節序…

C# 控件置于最頂層、最底層、隱藏、顯示

控件置于最頂層、最底層 pictureBox1.BringToFront();//將控件放置所有控件最前端 pictureBox1.SendToBack();//將控件放置所有控件最底端 控件隱藏、顯示 pictureBox1.Visible true;//顯示 pictureBox1.Visible false;//隱藏