找出aruco标记的中心

时间:2018-11-24 17:07:20

标签: aruco

我已经完成了标记的姿态估计,并获得了rvec和tvec值。我不知道如何找到它的中心,因为我需要绘制一个需要中心值的圆柱体。

我该怎么办?

5 个答案:

答案 0 :(得分:0)

如果正确进行了校准,则tvec值将分别为xyz轴上的距离。例如,如果您正确地进行了校准并且以米为单位进行校准,则将获得以米为单位的距离。要进行进一步的讨论,请在程序中上传带有标记和电视图像的示例。

答案 1 :(得分:0)

希望这会有所帮助。 从here下载图像进行校准。

https

答案 2 :(得分:0)

OpenCV函数EstimatePoseSingleMarkers()

https://docs.opencv.org/master/d9/d6a/group__aruco.html#ga84dd2e88f3e8c3255eb78e0f79571bd1

这将返回rvecs,tvecs,_objPoints。 tvecs是中心点所在的位置,X,Y,Z坐标与您在对相机矩阵进行校准时所使用的测量单位相同。

确保校准正确完成。

如果要中心像素而不是世界坐标,则不需要rvec或tvec。我认为这是希望您将图像放入Feed中。

使用函数cv2.aruco.detectMarkers()给出的锥角

角,id,拒绝= aruco.detectMarkers(图像=灰色,字典= aruco_dic,参数=参数)

然后为每个标签

_centerY = int((_corner[0][1] + _corner[2][1]) / 2)
_centerX = int((_corner[0][0] + _corner[2][0]) / 2)

希望这会有所帮助

答案 3 :(得分:0)

您可以使用:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_4X4_250)
parameters = cv2.aruco.DetectorParameters_create()
markerCorners, markerIds, rejectedCandidates = cv2.aruco.detectMarkers(gray, dictionary, parameters=parameters)
for corner in markerCorners:
    centerX = (corner[0][0][0] + corner[0][1][0] + corner[0][2][0] + corner[0][3][0]) / 4
    centerY = (corner[0][0][1] + corner[0][1][1] + corner[0][2][1] + corner[0][3][1]) / 4
    center = (int(centerX), int(centerY))

答案 4 :(得分:0)

标记的tvec是标记从原点开始的平移(x,y,z);距离单位是用来定义打印的校准图的单位(即,如果您使用mm将校准图描述为OpenCV,则tvecs中的距离单位为mm)。

标记的rvec是3D旋转矢量,它定义了旋转轴和绕该轴的旋转角度,并给出了标记的方向。

您可以使用tvec获取标记位置

x = '{:.2f}'.format(tvec[0])
y = '{:.2f}'.format(tvec[1])
z = '{:.2f}'.format(tvec[2])

您可以使用 aruco.detectMarkers

返回的计算标记的中心像素。
corners, ids, rejected = cv2.aruco.detectMarkers(image=gray_img,dictionary=aruco_dict,parameters=parameters)

x_sum = corners[0][0][0][0]+ corners[0][0][1][0]+ corners[0][0][2][0]+ corners[0][0][3][0]
y_sum = corners[0][0][0][1]+ corners[0][0][1][1]+ corners[0][0][2][1]+ corners[0][0][3][1]
    
x_centerPixel = x_sum*.25
y_centerPixel = y_sum*.25