opencv(py) setMouseCallback 用鼠标在图像上画出矩形框(静态)

419 阅读2分钟
  •        Python : 3.8.11
  • opencv-python : 4.1.2.30
  • opencv-contrib-python : 4.1.2.30
  •          OS : Ubuntu Kylin 20.04
  •       Conda : 4.10.1
  •     Pycharm : 2021.1.3

代码示例

import cv2
import numpy as np

flag_mouse_lbutton_down = False
point_x = -1
point_y = -1


def draw_circle(event, x, y, flags, param):
    global flag_mouse_lbutton_down, point_x, point_y
    print(event, x, y, flags, param)

    # 鼠标左键按下
    if event == cv2.EVENT_LBUTTONDOWN:
        flag_mouse_lbutton_down = True
        point_x = x
        point_y = y
        cv2.circle(image, (x, y), 1, (0, 0, 255), thickness=2)

    if event == cv2.EVENT_LBUTTONUP:
        flag_mouse_lbutton_down = False
        cv2.rectangle(image, (point_x, point_y), (x, y), (0, 0, 255), 2)


image_path = "opencv-image.png"
image = cv2.imread(image_path)
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_circle)

while True:
    cv2.imshow("image", image)
    # waitKey 不能为0,必须有值,才可以刷新image
    # 鼠标点×是关不掉的,只能键盘输入q
    if cv2.waitKey(1) == ord("q"):
        break

cv2.destroyAllWindows()

运行结果

cv-mouse-click-rectangle-static-1.png

cv-mouse-click-rectangle-static-2.png

/home/coder/anaconda3/bin/python3.8 /home/coder/PycharmProjects/pythonProject2/main.py
0 274 451 0 None
0 185 412 0 None
0 162 398 0 None
0 6 208 0 None
0 6 208 0 None
0 17 198 0 None
0 30 189 0 None
0 36 184 0 None
0 41 177 0 None

......此处省略大部分内容......

0 151 38 0 None
0 151 34 0 None
0 151 30 0 None
0 151 26 0 None
0 151 21 0 None
0 151 15 0 None
0 151 11 0 None
0 151 6 0 None
0 149 0 0 None

Process finished with exit code 0

  • 这份代码在过程的效果中是黑盒,用户看不到矩形框动态。
  • 正在探索 矩形框随着鼠标的移动而变化大小,就像一些截图软件中的标注框功能似的
  • 似乎实现的关键在于创建一个新的纯净副本

学习推荐


Python具有开源、跨平台、解释型、交互式等特性,值得学习。
Python的设计哲学:优雅,明确,简单。提倡用一种方法,最好是只有一种方法来做一件事。
代码的书写要遵守规范,这样有助于沟通和理解。
每种语言都有独特的思想,初学者需要转变思维、踏实践行、坚持积累。