Приклад використання
M=np.array([[ 0.9, 0.1, -65],
[ 0.5, 1.12, -55],
[0.0002, 0.0005, 1]])
shape=(600,600)
pr=cv2.warpPerspective(img, M, shape)
У практичних застосуваннях для корекції зображення потрібно виконати обернене проективне перетворення. Функція cv2.getPerspectiveTransform(pts1,pts2) , де pts1,pts2 - масиви координат відповідних точок на зображенях, обчислює матрицю такого перетворення знаючи четвірку точок на кожному зображенні, які переходять одна в одну, аналогічно до афінного випадку.
У прикладі нижче для другого зображення були вибрані координати його чотирьох кутових вершин.
pts1 = np.float32([[56,100],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
pr=cv2.warpPerspective(img, M, shape)
Будьте уважними, розміри масиву в NumPy i в OpenCV трактуються по різному!
Приклад заміни портрета на портрет Шевченка із збереженням перспективи
Нові координати пікселя(пікселів) при проективному перетворенніpt1=[100,160]
pt2=[50,88]
pts = np.array([pt1,pt2], dtype =np.float32)
pts = np.array([pts])
P=np.round(cv2.perspectiveTransform(pts, MM),2)
pt1_new,pt2_new=list(P[0][0]),list(P[0][1])
Це саме для одного пікселя у вигляді функції
def NPP(M,x,y):# координати пікселя (x,y) при перетворені
pt1=[x,y]
pts = np.array([pt1], dtype =np.float32)
pts = np.array([pts])
P=np.round(cv2.perspectiveTransform(pts, M),5)
return list(P[0][0])
Немає коментарів:
Дописати коментар