?Python-opencv 手眼標(biāo)定(九點(diǎn)定位)
前言
本文主要解決相機(jī)像素坐標(biāo)轉(zhuǎn)換機(jī)械臂坐標(biāo)的問(wèn)題,用到的opencv版本為4.5.5.64
一、手眼定位原理?
以下可以參考
基于OpenCv的機(jī)器人手眼標(biāo)定(九點(diǎn)標(biāo)定法)
二、怎么實(shí)現(xiàn)
1.獲得像素坐標(biāo)和機(jī)械坐標(biāo)集
主要思路就是將九點(diǎn)標(biāo)定圖放在機(jī)械臂獲取范圍內(nèi),得到九個(gè)圓心坐標(biāo)(像素坐標(biāo)和機(jī)械臂移動(dòng)到圓心的坐標(biāo))
像素坐標(biāo)的獲取可以參考以下文章:
python opencv鼠標(biāo)點(diǎn)擊圖像顯示坐標(biāo)值
機(jī)械坐標(biāo)請(qǐng)自行解決
?
2.取得坐標(biāo)系轉(zhuǎn)換的仿射矩陣
全部代碼如下:
import numpy as np
import cv2
# 通過(guò)九點(diǎn)標(biāo)定獲取的圓心相機(jī)坐標(biāo)
STC_points_camera = np.array([
[207, 160],
[311, 159],
[415, 159],
[206, 256],
[311, 257],
[416, 258],
[205, 353],
[311, 356],
[416, 357],
])
# 通過(guò)九點(diǎn)標(biāo)定獲取的圓心機(jī)械臂坐標(biāo)
STC_points_robot = np.array([
[54, -74],
[-4, -76],
[-54, -77],
[52, -32],
[-4, -34],
[-55, -35],
[50, 11],
[-4, 10],
[-54, 8],
])
# 手眼標(biāo)定方法
class HandInEyeCalibration:
def get_m(self, points_camera, points_robot):
"""
取得相機(jī)坐標(biāo)轉(zhuǎn)換到機(jī)器坐標(biāo)的仿射矩陣
:param points_camera:
:param points_robot:
:return:
"""
# 確保兩個(gè)點(diǎn)集的數(shù)量級(jí)不要差距過(guò)大,否則會(huì)輸出None
m, _ = cv2.estimateAffine2D(points_camera, points_robot)
return m
def get_points_robot(self, x_camera, y_camera):
"""
相機(jī)坐標(biāo)通過(guò)仿射矩陣變換取得機(jī)器坐標(biāo)
:param x_camera:
:param y_camera:
:return:
"""
m = self.get_m(STC_points_camera, STC_points_robot)
robot_x = (m[0][0] * x_camera) + (m[0][1] * y_camera) + m[0][2]
robot_y = (m[1][0] * x_camera) + (m[1][1] * y_camera) + m[1][2]
return robot_x, robot_y
主要用到了opencv的estimateAffine2D函數(shù),獲得仿射變換矩陣
之后就可以用指定的像素坐標(biāo)進(jìn)行轉(zhuǎn)換了,計(jì)算公式如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-487168.html
robot_x = (A * x_camera) + (B * y_camera) + C robot_y = (D * x_camera) + (E * y_camera) + F
總結(jié)
以上就是今天要講的內(nèi)容,共同學(xué)習(xí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-487168.html
到了這里,關(guān)于Python-opencv 手眼標(biāo)定(九點(diǎn)定位)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!