0
点赞
收藏
分享

微信扫一扫

Lnton羚通视频分析算法平台【OpenCV-Python】教程:Pose Estimation (姿态估计)

姿态估计通常包含两个主要步骤:

1.相机标定:相机标定是指确定相机的内外参数,也就是相机的光心、焦距、畸变系数以及相机的旋转和平移矩阵等参数。相机标定可以使用棋盘格法、靶标法等方法进行。

2.位姿估计:位姿估计是指确定物体在三维空间中的位姿信息,即物体在世界坐标系下的位置和方向。位姿估计可以通过特征匹配、结构光或深度传感器等技术实现。

3.在姿态估计中,需要根据具体问题选择合适的算法和模型。常用的姿态估计方法包括:

4.特征点法:该方法通过在图像中提取关键点,然后利用匹配算法找到三维场景中对应的点,从而解决姿态估计问题。例如,利用SIFT、SURF等算法提取特征点,然后使用RANSAC等算法进行位姿估计。

5.深度学习法:利用深度学习技术进行姿态估计也是一种有效的方法。可以使用卷积神经网络(CNN)或循环神经网络(RNN)等模型进行训练,并使用已知的数据集进行测试。例如,使用深度学习模型进行人体姿态估计、机器人姿态估计等问题。

6.直接法:直接法不需要提取特征点,而是通过直接匹配图像的像素点来实现姿态估计。该方法的优势在于可以处理没有明显特征点的场景或者具有复杂几何形状的物体。

import numpy as np 
import cv2 
import glob

# 加载之前保存的参数
with np.load('left.npz') as X:
    mtx, dist, _, __ = [X[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')]
    # mtx, dist, rvecs, tvecs = [X[i] for i in ('mtx', 'dist', 'rvecs', 'tvecs')]


# 画 3D 坐标轴
def draw_line(img, corners, imgpts):
    corner = tuple(corners[0].ravel())
    ## 注意,此处的数据一定要转化成 int32 格式,否则 OpenCV 报错
    img = cv2.line(img, np.int32(corner), np.int32(tuple(imgpts[0].ravel())), (255, 0, 0), 5)
    img = cv2.line(img, np.int32(corner), np.int32(tuple(imgpts[1].ravel())), (0, 255, 0), 5)
    img = cv2.line(img, np.int32(corner), np.int32(tuple(imgpts[2].ravel())), (0, 0, 255), 5)
    return img

# 画 3D 立方体
def draw_cube(img, corners, imgpts):
    imgpts = np.int32(imgpts).reshape(-1,2)
    print(imgpts)
    # 绿色画棋盘面
    img = cv2.drawContours(img, [imgpts[:4]],-1,(0,255,0),-3)
  
    # 蓝色画柱子
    for i,j in zip(range(4),range(4,8)):
        img = cv2.line(img, tuple(imgpts[i]), tuple(imgpts[j]),(255),3)
  
    # 红色画顶
    img = cv2.drawContours(img, [imgpts[4:]],-1,(0,0,255),3)
    return img


criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
objp = np.zeros((6*7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2)

axis = np.float32([[3, 0, 0], [0, 3, 0], [0, 0, -3]]).reshape(-1, 3)

axis_cube = np.float32([[0, 0, 0], [0, 3, 0], [3, 3, 0], [3, 0, 0],
                            [0, 0, -3], [0, 3, -3], [3, 3, -3], [3, 0, -3]])

for fname in glob.glob('assets/left/left*.jpg'):
    img = cv2.imread(fname)
    img_cube = cv2.imread(fname)
  
    print(fname)
  
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, (7, 6), None)
    if ret == True:
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
  
        # 找到旋转和平移向量
        ret, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist)
  
        # 将3D点映射到平面上
        imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist)
        img = draw_line(img, corners2, imgpts)
  
        # cube point
        imgpts_cube, jac_cube = cv2.projectPoints(axis_cube, rvecs, tvecs, mtx, dist)  
        img_cube = draw_cube(img_cube, corners, imgpts_cube)
  
        cv2.imshow('img', img)  
        cv2.imshow('img_cube', img_cube)
        k = cv2.waitKey(0) & 0xFF
        if k == ord('s'):
            cv2.imwrite(fname[:-4]+'_result.jpg', img)
cv2.destroyAllWindows()

姿态估计在许多领域都有广泛应用,如机器人导航、虚拟现实、增强现实、自动驾驶等。了解姿态估计的原理和相关算法,可以帮助我们更好地理解和应用计算机视觉中的姿态估计技术。

Lnton 羚通专注于音视频算法、算力、云平台的高科技人工智能, 基于视频分析技术、视频智能传输技术、远程监测技术以及智能语音融合技术等, 拥有多款可支持 ONVIF、RTSP、GB/T28181 等多协议、多路数的音视频智能分析服务器。

Lnton羚通视频分析算法平台【OpenCV-Python】教程:Pose Estimation (姿态估计)_深度学习

举报

相关推荐

0 条评论