Ubutntu下使用realsense d435i(三):使用yolo v5测量目标物中心点三维坐标
01 參考
本文下述使用參考的的工程均來自于下面的兩個(gè)github
- yolo v5參考的代碼:https://github.com/ultralytics/yolov5
- 本文參考的代碼(僅獲得深度):https://github.com/killnice/yolov5-D435i
- 上一個(gè)github代碼,csdn上的講解:realsense D455深度相機(jī)+YOLO V5結(jié)合實(shí)現(xiàn)目標(biāo)檢測(cè)(一)
我的文件是在yolov5-D435i工程基礎(chǔ)上改的,yolov5-D435i是在yolov5工程基礎(chǔ)上改的。
02 分析
-
關(guān)于yolo部分
https://github.com/ultralytics/yolov5 這是一個(gè)比較經(jīng)典的yolo v5的代碼,它提供了一些接口,在README.md中進(jìn)行了介紹。
import torch # Model model = torch.hub.load('ultralytics/yolov5', 'yolov5s') # or yolov5m, yolov5l, yolov5x, custom# Images img = 'https://ultralytics.com/images/zidane.jpg' # or file, Path, PIL, OpenCV, numpy, list# Inference results = model(img)# Results results.print() # or .show(), .save(), .crop(), .pandas(), etc.
可以看到只要在自己寫的文件里創(chuàng)建model就可以調(diào)用這個(gè)結(jié)果了。
-
關(guān)于獲取三維坐標(biāo)的部分
? https://github.com/killnice/yolov5-D435i里main_debug.py文件的深度獲取方法
—— 是在中心點(diǎn)附近取一些隨機(jī)點(diǎn),然后深度排序取中值濾波。(這些被隨機(jī)選擇到的中心點(diǎn),在圖中畫了藍(lán)色小圓圈標(biāo)記這些點(diǎn))
猜測(cè)這樣做是可以避免realsense獲取深度過程中,某點(diǎn)的忽然轉(zhuǎn)換失效,認(rèn)為深度值為0,如果取周圍幾個(gè)點(diǎn)進(jìn)行獲取深度,并中值濾波,將大大提高這個(gè)深度值在測(cè)量過程中的穩(wěn)定性,避免了realsense忽然某幀某點(diǎn)的深度值為0的情況。? 我要獲得中心點(diǎn)的坐標(biāo),可以參考Ubutntu下使用realsense d435i(二):獲取某二維像素點(diǎn)的三維坐標(biāo)
—— 修改get_mid_pos()函數(shù),根據(jù)中心點(diǎn)的坐標(biāo)以及中心點(diǎn)對(duì)應(yīng)的深度獲取中心點(diǎn)的三維坐標(biāo)。
但是這樣做也面臨一個(gè)問題,就是上面提到的,僅僅測(cè)量中心點(diǎn)的深度,當(dāng)忽然這個(gè)深度值為0,他的三維坐標(biāo)轉(zhuǎn)換就會(huì)出錯(cuò),如果把這個(gè)值設(shè)為機(jī)械臂的目標(biāo)點(diǎn),就會(huì)導(dǎo)致機(jī)械臂一瞬間點(diǎn)的位置出錯(cuò)。
把realsense相機(jī)畫面的頻率降低會(huì)對(duì)這個(gè)現(xiàn)象改善一點(diǎn),但還是存在,所以考慮可以參考上述深度值得解決辦法,也獲取周圍點(diǎn),做一個(gè)中值濾波。
另外就是考慮相機(jī)還沒有標(biāo)定,參考realsense d435相機(jī)標(biāo)定,現(xiàn)在確實(shí)照墻壁時(shí)深度圖像有很多“黑洞”,這有可能也是忽然深度值為0的原因。? 未來要修改的地方
—— ① 把【像素x,像素y,深度值z(mì)】進(jìn)行一個(gè)數(shù)據(jù)結(jié)構(gòu)的保存(是選擇元祖、數(shù)組還是什么結(jié)構(gòu)還沒有想好)
② 利用隨機(jī)數(shù)獲取周邊的一些點(diǎn),同樣獲得這些點(diǎn)的【像素x,像素y,深度值z(mì)】
③ 把所有點(diǎn)根據(jù)深度值z(mì)進(jìn)行排序和中值濾波,選擇排序中間的那一個(gè)點(diǎn),根據(jù)深度值以及與其對(duì)應(yīng)的像素x,y,獲得該點(diǎn)的三維坐標(biāo),并以此為目標(biāo)物的三維坐標(biāo)。
-
關(guān)于文件結(jié)構(gòu)部分
由于yolo的測(cè)試程序以及對(duì)外開放了接口,所以我們只需要在原來的YOLO v5中(https://github.com/ultralytics/yolov5),再創(chuàng)建一個(gè)my_realsense_detect.py程序(不需要替換原來的detect.py程序),就可以了。
也就是說,把my_realsense_detect.py程序放到最開始提到的2個(gè)github程序中都可以運(yùn)行。如果想放到其他的yolo程序,需要看看他具體提到的模型接口,結(jié)果接口都是什么。
03 代碼
首先我下載了https://github.com/killnice/yolov5-D435i。
我的文件是在yolov5-D435i工程基礎(chǔ)上改的,yolov5-D435i是在yolov5工程基礎(chǔ)上改的。
git clone https://github.com/killnice/yolov5-D435i.git realsense435_yolocd realsense435_yoloopen_anacondatorchpip install -r requirements.txtpip install pyrealsense2python main_debug.py然后是在main_debug.py文件的基礎(chǔ)上進(jìn)行了修改,并把它重命名為了my_realsense_detect.py
說明:
?
在yolov5-D435i工程中的main.py、main_debug.py和try.py都是可以刪除的,只要運(yùn)行my_realsense_detect.py就可以
?
在yolov5工程中,只要把my_realsense_detect.py文件復(fù)制進(jìn)去就也可以運(yùn)行啦
接下來是我的代碼,只放上了核心部分,具體可以根據(jù)yolov5-D435i工程中的main_debug.py文件進(jìn)行修改。
def get_mid_pos(aligned_depth_frame,box):mid_pixel = [(box[0] + box[2])//2, (box[1] + box[3])//2] #確定索引深度的中心像素位置# 注意mid_pixel是float,但是get_distance()的參數(shù)需要是int[x, y] = [int(mid_pixel[0]), int(mid_pixel[1])]depth_intrin = aligned_depth_frame.profile.as_video_stream_profile().intrinsics # 獲取相機(jī)深度參數(shù)dis = aligned_depth_frame.get_distance(x, y) # 獲取該像素點(diǎn)對(duì)應(yīng)的深度# print ('depth: ',dis) # 深度單位是mcamera_coordinate = rs.rs2_deproject_pixel_to_point(depth_intrin, [x, y], dis)# print ('camera_coordinate: ',camera_coordinate)return camera_coordinatedef dectshow(org_img, boxs,aligned_depth_frame):img = org_img.copy()for box in boxs:cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0, 255, 0), 2)point_3d = dist = get_mid_pos(aligned_depth_frame,box)[x, y, z] = point_3d# cv.putText 圖片,添加的文字,左上角坐標(biāo),字體,字體大小,顏色,字體粗細(xì)cv2.putText(img, box[-1] + ' (' + str(x)[:4] + ',' + str(y)[:4] + ',' + str(z)[:4] + ')',(int(box[0]), int(box[1])), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 1)cv2.imshow('dect_img', img)這個(gè)程序需要說明的是像素坐標(biāo)的中點(diǎn)是float形式,而get_distance(x, y)函數(shù)的參數(shù)是int形式,需要進(jìn)行強(qiáng)制轉(zhuǎn)換。
04 待解決的問題
- 中值濾波或標(biāo)定等
總結(jié)
以上是生活随笔為你收集整理的Ubutntu下使用realsense d435i(三):使用yolo v5测量目标物中心点三维坐标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue中登录验证成功后保存token,并
- 下一篇: 浅析互联网产品分类