#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 Я ждал вашего ответа. Можете ли вы уточнить, что вы там имели в виду