小物体位姿估计

本文介绍了如何使用Zebrapose和YOLO进行物体检测,从摄像头捕获的图像中获取目标(如齿轮)并进行姿态估计。通过计算和绘制目标在图像中的关键点,实现了对三维模型的可视化。
摘要由CSDN通过智能技术生成

使用zebrapose

推理代码:

from zebrapose import zebra
from yolo import yolo
import cv2
import numpy as np
import pyrealsense2 as rs
import time
import json
import time
obj_dict = {
    'in':(143, 54)#(model id, yolo id)
    }

#symmetry_obj = ['gear']
symmetry_obj = [' ']
###
obj_name = 'in'

#K = [616.58,0,323.103, 0,616.778,238.464, 0.0, 0.0, 1.0]
K = [924.871,0,644.655, 0,925.167,357.695, 0.0, 0.0, 1.0]
###

def prj_marker2img(point,R,T,K):
    point_cam = np.matmul(R, point) + T
    point_pix = np.matmul(K, point_cam)
    point_pix = point_pix/point_pix[2]
    return point_pix[:2].astype(int)

def load_dims(model_id):
    with open('./assets/models_info.json', 'r') as f:
        model_info = json.load(f)

    info = model_info[str(model_id)]
    dims = [info['size_x'], info['size_y'], info['size_z']]
    return dims

def get_bbox_masks_from_yolo(results, target_id):
    bboxes = []
    masks = []
    for result in results:
        if result[0].item() == target_id:
            bboxes.append(result[1])
            masks.append(result[2])
    return bboxes, masks

if obj_name in symmetry_obj:
    symmetry = True
    point_list = []
    num_point = 12
    for i in range(num_point):
        x = np.cos(i*2*np.pi/num_point)
        y = np.sin(i*2*np.pi/num_point)
        point_list.append((x,y))
else:
    symmetry = False
    
dims = load_dims(obj_dict[obj_name][0])
zebra = zebra(obj_name, obj_dict[obj_name][0], K, 17)
yolo = yolo()
target_yolo_id = obj_dict[obj_name][1]

#color_image = cv2.imread('/home/fuzhao/poseEstimate/zebraPose_inference_gear2/data/rgb5/1702881914.jpg')
color_image = cv2.imread('/home/fuzhao/poseEstimate/zebraPose_inference_gear2/data/rgb5/32.jpg')

t0 = time.time()
yolo_results = yolo.predict(color_image, conf=0.5)

bboxes, masks = get_bbox_masks_from_yolo(yolo_results, target_yolo_id)
print("bboxes.shape",len(bboxes))
#bboxes, masks = bboxes[40:], masks[40:]
#bboxes, masks =[bboxes[1]], [masks[1]]

##for i in range(len(bboxes0)):
##    center_x, center_y, w, h = bboxes0[i]
##    if center_x > 188 and center_x < 215 and center_y >330 and center_y < 360:
##        bboxes = [bboxes0[i]]
##        masks = [masks0[i]]
##        break

##bbox = [(188.0+215.0)/2,(330.0+360.0)/2,27.0,30.0]
##fake_mask = cv2.imread('./images/masks/000019_000019.png',0)
##fake_mask = fake_mask.astype(np.float32)/255.0
##bboxes, masks = [bbox], [fake_mask]

#cv2.imwrite('yolo_mask.jpg', (masks[0]*255).astype(np.uint8))
##for bbox in bboxes:
##    bbox = bbox.astype(int)
##    x,y,w,h = bbox
##    cv2.rectangle(color_image, (int(x-w/2), int(y-h/2)), (int(x+w/2), int(y+h/2)),(255,0,0),1)
##cv2.imshow('roi', color_image)
##cv2.waitKey(0)


r_list, t_list = zebra.predict(color_image, bboxes, masks, debug=True)

print("total infer time:",time.time() - t0 )
print("len(r_list):",len(r_list))
for i in range(len(r_list)):
    r_predict = r_list[i]
    t_predict = t_list[i]
    
    rot_mat = r_predict
    point_center = t_predict[:,0]
    K = zebra.cam_K

    if symmetry:
        upper_circle_point = []
        lower_circle_point = []
        radius = max(dims[0], dims[1])/2.0
        for point in point_list:
            point_object = np.array([point[0]*radius, point[1]*radius, dims[2]/2.0])
            point_img = prj_marker2img(point_object, rot_mat, point_center, K)
            upper_circle_point.append(point_img)

        for point in point_list:
            point_object = np.array([point[0]*radius, point[1]*radius, -dims[2]/2.0])
            point_img = prj_marker2img(point_object, rot_mat, point_center, K)
            lower_circle_point.append(point_img)              

        for i in range(num_point):
            cv2.line(color_image, upper_circle_point[i-1], upper_circle_point[i], (255,0,0),1)
            cv2.line(color_image, lower_circle_point[i-1], lower_circle_point[i], (0,255,0),1)
            #cv2.line(color_image, upper_circle_point[i], lower_circle_point[i], (0,0,255),1)
        
    else:
        point_object = np.array([dims[0]/2, dims[1]/2, dims[2]/2])
        point_img1 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([-dims[0]/2, dims[1]/2, dims[2]/2])
        point_img2 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([dims[0]/2, -dims[1]/2, dims[2]/2])
        point_img3 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([-dims[0]/2, -dims[1]/2, dims[2]/2])
        point_img4 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([dims[0]/2, dims[1]/2, -dims[2]/2])
        point_img5 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([-dims[0]/2, dims[1]/2, -dims[2]/2])
        point_img6 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([dims[0]/2, -dims[1]/2, -dims[2]/2])
        point_img7 = prj_marker2img(point_object,rot_mat,point_center,K)

        point_object = np.array([-dims[0]/2, -dims[1]/2, -dims[2]/2])
        point_img8 = prj_marker2img(point_object,rot_mat,point_center,K)  
        
        cv2.line(color_image, point_img5, point_img6, (255,0,0),1)
        cv2.line(color_image, point_img6, point_img8, (255,0,0),1)
        cv2.line(color_image, point_img8, point_img7, (255,0,0),1)
        cv2.line(color_image, point_img5, point_img7, (255,0,0),1)

        cv2.line(color_image, point_img1, point_img5, (0,255,0),1)
        cv2.line(color_image, point_img2, point_img6, (0,255,0),1)
        cv2.line(color_image, point_img3, point_img7, (0,255,255),1)
        cv2.line(color_image, point_img4, point_img8, (0,255,255),1)
        
        cv2.line(color_image, point_img1, point_img2, (0,0,255),1)
        cv2.line(color_image, point_img2, point_img4, (0,0,255),1)
        cv2.line(color_image, point_img4, point_img3, (0,0,255),1)
        cv2.line(color_image, point_img1, point_img3, (0,0,255),1)

cv2.imshow('image', color_image)
cv2.waitKey(0)

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值