计算机视觉识别目标旋转角速率和角度大小问题

A、B两汽车在颠簸不平的道路上飞速行驶,A车在前,B车在后,B车安装有一摄像头,跟踪A车,B车通过视频图像如何识别出前方A车的三轴旋转角速率?

先选一个物体跟踪算法,后续定位车的视频帧的位置
在每个视频帧中,使用物体跟踪算法来更新目标物体的位置
在物体跟踪的基础上,使用计算机视觉库中的姿态估计算法(计算物体的旋转矩阵)
姿态估计得到的物体的旋转角度信息,通过在连续帧之间进行时间差分来计算出物体在各个轴向上的角度变化
通过将角度变化除以时间差,最后得到物体在各个轴向上的角速率
(物体跟踪+姿态估计+时间差分计算)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7794933
  • 以下回答由chatgpt基于相关博客总结生成:

    我将为你提供一种解决方案。在计算机视觉中,我们可以通过跟踪关键点的方式来识别物体的运动。以下是一个大致的解决步骤:

    1. 导入所需的库和模块:首先,你需要导入计算机视觉库OpenCV以及其他必要的库和模块。例如:
    import cv2
    import numpy as np
    
    1. 读取视频:使用OpenCV的VideoCapture类来读取视频文件或摄像头的视频流。例如:
    cap = cv2.VideoCapture('video.mp4')
    

    这里假设你已经有一个名为video.mp4的视频文件。

    1. 提取关键点:对于每一帧的图像,我们需要提取关键点来跟踪A车的位置。可以使用OpenCV中的特征检测器,例如SIFT或ORB。例如:
    def find_keypoints(image):
        # 使用ORB进行关键点检测
        orb = cv2.ORB_create()
        keypoints, descriptors = orb.detectAndCompute(image, None)
        return keypoints
    
    # 对于每一帧图像,提取关键点
    while True:
        ret, frame = cap.read()
        if not ret:
            break
    
        keypoints = find_keypoints(frame)
        # 在图像上绘制关键点
        output_image = cv2.drawKeypoints(frame, keypoints, None, color=(0, 255, 0), flags=0)
        cv2.imshow('KeyPoints', output_image)
    
    1. 匹配关键点:在后续帧的图像中,我们需要将前一帧的关键点与当前帧的关键点进行匹配。可以使用OpenCV中的描述子匹配算法,如FLANN或BFMatcher。例如:
    def match_keypoints(keypoints1, descriptors1, keypoints2, descriptors2):
        # 使用FLANN进行描述子匹配
        FLANN_INDEX_KDTREE = 0
        index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
        search_params = dict(checks=50)
        flann = cv2.FlannBasedMatcher(index_params, search_params)
        matches = flann.knnMatch(descriptors1, descriptors2, k=2)
        return matches
    
    # 对于每一帧图像,进行关键点匹配
    prev_keypoints = None
    prev_descriptors = None
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
    
        keypoints = find_keypoints(frame)
        descriptors = compute_descriptors(frame, keypoints)
    
        if prev_keypoints is not None and prev_descriptors is not None:
            matches = match_keypoints(prev_keypoints, prev_descriptors, keypoints, descriptors)
            # 过滤不好的匹配
            good_matches = [m for m, n in matches if m.distance < 0.7 * n.distance]
            # 计算3D运动
            motion = compute_motion(good_matches)
            # 输出三轴旋转角速率
            print('Roll:', motion.roll)
            print('Pitch:', motion.pitch)
            print('Yaw:', motion.yaw)
    
        prev_keypoints = keypoints
        prev_descriptors = descriptors
    
    1. 计算3D运动:使用匹配到的关键点,我们可以计算出A车的三轴旋转角速率。一个常用的方法是通过RANSAC算法估计本质矩阵或基础矩阵,然后通过分解矩阵来提取旋转矩阵以及旋转角速率。例如:
    def compute_motion(matches):
        # 提取匹配的关键点对
        src_points = np.float32([prev_keypoints[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
        dst_points = np.float32([keypoints[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
    
        # 使用RANSAC估计本质矩阵或基础矩阵
        E, mask = cv2.findEssentialMat(src_points, dst_points, camera_matrix)
    
        # 分解本质矩阵,提取旋转和平移矩阵
        _, R, t, _ = cv2.recoverPose(E, src_points, dst_points)
    
        # 通过旋转矩阵计算旋转角速率
        rvec, _ = cv2.Rodrigues(R)
        motion = compute_rotation_rate(rvec)
    
        return motion
    
    1. 显示结果:根据需要,你可以将结果显示在图像上或保存到文件中。例如:
    # 在图像上绘制结果
    output_image = cv2.putText(output_image, f"Roll: {motion.roll}", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    output_image = cv2.putText(output_image, f"Pitch: {motion.pitch}", (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    output_image = cv2.putText(output_image, f"Yaw: {motion.yaw}", (50, 150), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    cv2.imshow('Result', output_image)
    

    这只是一个大致的解决方案,具体的实现细节和参数需要根据实际情况进行调整。希望这可以帮助到你,如果有任何问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

三轴?你这A车还会旋风冲锋龙卷风不成?
另外,我觉得不现实,比较你B车也会跟着颠簸,除非你有传感器实时记录b车的状态,在根据B车状态推理A车,那你还不如直接将传感器装A车上来的好。另外还有一点,单独一个视角,想同时比较A车XYZ轴状态也不现实,更不用说B车颠簸带来的视觉偏差。
我感觉你这个还不如在A车上面装个陀螺仪芯片记录各个方向的信息来的合适,单靠图片目前阶段不可能的,除非是无人机水平拍摄A车的3D图像还有点可能性,但是这样还不如陀螺仪来的精准。