Как найти угол, созданный изображением с фронтальным параллельным видом?

#python #opencv #image-processing #perspective

#python #opencv #обработка изображений #перспектива

Вопрос:

Я работаю над проблемой, чтобы исказить перспективу изображений, чтобы получить фронтальный параллельный вид. Непараллельная плоскость изображения поворачивается на угол альфа относительно оси x и на угол бета относительно оси y, предполагая, что оптическая ось камеры является осью z. Можем ли мы оценить альфа и бета? Если да, то как? Какой математической процедуре следует следовать, чтобы найти эти углы? Существуют ли какие-либо библиотечные функции для этого?

Заранее спасибо за любую помощь!

 import cv2
import numpy as np

circles = np.zeros((4,2),np.int)
counter = 0

def mousePoints(event,x,y,flags,params):
    global counter
    if event == cv2.EVENT_LBUTTONDOWN:

        circles[counter] = x,y
        counter = counter   1
        print(circles)

img = cv2.imread("DSC_0273.JPG")

img = cv2.resize(img,(1500,1000))
q = 0
while True:

    if counter == 4:
        q = q 1

        height1,width1 = 1080,1920
        pts1 = np.float32([circles[0],circles[1],circles[2],circles[3]])
        width = np.sqrt((circles[1][0] - circles[0][0])**2   (circles[1][1] - circles[0][1])**2)
        height =  np.sqrt((circles[2][1] - circles[0][1])**2   (circles[2][0] - circles[0][0])**2)
        width = int(np.round(width))
        height = int(np.round(height))
        x1,y1 = circles[0]
    
        pts2 = np.float32([[x1,y1],[(x1 width),y1],[(x1 width),(y1 height)],[x1,(y1 height)]])
        matrix = cv2.getPerspectiveTransform(pts1,pts2)

        if q == 1:
            print(matrix.shape)
            print(matrix)
        imgOutput = cv2.warpPerspective(img,matrix,(width1,height1))
        cv2.imshow("Output Image ", imgOutput)


for x in range (0,4):
    cv2.circle(img,(circles[x][0],circles[x][1]),3,(0,255,0),cv2.FILLED)

cv2.imshow("Original Image ", img)
cv2.setMouseCallback("Original Image ", mousePoints)
cv2.waitKey(1)
  

Комментарии:

1. Можете ли вы обнаружить четыре точки, образующие прямоугольник, выровненный по оси, на непараллельном виде?

2. @YvesDaoust Я добавил код, который я использую для искажения перспективы для вашей справки. У меня есть несколько изображений. Я запускаю этот код. Это позволяет мне щелкнуть по любым 4 точкам (в порядке, вверху слева, вверху справа, внизу справа, внизу слева). Затем мой код находит матрицу преобразования с помощью cv2.getPerspectiveTransform(). Я сам даю баллы. Я не знаю, как определить 4 точки на оси, выровненной с непараллельным видом.

3. Если вы можете нажимать только на точки в перспективе, все это бесполезно. Вам нужны пары соответствующих точек.

4. @YvesDaoust Я не совсем понял, что вы имели в виду. Я выбираю 4 точки на исходном изображении, чтобы область, заключенная в эти 4 точки, отображалась в прямоугольник. Первая точка, которую я даю, сопоставляется с тем же местоположением пикселя, что и на исходном изображении. Остальные 3 точки перемещаются так, что, наконец, 4 отображенные точки образуют прямоугольник. Матрица преобразования для этого найдена и применена ко всему изображению.

5. @YvesDaoust Я ждал вашего ответа. Можете ли вы уточнить, что вы там имели в виду