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

相关推荐
A 计算机毕业设计-小途13 分钟前
大四零基础用Vue+ElementUI一周做完化妆品推荐系统?
java·大数据·hadoop·python·spark·毕业设计·毕设
念念01074 小时前
数学建模竞赛中评价类相关模型
python·数学建模·因子分析·topsis
云天徽上4 小时前
【数据可视化-94】2025 亚洲杯总决赛数据可视化分析:澳大利亚队 vs 中国队
python·信息可视化·数据挖掘·数据分析·数据可视化·pyecharts
☺����5 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
王者鳜錸5 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
xiao助阵6 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python
麻辣清汤7 小时前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
钢铁男儿8 小时前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
钢铁男儿8 小时前
Python 正则表达式实战:解析系统登录与进程信息
开发语言·python·正则表达式
前端小趴菜058 小时前
python - range
python