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

方案一

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()

方案二

python 复制代码
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 实时显示绘制框的过程

相关推荐
*才华有限公司*6 小时前
《爬虫进阶之路:从模拟浏览器到破解动态加载的实战指南》
开发语言·python
深蓝电商API6 小时前
爬虫+Redis:如何实现分布式去重与任务队列?
redis·分布式·爬虫·python
我是华为OD~HR~栗栗呀7 小时前
华为OD-23届考研-测试面经
java·c++·python·华为od·华为·面试·单元测试
gc_22997 小时前
学习Python中Selenium模块的基本用法(20:安装Selenium IDE)
python·selenium
程序员爱钓鱼7 小时前
Python编程实战 · 基础入门篇 | 数据类型简介:数字、字符串、布尔值
后端·python
福大大架构师每日一题7 小时前
rustdesk 1.4.3 发布:新增虚拟鼠标、Wayland 多显示器支持等功能
计算机外设·rustdesk
梓默7 小时前
鼠标偶尔卡顿解决方法
计算机外设
Jwest20217 小时前
工业显示器在矿用挖掘机中的应用
计算机外设
lzhdim7 小时前
雷蛇(Razer)炼狱蝰蛇V2X极速版无线鼠标开箱
单片机·嵌入式硬件·计算机外设
Python图像识别8 小时前
73_基于深度学习的水面漂浮垃圾检测系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo