目录
2.相应的图片标签(box)怎样在透视变换后找到对应的坐标点
网上关于透视变换的文章很多,特别是对于原理解析的文章,所以我只记录下使用过程中遇到的问题;
1.透视变换结果溢出原图边界
本人的处理方法:
step1:根据原始的四个坐标点和目标的四个坐标点得到变换矩阵;
#p1:原图中的四个坐标点,p2:目标图中的四个坐标点
M = cv2.getPerspectiveTransform(p1, p2)
step2:将图片的边界的四个顶点输入到变换矩阵,得到变换后的四个坐标顶点;
h, w = image.shape[:2]
po1 = cv2.perspectiveTransform(np.array([[[0, 0]]], dtype=np.float32), M)
po2 = cv2.perspectiveTransform(np.array([[[w, 0]]], dtype=np.float32), M)
po3 = cv2.perspectiveTransform(np.array([[[w, h]]], dtype=np.float32), M)
po4 = cv2.perspectiveTransform(np.array([[[0, h]]], dtype=np.float32), M)
step3:根据变换后坐标顶点,判断图像顶点是否超出边界,若超出边界,则计算新的图片尺寸,对原始图片进行平移;
list_x = [po1[0][0][0], po2[0][0][0], po3[0][0][0], po4[0][0][0]]
list_y = [po1[0][0][1], po2[0][0][1], po3[0][0][1], po4[0][0][1]]
minx = min(list_x)
miny = min(list_y)
maxx = max(list_x)
maxy = max(list_y)
maxx = int(maxx - minx)
maxy = int(maxy - miny)
widthNew = maxx
heightNew = maxy
move_x = 0
move_y = 0
image1 = None
if minx < 0: #x轴方向要进行平移
move_x = -minx
if miny < 0: #y轴方向要进行平移
move_y = -miny
if move_y !=0 or move_x !=0:
# 加入平移操作
# M = np.float32([[1, 0, 100], [0, 1, 50]]) # (x,y) -> (100,50)
# dst = cv.warpAffine(img, M, (cols, rows))
mat_translation = np.float32([[1, 0, move_x], [0, 1, move_y]]) # 变换矩阵:设置平移变换所需的计算矩阵:2行3列
# [[1,0,20],[0,1,50]] 表示平移变换:其中20表示水平方向上的平移距离,50表示竖直方向上的平移距离。
image1 = cv2.warpAffine(image, mat_translation, (widthNew, heightNew), borderValue=(122, 122, 122))
step4:对step3的结果进行透视变换;
dst = cv2.warpPerspective(image1, M, [maxx, maxy]) #对图像进行透视变换
2.相应的图片标签(box)怎样在透视变换后找到对应的坐标点
这里只需要注意一点:大角度图片的标签要是左上顶点和右下顶点的矩形,透视变换后的坐标区域并不是很贴合真实需要检测的区域;最好的办法是使用四个顶点(左上,右上,右下,左下)的多边形的标签(这种多边形标签多用在ocr的文字区域检测任务中)的坐标做透视变换;如果只是简单的使用矩形的四个坐标点做透视变换,那么新的标签也不会贴合相应的目标检测区域;
好文章链接:
(学习笔记)透视变换及其python实现_lytlysll的博客-CSDN博客解决透视变换后图片信息丢失的问题,附程序_xiaoyeer666的博客-CSDN博客python cv2中的透视变换 - 江南烟雨尘 - 博客园Python 计算机视觉(五)特别篇 —— 透视变换_一马归一码的博客-CSDN博客python opencv 图像透视变换,图像平移,图像旋转,图像翻转_luolinll1212的专栏-CSDN博客