python opencv实现任意角度的透视变换实例代码
本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下:
#-*-coding:utf-8-*-
importcv2
importnumpyasnp
defrad(x):
returnx*np.pi/180
img=cv2.imread("6.jfif")
cv2.imshow("original",img)
#扩展图像,保证内容不超出可视范围
img=cv2.copyMakeBorder(img,200,200,200,200,cv2.BORDER_CONSTANT,0)
w,h=img.shape[0:2]
anglex=0
angley=30
anglez=0#是旋转
fov=42
while1:
#镜头与图像间的距离,21为半可视角,算z的距离是为了保证在此可视角度下恰好显示整幅图像
z=np.sqrt(w**2+h**2)/2/np.tan(rad(fov/2))
#齐次变换矩阵
rx=np.array([[1,0,0,0],
[0,np.cos(rad(anglex)),-np.sin(rad(anglex)),0],
[0,-np.sin(rad(anglex)),np.cos(rad(anglex)),0,],
[0,0,0,1]],np.float32)
ry=np.array([[np.cos(rad(angley)),0,np.sin(rad(angley)),0],
[0,1,0,0],
[-np.sin(rad(angley)),0,np.cos(rad(angley)),0,],
[0,0,0,1]],np.float32)
rz=np.array([[np.cos(rad(anglez)),np.sin(rad(anglez)),0,0],
[-np.sin(rad(anglez)),np.cos(rad(anglez)),0,0],
[0,0,1,0],
[0,0,0,1]],np.float32)
r=rx.dot(ry).dot(rz)
#四对点的生成
pcenter=np.array([h/2,w/2,0,0],np.float32)
p1=np.array([0,0,0,0],np.float32)-pcenter
p2=np.array([w,0,0,0],np.float32)-pcenter
p3=np.array([0,h,0,0],np.float32)-pcenter
p4=np.array([w,h,0,0],np.float32)-pcenter
dst1=r.dot(p1)
dst2=r.dot(p2)
dst3=r.dot(p3)
dst4=r.dot(p4)
list_dst=[dst1,dst2,dst3,dst4]
org=np.array([[0,0],
[w,0],
[0,h],
[w,h]],np.float32)
dst=np.zeros((4,2),np.float32)
#投影至成像平面
foriinrange(4):
dst[i,0]=list_dst[i][0]*z/(z-list_dst[i][2])+pcenter[0]
dst[i,1]=list_dst[i][1]*z/(z-list_dst[i][2])+pcenter[1]
warpR=cv2.getPerspectiveTransform(org,dst)
result=cv2.warpPerspective(img,warpR,(h,w))
cv2.imshow("result",result)
c=cv2.waitKey(30)
#anglex+=3#autorotate
#anglez+=1#autorotate
#angley+=2#autorotate
#键盘控制
if27==c:#Escquit
break;
ifc==ord('w'):
anglex+=1
ifc==ord('s'):
anglex-=1
ifc==ord('a'):
angley+=1
#dx=0
ifc==ord('d'):
angley-=1
ifc==ord('u'):
anglez+=1
ifc==ord('p'):
anglez-=1
ifc==ord('t'):
fov+=1
ifc==ord('r'):
fov-=1
ifc==ord(''):
anglex=angley=anglez=0
ifc==ord('q'):
print("======================================")
print('旋转矩阵:\n',r)
print("anglealpha:",anglex,'anglebeta:',angley,"dz:",anglez,":",z)
cv2.destroyAllWindows()
总结
以上就是本文关于pythonopencv实现任意角度的透视变换实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!