opencv-python使用鼠标点击图片显示该点坐标和像素值&&IPM逆透视变换车道线

OpenCV的鼠标操作

实现获取像素点的功能主要基于OpenCV的内置函数cv2.setMouseCallback(),即鼠标事件回调

setMouseCallback(winname, onMouse,userdata=0)

winname: 接收鼠标事件的窗口名称

onMouse: 处理鼠标事件的回调函数指针

userdata: 传给回调函数的用户数据

代码实现:鼠标点击图片时,读取当前鼠标对应位置的像素值(顺序为BGR),在鼠标所在位置的左上角显示当前坐标值和像素值;鼠标移动时,旧的文本框消失

复制代码
import cv2
import numpy as np

img = cv2.imread('./158.jpg')#读取图片
font_face,font_scale,thickness=cv2.FONT_HERSHEY_SIMPLEX,0.5,1
#鼠标交互
def mouseHandler(event,x,y,flags,param):
    points = (x,y)
    global imgCopy
    #鼠标左键双击事件
    if event == cv2.EVENT_LBUTTONDBLCLK:
    	#输出坐标
        print(x,y)
        #拷贝一张与原图像格式相同的新图像
        imgCopy = img.copy()
        #拼接文字
        text = '['+str(x)+','+str(y)+']'+str(img[x,y])
        #读取文字(宽,高),下基线
        (t_w,t_h),baseLine = cv2.getTextSize(text,font_face,font_scale,thickness)
        #在鼠标当前位置的左上角显示文字
        cv2.putText(imgCopy,text,(x-t_w,y),font_face,font_scale,(125,125,125))
        cv2.imshow('win',imgCopy)
    #鼠标移动事件
    elif event == cv2.EVENT_MOUSEMOVE:
    	#显示原图片能使文本框消失
        cv2.imshow('win',img)

cv2.namedWindow('win')
#窗口与回调函数绑定
cv2.setMouseCallback('win',mouseHandler)
cv2.imshow('win',img)
cv2.waitKey()

IPM代码:

复制代码
import cv2  
import numpy as np  
  
def multi_transform(img, pts1):  
  
    ROI_HEIGHT = 30000  
    ROI_WIDTH = 3750  
  
    # 设定逆透视图的宽度  
    IPM_WIDTH = 500  
    N = 5  
  
    # 保证逆透视图的宽度大概为N个车头宽  
    sacale=(IPM_WIDTH/N)/ROI_WIDTH  
    IPM_HEIGHT=ROI_HEIGHT*sacale  
  
    pts2 = np.float32([[IPM_WIDTH/2-IPM_WIDTH/(2*N), 0],  
                       [IPM_WIDTH/2+IPM_WIDTH/(2*N), 0],  
                       [IPM_WIDTH/2-IPM_WIDTH/(2*N), IPM_HEIGHT],  
                       [IPM_WIDTH/2+IPM_WIDTH/(2*N), IPM_HEIGHT]])  
  
    print(IPM_HEIGHT,IPM_WIDTH)  
  
    matrix = cv2.getPerspectiveTransform(pts1, pts2)  
    output = cv2.warpPerspective(img, matrix, (int(IPM_WIDTH),int(IPM_HEIGHT+50)))  
  
    for i in range(0, 4):  
        cv2.circle(img, (pts1[i][0], pts1[i][1]), 6, (0, 0, 255), cv2.FILLED)  
  
    for i in range(0,4):  
        cv2.circle(output, (pts2[i][0], pts2[i][1]),6, (0, 0, 255), cv2.FILLED)  
  
    # p1 = (0, 250)  
    # p2 = (img.shape[1], img.shape[0]-100)  
    # point_color = (255, 0, 0)  
    # cv2.rectangle(img, p1, p2, point_color, 2)  
    cv2.imshow("src image", img)  
    cv2.imshow("output image", output)  
  
    cv2.imwrite("output.jpg", output)  # 新增的代码,将处理后的图像保存为 "output.jpg"  
    cv2.waitKey(0)  
  
if __name__ == '__main__':  
    # 图像1  
    img = cv2.imread("./158.jpg")  
    pts1 = np.float32([[543, 462],       # p1  
                       [749, 466],       # p2  
                       [277, 536],       # p3  
                       [937, 546]])      # p4  
  
    # 图像2  
    # img = cv2.imread("./789.jpeg")  
    # pts1 = np.float32([[243, 189],       # p1  
    #                    [383, 186],       # p2  
    #                    [77, 253],       # p3  
    #                    [533, 253]])      # p4  
  
    multi_transform(img, pts1)

原图:

效果图:

相关推荐
小鸡吃米…5 分钟前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫42 分钟前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)1 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
saoys1 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
minhuan1 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维1 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd1 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
njsgcs2 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
io_T_T2 小时前
迭代器 iteration、iter 与 多线程 concurrent 交叉实践(详细)
python