python+opencv三点仿射变换

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

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

平行四边形的图形看起来具有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循环把原本背景为黑色的部分换成了白色。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木盏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值