python+opencv三点仿射变换

一张图来表明要实现的功能:

python+opencv三点仿射变换_第1张图片

说明:将一张正正方方的矩形图转换成平行四边形(甚至不规则四边形)的操作。

平行四边形的图形看起来具有3D视角,在很多方面都有应用。我们直接来实现这个操作:

1. 实现

我们只需对应出3个点就可以使用opencv封装好的函数进行这个操作了,哪三个点呢?左上、右上、左下

三个点的坐标就是6个数字,我们把6个数字设置成自己想要的位置,就可以实现三点仿射变换。我粗略计算了120°四边形和150°四边形对应的6个数字,如下:

import cv2  
import numpy as np  
      
img = cv2.imread('cat.jpg')
rows, cols, ch = img.shape
 
pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])

coefs = [0, rows * 0.33, rows*0.33*1.732, 0, 0, rows]  # 120°
# coefs = [0, rows * (1.732/3.732), rows/3.732, 0, 0, rows]  # 150°

pts2 = np.float32([[coefs[0], coefs[1]], [coefs[2], coefs[3]], [coefs[4], coefs[5]]])

M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows))
dst1 = dst[int(coefs[3]):int(coefs[5]), int(coefs[0]):int(coefs[2]), :]

def white_backdrop(img, coef):
	rows, cols, channel= img.shape
	for i in range(rows):
		for j in range(cols):
			if j*coefs[1]+i*coefs[2]<=coefs[1]*coefs[2] \
			or j*coefs[1]+i*coefs[2] > coefs[5]*coefs[2]:
				img[i][j] = [255, 255, 255]
	cv2.imshow('d', img)
	k = cv2.waitKey(0)
	if k == ord('s'):
		cv2.imwrite('cat2.jpg', dst1)
		cv2.destroyAllWindows()

white_backdrop(dst1, coefs)

 第9行对应的coefs的6个数字就是我上面说的6个数字,即对应的3个点。后面我用了一个for循环把原本背景为黑色的部分换成了白色。

 

你可能感兴趣的:(Computer,Vision,python)