【OpenCV】利用鼠标回调函数自主选择点,将图像转化成鸟瞰图

一:代码功能:

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)

四:结果

处理前的图片

 处理后的图片

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值