От калибровки камеры до сбора цветных кубиков роботизированной рукой - PullRequest
0 голосов
/ 03 мая 2019

Я хочу подбирать цветные кубики с помощью руки робота, которую я обнаруживаю с помощью камеры и OpenCV в Python. Мне удалось обнаружить разные цветные кубики, и я откалибровал камеру с помощью процесса шахматной доски.

Настройка:

Setup front Setup top

Обнаружение куба: Cubes detected

Проблема в том, что я не понимаю остальную часть процесса получения координат от объекта с помощью камеры и перевода их в руку робота для получения.

Были выполнены следующие шаги:

  1. Разделение цветовых границ с помощью HSV и рисование ограничительных рамок. Итак, у меня есть пиксель x, y объекта.

  2. Калибровка камеры, приводящая к следующей матрице камеры и коэффициентам искажения:

    Матрица камеры: [[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]]

  3. Попытка выяснить следующие шаги в документации OpenCV

Результат

Я прочитал документацию по API на этой странице: https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

Но с моим уровнем квалификации я не могу вывести те практические шаги, которые нужно предпринять, чтобы достичь своей цели.

Мои вопросы:

  1. Как использовать матрицу камеры и коэффициенты искажения для получения координат объекта в кадре изображения?
  2. Как преобразовать координаты на рамке изображения в координаты конечного эффектора робота?
  3. Если я держу камеру в фиксированном положении. Значит ли это, что мне нужно только выполнить калибровку?

******* редактировать: *******

Я пошел по другому пути. Мне удалось решить вращение и перемещение между двумя системами координат через 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)

1 Ответ

0 голосов
/ 03 мая 2019

до 1) у вас уже есть код, который рисует рамки вокруг обнаруженных объектов. Итак, у вас уже есть координаты в вашей матрице. Если бы не вы, вы могли бы сделать что-то подобное.

        for c in contours:
        if cv2.contourArea(c) < self.min_area:
            continue
        # detected
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

и чем x + w / 2 является вашим x в матрице

до 2) вы не можете напрямую, вам нужна точка ориентировки, чтобы рука будет знать, где (х + у расстояние) начинается ваша матрица в мире руки

до 3) калибровка всегда зависит от ваших условий освещения, верно? так что, пока они не меняются, ваша калибровка должна быть в порядке. Однако оказывается, что время от времени требуется калибровка, например, с USB-камерами

...