Каналы OpenCV при попытке проецировать точку на изображение на плоскость 2d - PullRequest
4 голосов
/ 07 мая 2019

Я сейчас пытаюсь спроецировать черную точку на следующем изображении: enter image description here

Для 2D плоскости на следующем изображении: enter image description here

Для "pts_dst" я использую следующие координаты: enter image description here

С точками для фотографии поля, взятой из того же места.

Мой код выглядит следующим образом:

import cv2
import numpy as np

if __name__ == '__main__':
    # Read source image.
    im_src = cv2.imread('field2.png')
    # Four corners of the book in source image
    pts_src = np.array([[436, 181], [319, 181], [539, 314], [180, 312]])

    # Read destination image.
    im_dst = cv2.imread('field1.png')
    # Four corners of the book in destination image.
    pts_dst = np.array([[297, 233], [297, 139], [55, 234], [54, 139]])

    # Calculate Homography
    h, status = cv2.findHomography(pts_src, pts_dst)

    # provide a point you wish to map from image 1 to image 2
    a = np.array([[493, 274]], dtype='float32')
    a = np.array([a])

    pointsOut = cv2.perspectiveTransform(a, h)

    # Display image
    cv2.imshow("Warped Source Image", pointsOut)

    cv2.waitKey(0)

Но я сталкиваюсь со следующей ошибкой:

cv2.imshow ("Искаженное исходное изображение", pointsOut)

cv2.error: OpenCV (3.4.2) /io/opencv/modules/imgcodecs/src/utils.cpp:622: ошибка: (-15: неверный номер каналов) Исходное изображение должно иметь 1, 3 или 4 канала в функции 'CvConvertImage'

По какой-то причине мне было очень трудно решить эту проблему - вероятно, поскольку я новичок в OpenCV - но я не могу решить ее.

Похоже, это относится к

pointsOut = cv2.perspectiveTransform(a, h)

Я нашел этот ответ на похожий вопрос, но он не решает мою проблему, поскольку у меня уже есть его с плавающей запятой.

Есть ли у кого-нибудь какие-либо предложения относительно того, что я делаю неправильно, или как лучше подходить к решению этой проблемы, если я не могу сделать это с perspectiveTransform()?

РЕДАКТИРОВАТЬ: я нашел это решение , но когда я добавляю дополнительные скобки, он выдает новую ошибку.

pointsOut = cv2.perspectiveTransform (a, h) cv2.error: OpenCV (3.4.2) /io/opencv/modules/core/src/matmul.cpp:2268: ошибка: (-215: утверждение не удалось) scn + 1 == m.cols в функции'pectiveTransform '

Я также пытался преобразовать оба изображения в оттенки серого перед обработкой, но все еще получал ошибку канала.

1 Ответ

1 голос
/ 07 мая 2019

cv2.perspectiveTransform - это функция, которая возвращает точку, а не изображение.Вы должны построить точки, которые возвращаются им.Примером может быть:

pointsOut = cv2.perspectiveTransform(a, H)
cv2.polylines(im_src, [np.int32(pointsOut)], True, (0, 255, 0), 5)

Сказав это, мой подход заключается в том, чтобы сначала получить преобразование перспективы, а затем обернуть его вокруг изображения.Нечто похожее на этот фрагмент,

M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))

, где maxWidth и maxHeight относятся к исходному изображению.

Подробнее см. Здесь, https://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...