巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)

简介: 巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)

前言

在使用长广溪机器人画画时,由图像处理得到素描图,将素描图截断为若干段坐标簇,我需要将接受到的图像坐标系下的点簇转换为机器人坐标系下的点,即完成由图像坐标系到机器人坐标系之间的转换。


一、分析需求

图像坐标系的点是二维坐标点,我想转换为机器人坐标系下的三维点,因为绘画任务仅在同一平面执行,因此可以简化为二维坐标之间的转换。

二、使用方法

1.solvePnP()函数说明

官网对于solvePnP()函数的说明如下:

cv.solvePnP( objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]] ) -> retval, rvec, tvec

输入参数:

objectPoints为物体坐标系下物体的三维坐标,可以是N3的一通道向量,或者是1N/N*1的三通道向量,N是点的个数

imagePoints为对应的图像坐标系下的二维坐标,可以是N2的一通道向量,也可以是1N/N*1的二通道向量,N是点的个数

cameraMatrix为相机的内参矩阵

distCoeffs为相机的畸变系数

输出参数:

rvec为旋转向量

tvec为平移向量

输出的旋转向量和平移向量可将三维坐标系的物体点坐标转换到图像坐标系下的像素坐标。

2.solvePnP()使用示例

项目中坐标转换部分的代码如下:

import cv2.cv2 as cv
import numpy as np


class Trans():
    def __init__(self):
        self.image_points_3D = np.array([
            (0, 0, 0),
            (0, 512, 0),
            (512, 512, 0),
            (512, 0, 0)
        ], dtype="double")
        self.robot_points_2D = np.array([
           (0, 0),
            (0, 512),
            (512, 512),
            (512, 0)
        ], dtype="double")
        self.distortion_coeffs = np.zeros((4, 1))
        # 焦距设置为其他值也可以,这里只是借用求转换矩阵的功能,原理可进一步讨论
        self.focal_length = 1
        self.center = (256, 256)
        self.matrix_camera = np.array(
            [[self.focal_length, 0, self.center[0]],
             [0, self.focal_length, self.center[1]],
             [0, 0, 1]], dtype="double"
        )
        
        self.success, self.vector_rotation, self.vector_translation = cv.solvePnP(objectPoints=self.image_points_3D,
                                                                                  imagePoints=self.robot_points_2D,
                                                                                  cameraMatrix=self.matrix_camera,
                                                                                  distCoeffs=None, flags=0)
        # print(self.vector_rotation)
        # print(self.vector_translation)

    def transform(self, point, z):
        trans_point, _ = cv.projectPoints(point, self.vector_rotation, self.vector_translation, self.matrix_camera,
                                          None)
        z_ = [z, 0, 0, 0]
        trans_point = np.append(trans_point[0], z_)
        # trans_point=np.round(trans_point,3)
        return trans_point


# trans = Trans()
# point = trans.transform(np.array([256.0, 256.0, 0.0]), 1)
# print(point)


因为需求是将图像坐标系下的点坐标转换为机器人坐标系下的二维坐标,因此这里将图像坐标增加一个维度z,将其设置为0,整个过程并没有用到相机,因此将相机内参矩阵中焦距设置为1(实测将焦距设置为不为0的其他值也可以),畸变系数设置为全零向量。再使用projectPoints()函数(官网)即可将图像坐标系下的点坐标转换到机器人坐标系下的点坐标,发送给机器人即可完成绘图任务。


总结

这里借用了OpenCV的solvePnP函数的坐标转换功能完成相关任务,如有错误,望指正。

关于焦距的设定可以依据官网Perspective-n-Point (PnP) pose computation进一步讨论。

目录
相关文章
|
11天前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
27 4
|
21天前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
19天前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
48 1
|
21天前
|
计算机视觉
OpenCV滑动条(createTrackbar()函数)如何在多个维度进行同步调整?
这篇文章介绍了如何在OpenCV中使用`createTrackbar()`函数创建多个滑动条以同步调整图像的多个维度(如亮度和对比度),通过将不同滑动条的回调函数合并为一个,确保它们在同一图像基础上进行调整。
|
3月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
85 1
|
3月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
49 1
|
3月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
58 0
|
2月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
3月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
44 0
|
3月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
24 0