图片视角转换 cv2.warpPerspective
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片视角转换 cv2.warpPerspective相关的知识,希望对你有一定的参考价值。
简 介: 利用cv2图片处理程序库对于图片进行视觉转换,可以生成所需要的斜视图片。其中需要注意到背景填充的模式和颜色。缺省情况下,图片的背景是使用黑色进行填充的。
关键词
: cv2,视角转换
§01 视角转换
一、应用背景
在书写全国大学生智能车智能视觉组文档是,为了生成四面带有Apriltag的立体标志点的图例时,需要将正视图片处理成斜视侧面图片。
▲ 图1.1.1 Apriltag立方体侧面图片
下面需要使用到cv2的一些图片转换函数。
1、相关cv2函数
(1)图片读取与转换
下面是通过cv2读取图片,并转换成RGB的格式。
img = cv2.imread(filename)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
(2)图片显示
使用 axis(‘off’) 可以将显示图片周围的坐标轴隐匿。
plt.axis('off')
plt.imshow(img)
plt.show()
(3)图片转换
Ⅰ.转换图片
在warpPerspective()函数中,最后面两个参数 boarderMode,boarderValue声明在转换后的图片背景颜色。
其中:
- **borderMode:**说明背景外插模式,可以选择的模式包括:
- cv2.BORDER_CONSTANT
- cv2.BORDER_REPLICATE
- boardValue: 外插背景颜色,可以使用三元组(R,G,B):0 ~ 255说明背景颜色。
sheared_img = cv2.warpPerspective(img, M, (3*cols, 3*rows),
borderMode=cv2.BORDER_CONSTANT,
borderValue=(255,255,255))
Ⅱ.计算转换矩阵
这是由图片转换前与转换后的四个角的位置来计算出视角转换矩阵。
四个点的位置分别为:(左下,右下,左上,右上)。
# 定义对应的点
points1 = np.float32([[75,55], [340,55], [33,435], [400,433]])
points2 = np.float32([[0,0], [360,0], [0,420], [360,420]])
# 计算得到转换矩阵
M = cv2.getPerspectiveTransform(points1, points2)
二、处理过程
1、标记图片四角位置
为了获得图片转换矩阵,需要应用图片转换前、后的四个角点的位置参数,在TEASOFT软件中使用红点标记处这些位置。
▲ 图1.1.2 使用红点标定图片的四个角的位置
通过计算这些红点中心,获得各个角点的位置:
bp1 = [244, 243, 241, 242]
bp2 = [231, 233, 240, 232]
bp3 = [239, 234, 233, 232]
def p2border(bp):
border = []
for id in bp:
r = tspgetrange(id)
border.append([(r[0]+r[2])/2, (r[1]+r[3])/2])
bx = border[0][0]
by = border[0][1]
for id, b in enumerate(border):
b[0] -= bx
b[1] = by - b[1]
border[id] = b
return border
b1 = p2border(bp1)
b2 = p2border(bp2)
b3 = p2border(bp3)
2、计算转换矩阵
b1 = p2border(bp1)
b2 = p2border(bp2)
b3 = p2border(bp3)
M12 = cv2.getPerspectiveTransform(float32(b1), float32(b2))
M13 = cv2.getPerspectiveTransform(float32(b1), float32(b3))
3、处理结果
使用上述转换还需要进行图片的上下, 左右的反转才能够得到正确的转换图片。
▲ 图1.2.2 转换后的图片
三、Apriltag图标
下面是用于全国大学生智能车中智能视觉组中的Apriltag图标的示意图。
▲ 图1.2.3 最后生成的Apriltag图标
§02 转换程序
一、转换Python代码
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# IMAGE2.PY -- by Dr. ZhuoQing 2021-11-21
#
# Note:
#============================================================
from headm import *
import cv2
bp1 = [244, 243, 241, 242]
bp2 = [231, 233, 240, 232]
bp3 = [239, 234, 233, 232]
def p2border(bp):
border = []
for id in bp:
r = tspgetrange(id)
border.append([(r[0]+r[2])/2, (r[1]+r[3])/2])
bx = border[0][0]
by = border[0][1]
for id, b in enumerate(border):
b[0] -= bx
b[1] = by - b[1]
border[id] = b
return border
b1 = p2border(bp1)
b2 = p2border(bp2)
b3 = p2border(bp3)
printf(b1, b2, b3)
M12 = cv2.getPerspectiveTransform(float32(b1), float32(b2))
M13 = cv2.getPerspectiveTransform(float32(b1), float32(b3))
printf(M12)
imageid = 226
imagefile = tspgetdopfile(imageid)
img = cv2.imread(imagefile)
img = cv2.warpPerspective(img, M12, (500, 500), borderMode=cv2.BORDER_CONSTANT, borderValue=(255,255,255))
plt.axis('off')
plt.imshow(img)
plt.show()
#------------------------------------------------------------
# END OF FILE : IMAGE2.PY
#============================================================
※ 总 结 ※
利用cv2图片处理程序库对于图片进行视觉转换,可以生成所需要的斜视图片。其中需要注意到背景填充的模式和颜色。缺省情况下,图片的背景是使用黑色进行填充的。
● 相关图表链接:
以上是关于图片视角转换 cv2.warpPerspective的主要内容,如果未能解决你的问题,请参考以下文章