📜  使用 Python-OpenCV 在图像上用鼠标绘图

📅  最后修改于: 2022-05-13 01:55:28.861000             🧑  作者: Mango

使用 Python-OpenCV 在图像上用鼠标绘图

OpenCV 是一个用于计算机视觉、机器学习和图像处理的大型开源库。 OpenCV 支持多种编程语言,如Python、C++、 Java等。它可以处理图像和视频以识别物体、面部,甚至是人类的笔迹。在本文中,我们将尝试在鼠标的帮助下绘制图像。在学习如何使用鼠标在图像上绘图之前,我们需要了解什么是回调。<

打回来

编程中的回调意味着在进程完成时调用此函数(回调)。这同样适用于一般的面向事件的编程。单击鼠标按钮(事件)时,调用函数。我们不知道何时单击该按钮。我们所能做的就是告诉按钮“给我回电”或在单击鼠标按钮时调用此函数。

鼠标回调

当用户使用鼠标执行操作时,可能会发生回调;此操作通常称为事件。鼠标只有一个回调,即setMouseCallback() ,所有鼠标操作都只会调用此函数。

我们可以有条件块来根据使用鼠标执行的事件/操作来执行某些事情。鼠标事件/操作可能是:

  • EVENT_MOUSEMOVE
  • EVENT_LBUTTONDOWN
  • EVENT_RBUTTONDOWN
  • EVENT_LBUTTONUP
  • EVENT_RBUTTONUP

这个回调应该在什么时候发生:

我们希望只有当我们在弹出窗口上使用鼠标时才能回调这个回调,弹出窗口的标题是“弹出窗口的标题”。

cv2.namedWindow("Title of Popup Window")

示例 1:当我们使用 OpenCV 左键单击弹出窗口时绘制圆形:

import cv2
  
  
img = cv2.imread("flower.jpg")
  
def draw_circle(event, x, y, flags, param):
      
    if event == cv2.EVENT_LBUTTONDOWN:
        print("hello")
        cv2.circle(img, (x, y), 100, (0, 255, 0), -1)
          
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_circle)
  
while True:
    cv2.imshow("Title of Popup Window", img)
      
    if cv2.waitKey(10) & 0xFF == 27:
        break
          
cv2.destroyAllWindows()

输出:

示例 2:使用 OpenCV 在图像上拖动绘制一个矩形

import cv2
  
  
img = cv2.imread("flower.jpg")
  
# variables
ix = -1
iy = -1
drawing = False
  
def draw_rectangle_with_drag(event, x, y, flags, param):
      
    global ix, iy, drawing, img
      
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix = x
        iy = y            
              
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.rectangle(img, pt1 =(ix, iy),
                          pt2 =(x, y),
                          color =(0, 255, 255),
                          thickness =-1)
      
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img, pt1 =(ix, iy),
                      pt2 =(x, y),
                      color =(0, 255, 255),
                      thickness =-1)
          
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", 
                     draw_rectangle_with_drag)
  
while True:
    cv2.imshow("Title of Popup Window", img)
      
    if cv2.waitKey(10) == 27:
        break
  
cv2.destroyAllWindows()

输出:

(cv2.waitKey(10) & 0xFF == 27) 做什么?

cv2.waitKey() 返回一个 32 位整数值(可能取决于平台)。键输入是 ASCII 码,它是一个 8 位整数值。因此,您只关心这 8 位,并希望所有其他位为 0。您可以通过以下方式实现: cv2.waitKey(10) & 0xFF == 27