一:代码功能:
1、利用OpenCV将正面看到的图像转化成鸟瞰图
2、利用鼠标回调函数选取图像中的4个点,用于生成鸟瞰图
3、连续读取图像,一次完成多张图像的转化
二:使用方法:
1、获取图像中4个点的位置
根据
pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
得出选取4个点的顺序为:左上,右上,左下,右下。
2、按下键盘q键可以切换到下一张图片。
3、更改连续读取的图像的数量,需要更改i的范围,注意i=图像数量+1。
三:代码实现
import numpy as np
import cv2
width, height = 512, 450
pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
folder_left = "F:\dataset\left\\" # left图片目录
folder_label = "F:\dataset\labels\\" # label图片目录
# 鼠标回调函数
def onmouse_pick_points(event, x, y, flags, data):
mouse_imgleft = data.imgleft
mouse_imglabel = data.imglabel
if event == cv2.EVENT_LBUTTONDOWN:
# cv2.circle(mouse_imgleft, (x, y), 5, (0, 0, 255), -1)
# cv2.imshow('mouse img', mouse_imgleft)
H = [x, y]
print("H:", H)
if(len(data.points) < 4):
data.points.append(H)
print("data.points:", data.points)
print("len:", len(data.points))
if(len(data.points) == 4):
pts1 = np.float32(data.points)
print("pts1:", pts1)
matrix = cv2.getPerspectiveTransform(pts1, pts2)
imgOutput_left = cv2.warpPerspective(mouse_imgleft, matrix, (width, height))
imgOutput_label = cv2.warpPerspective(mouse_imglabel, matrix, (width, height))
cv2.imshow("output left000" + str(s), imgOutput_left)
cv2.imwrite(r"F:\dataset\bev_left\\"+"left000" + str(s)+".png", imgOutput_left)
# cv2.imshow("output label000" + str(s), imgOutput_label)
cv2.imwrite(r"F:\dataset\bev_labels\\"+"label000" + str(s)+".png", imgOutput_label)
data.points = []
class data:
imgleft = ''
imglabel = ''
points = []
global i
i = 1
while i < 20: #更改连续读取图像的数量,需更改此处i的值
s = "%03d" % i
path_left = folder_left + "left000" + str(s) + ".png"
print("path_left: ", path_left)
imgleft = cv2.imread(path_left)
data.imgleft = imgleft
path_label = folder_label + "label000" + str(s) + ".png"
print("path_label: ", path_label)
imglabel = cv2.imread(path_label)
data.imglabel = imglabel
WIN_NAME = "left000" + str(s)
cv2.namedWindow(WIN_NAME, cv2.WINDOW_KEEPRATIO)
cv2.setMouseCallback(WIN_NAME, onmouse_pick_points, data) # 鼠标回调事件
cv2.imshow(WIN_NAME, imgleft)
# cv2.imshow("label000" + str(s), imglabel)
key = cv2.waitKey(0)
if key == ord("q"):
cv2.destroyAllWindows()
i += 1
if i == 20: #更改连续读取图像的数量,需更改此处i的值
break
cv2.waitKey(0)
四:结果
处理前的图片
处理后的图片