Я хочу подбирать цветные кубики с помощью руки робота, которую я обнаруживаю с помощью камеры и OpenCV в Python. Мне удалось обнаружить разные цветные кубики, и я откалибровал камеру с помощью процесса шахматной доски.
Настройка:
Обнаружение куба:
Проблема в том, что я не понимаю остальную часть процесса получения координат от объекта с помощью камеры и перевода их в руку робота для получения.
Были выполнены следующие шаги:
Разделение цветовых границ с помощью HSV и рисование ограничительных рамок. Итак, у меня есть пиксель x, y объекта.
Калибровка камеры, приводящая к следующей матрице камеры и коэффициентам искажения:
Матрица камеры: [[1.42715609e + 03 0.00000000e + 00 9.13700651e + 02] [0.00000000e + 00 1.43275509e + 03 5.58917609e + 02] [0.00000000e + 00
0,00000000e + 00 1,00000000e + 00]]
Искажение: [[0.03924722 -0,30622971 0,00124042 -0,00303094 0,49458539]]
Попытка выяснить следующие шаги в документации OpenCV
Результат
Я прочитал документацию по API на этой странице: https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
Но с моим уровнем квалификации я не могу вывести те практические шаги, которые нужно предпринять, чтобы достичь своей цели.
Мои вопросы:
- Как использовать матрицу камеры и коэффициенты искажения для получения координат объекта в кадре изображения?
- Как преобразовать координаты на рамке изображения в координаты конечного эффектора робота?
- Если я держу камеру в фиксированном положении. Значит ли это, что мне нужно только выполнить калибровку?
******* редактировать: *******
Я пошел по другому пути. Мне удалось решить вращение и перемещение между двумя системами координат через SVD. Но я допустил ошибку, думая, что могу использовать пиксельные координаты для перевода из системы координат камеры в систему роботов. Я думаю, вам нужно сначала перевести значения u, v.
Как я могу перевести пиксель uv в мировые координаты, чтобы я мог использовать приведенный ниже код, чтобы получить перевод и вращение для манипулятора робота?
Вот мой код:
#######################################################################
# Step 1: Input camera and world coordinates, and calculate centroids #
#######################################################################
print("")
# Camera and robot to world coordinates
Pc = np.matrix([[604,119,0],[473,351,0], [730,329,0]])
print("Camera points matrix: ")
print(Pc)
print("")
Pr = np.matrix([[177,-38,0],[264,-93,0], [258,4.7,0]])
print("Robot points matrix: ")
print(Pr)
print("")
# Calculate centroids
Cc = Pc.mean(axis=0)
Cr = Pr.mean(axis=0)
print("Centroid camera: ")
print(Cc)
print("")
print("Centroid robot: ")
print(Cr)
print("")
# Pc and Pr - centroids of Pc and Pr
Pc_minus_Cc = np.subtract(Pc, Cc)
print("Pc - centroidC: ")
print(Pc_minus_Cc)
print("")
Pr_minus_Cr = np.subtract(Pr, Cr)
print("Pr - centroidR: ")
print(Pr_minus_Cr)
print("")
############################################################################
# Step 2: Calculate H, perform SVD and get rotation and translation matrix #
############################################################################
# Get H
print("(Pr - centroidR) transposed: ")
print(Pr_minus_Cr.T)
print("")
H = np.matmul(Pc_minus_Cc, Pr_minus_Cr.T)
print("H: ")
print(H)
print("")
# Perform SVD
u, s, v = np.linalg.svd(H)
print("SVD result: ")
print("u: ")
print("")
print(u)
print("")
print("s: ")
print(s)
print("")
print("v: ")
print(v)
print("")
# Calculate rotation matrix
R = np.matmul(v,u.T)
print("Rotation matrix: ")
print(R)
# Calculate t
t = -R * Cc.T + Cr.T
print("t: ")
print(t)