当前位置: 首页 > article >正文

python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。

方案一

import cv2

# Global variables
rectangles = []
current_rectangle = []
drawing = False

# Mouse callback function
def mouse_callback(event, x, y, flags, param):
    global rectangles, current_rectangle, drawing

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        current_rectangle = [(x, y)]

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        current_rectangle.append((x, y))
        rectangles.append(tuple(current_rectangle))
        current_rectangle = []

    elif event == cv2.EVENT_RBUTTONDOWN:
        rectangles.pop()

# Open camera
cap = cv2.VideoCapture(0)

# Create a window and set mouse callback
cv2.namedWindow('Camera')
cv2.setMouseCallback('Camera', mouse_callback)

while True:
    # Read frame from camera
    ret, frame = cap.read()

    # Draw rectangles on the frame
    for rect in rectangles:
        cv2.rectangle(frame, rect[0], rect[1], (0, 255, 0), 2)

    # Display the frame
    cv2.imshow('Camera', frame)

    # Check for key press
    key = cv2.waitKey(1)
    if key == 27:  # Press 'Esc' to exit
        break

# Release the camera and destroy all windows
cap.release()
cv2.destroyAllWindows()

方案二

import cv2

# Global variables
rectangles = []
current_rectangle = []
drawing = False
rect_x = 0
rect_y = 0

# Mouse callback function
def mouse_callback(event, x, y, flags, param):
    global rectangles, current_rectangle, drawing

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        current_rectangle = [(x, y)]
        global rect_x, rect_y
        rect_x = x
        rect_y = y

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        current_rectangle.append((x, y))
        rectangles.append(tuple(current_rectangle))
        current_rectangle = []


    elif event == cv2.EVENT_RBUTTONDOWN:
        rectangles.pop()

# Open camera
cap = cv2.VideoCapture(0)

# Create a window and set mouse callback
cv2.namedWindow('Camera')
cv2.setMouseCallback('Camera', mouse_callback)

while True:
    # Read frame from camera
    ret, frame = cap.read()

    # Draw rectangles on the frame
    for rect in rectangles:
        cv2.rectangle(frame, rect[0], rect[1], (0, 255, 0), 2)

    # Draw current rectangle in real-time
    if drawing:
        cv2.rectangle(frame, current_rectangle[0], (rect_x, rect_y), (0, 255, 0), 2)

    # Display the frame
    cv2.imshow('Camera', frame)

    # Check for key press
    key = cv2.waitKey(1)
    if key == 27:  # Press 'Esc' to exit
        break

# Release the camera and destroy all windows
cap.release()
cv2.destroyAllWindows()

下一步修改优化

a 在图像区域内实时显示鼠标所在位置的十字线

b 实时显示绘制框的过程


http://www.kler.cn/a/163254.html

相关文章:

  • 数据分析那些事儿——时间片轮转实验
  • Ubuntu 的 ROS 操作系统turtlebot3环境搭建
  • 星期-时间范围选择器 滑动选择时间 最小粒度 vue3
  • 万字长文解读深度学习——卷积神经网络CNN
  • ROM修改进阶教程------安卓14 安卓15去除app签名验证的几种操作步骤 详细图文解析
  • Rust 中的 match 基本用法
  • 一文说清google最新大模型Gemini
  • 8、操作符重载
  • C 语言 变量
  • Android 等待view 加载布局完成 (包括动态生成View)
  • CCF 202104-2:邻域均值--C++
  • vue文件下载
  • 互联网数据传输原理 |OSI七层网络参考模型
  • WMS条码扫描管理:实现仓库管理的高效与精准
  • 【RabbitMQ基础编程模型】
  • 十六、FreeRTOS之FreeRTOS队列集
  • 数据中心:保障企业运营安全可靠的关键
  • 深入浅出之中央空调体系架构及楼宇自控系统
  • 找重复的数据(一维数组)
  • NLP项目实战01之电影评论分类
  • 目标检测YOLO实战应用案例100讲-交通场景中基于深度学习的目标检测和深度估计
  • FolkMQ 内存型消息中间件,v1.0.18 发布
  • 腾讯云CentOS8 jenkins war安装jenkins步骤文档
  • android快速网络请求之android-networking
  • 【Vue3+Ts项目】硅谷甄选 — 路由配置+登录模块+layout组件+路由鉴权
  • 计算机的存储规则