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

最近更新

  1. TCP协议是安全的吗?

    2023-12-09 07:10:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-09 07:10:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-09 07:10:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-09 07:10:04       18 阅读

热门阅读

  1. 我的创作纪念日

    2023-12-09 07:10:04       38 阅读
  2. Vue2学习(组件的使用)

    2023-12-09 07:10:04       43 阅读
  3. 有关CSS选择器

    2023-12-09 07:10:04       39 阅读
  4. C++_对C数据类型的扩展

    2023-12-09 07:10:04       28 阅读
  5. ChatGPT的常识

    2023-12-09 07:10:04       42 阅读
  6. 蓝桥杯ACwing习题

    2023-12-09 07:10:04       33 阅读
  7. 美国Linux服务器的iptables防火墙介绍

    2023-12-09 07:10:04       40 阅读
  8. iClient3D 加载天地图服务

    2023-12-09 07:10:04       28 阅读
  9. MySQL七 | 存储引擎

    2023-12-09 07:10:04       40 阅读
  10. Visual Studio 2015 中 FFmpeg 开发环境的搭建

    2023-12-09 07:10:04       34 阅读
  11. 排序算法——冒泡排序

    2023-12-09 07:10:04       41 阅读
  12. P5743 【深基7.习8】猴子吃桃

    2023-12-09 07:10:04       36 阅读