图片视角转换 cv2.warpPerspective

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图片视角转换 cv2.warpPerspective相关的知识,希望对你有一定的参考价值。

视角转换
文章目录
应用背景
处理过程
Apriltag图标
转换程序
转换Python代码
总 结

简 介: 利用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的主要内容,如果未能解决你的问题,请参考以下文章

Cesium 相机视角与 Mapbox 视角转换

Unity全视角跟随鼠标右键转换视角实现——研究笔记

对相机所看的视角截屏保存为图片

如何区分三视图中的:第一视角和第三视角?

unity3d转换怎样调视角?原本右键可以调视角,但现在它只能调整画面的位置了,怎样改回来?

OSG能够在当前帧截图,也就是能转换视角后马上截图