使用OpenCV和Python中的事件處理影片輸出的點選響應


OpenCV是一個基於Python的開源計算機視覺庫。它提供了許多函式來執行各種影像或影片處理操作。該庫使用Python的NumPy模組將所有影片或影像陣列表示為ndarray型別。

在本文中,我們將學習如何使用Python OpenCV模組中的事件來檢測影片輸出上的點選響應。

為了識別在影片輸出上發生的滑鼠事件,我們將使用以下滑鼠事件:

  • cv2.EVENT_LBUTTONDOWN:表示左鍵按下

  • cv2.EVENT_RBUTTONDOWN:表示右鍵按下

此外,我們將使用setMouseCallback()函式為指定的視窗設定滑鼠事件處理程式。

setMouseCallback()函式

此函式用於指定哪個函式必須為特定視窗呼叫。換句話說,此函式為指定的視窗建立滑鼠事件處理程式。以下是其語法:

cv2.setMouseCallback(winname, onMouse, userdata)

其中:

  • Winname:特定視窗的名稱。

  • OnMouse:滑鼠事件的回撥函式。

  • Userdata:傳遞給回撥函式的可選引數。

在影片檔案上

cv2.VideoCapture()函式將讀取影片檔案資料。在這裡,我們將定義一個滑鼠回撥函式來識別影片輸出的點選響應。

示例

讓我們來看一個檢測影片輸出上發生哪個點選事件的例子。

import cv2
  
def check_mouse_event(event, x, y, flags, param):
   # to check if left mouse button was clicked
   if event == cv2.EVENT_LBUTTONDOWN:
      print("left click")
      cv2.imshow("Current Frame for left click", frame)
   
   # to check if right mouse button was clicked
   if event == cv2.EVENT_RBUTTONDOWN:
      print("right click")
      cv2.imshow("Current Frame for Right click", frame)  

cap = cv2.VideoCapture("Videos/blue-tit-2975.mp4")
  
if cap.isOpened() == False:
   # give error message
   print("Error in opening file.")
else:
   while(cap.isOpened()):
      ret, frame = cap.read()
      if ret == True:
         cv2.imshow("Input Window", frame)
         cv2.setMouseCallback('Input Window', check_mouse_event, param=frame)
         if cv2.waitKey(10) & 0xFF == ord('q'):
               break
      else:
         break

cap.release()
cv2.destroyAllWindows()

輸入視窗

輸出 - 左鍵點選

輸出 - 右鍵點選

顯示了發生左鍵和右鍵點選事件的輸入影片檔案的當前幀。

在即時影片上

在所有函式中,我們還使用namedWindow()函式建立一個視窗,該視窗可用於複製影像和軌跡條的位置。如果已存在同名視窗,則該函式不會複製/執行任何操作。以下是此函式的語法:

cv.namedWindow(winname[, flags])

其中:

  • Winname:指定視窗的名稱。

  • Flags:用於指定視窗標誌。

示例

在這個例子中,我們將在左鍵按下處繪製一個半徑為10的紅色圓圈。

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
color = (0,0,255) #red color
line_width = 2
radius = 10
point = (0,0)
def click(event, x, y, flags, param):
   global point, pressed
   if event == cv2.EVENT_LBUTTONDOWN:
      print("left button Pressed at {},{} co-ordinates".format(x,y))
      point = (x,y)
        
cv2.namedWindow("live video")
cv2.setMouseCallback("live video",click)
while(True):
   ret, frame = cap.read()
   frame = cv2.resize(frame, (0,0), fx=0.5,fy=0.5)
   cv2.circle(frame, point, radius, color, line_width)
   cv2.imshow("live video",frame)
   
   if cv2.waitKey(1) & 0xFF == ord('q'):
      break
cap.release()
cv2.destroyAllWindows()

輸出

left button Pressed at 29,36 co-ordinates
left button Pressed at 27,44 co-ordinates
left button Pressed at 150,82 co-ordinates
left button Pressed at 178,36 co-ordinates 

紅色圓圈繪製在發生左鍵點選事件的即時影片畫面上。

更新於:2023年5月30日

344 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.