пʼятниця, 30 квітня 2021 р.

Проективне перетворення в OpenCV

Mathedemo Функція cv2.warpPerspective(img, M, shape) виконує проективне перетворення зображення img з матрицею M у нове зображення заданого розміру shape.

Приклад використання

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])

Немає коментарів:

Дописати коментар