在 OpenCV-Python 中使用直線連線影像上新點到前一點


我們可能需要出於各種目的在影像上繪製線條,例如繪圖、塗鴉、跟蹤點的移動等,因此有必要了解如何在影像處理中連線兩個點。

OpenCV 是一個主要用於即時計算機視覺的程式設計函式庫。該庫是跨平臺的,並根據 Apache 許可證獲得免費和開源軟體許可。

在本文中,我們將學習如何使用 OpenCV-Python 在影像上使用直線連線新點到前一點。

連線前一點上的點

我們的任務是將影像上滑鼠點選的當前座標位置與前一點連線起來。

在開始連線點的步驟之前,我們應該知道我們將如何做到這一點。影像由許多畫素組成,這些畫素可以透過座標指定,我們可以在此影像上選擇任意兩個點,它們都將具有一些座標,透過連線這兩個點,我們可以輕鬆地繪製一條線。但我們需要擁有這些座標。

為了在影像上的兩個點之間繪製直線,我們可以使用 OpenCV 的 **cv2.line()** 函式。此方法的語法如下:

cv2.line(img, pt1, pt2, color, thickness)

要在每次滑鼠點選之間繪製線條,您需要按照以下步驟操作:

步驟 1:匯入所需的庫

第一步是匯入所需的庫。為了開啟、讀取和操作影像,我們將使用 Open CV 庫。

import cv2
import numpy as np

步驟 2:讀取影像

我們可以使用 **cv2.imread()** 函式從檔案讀取影像。在以下程式碼片段中,我們從檔案讀取了一個影像,並使用 cv2.imshow 函式顯示它。

# Read the image
img = cv2.imread('image.jpg')

# Display the image
cv2.imshow('Image', img)
cv2.waitKey(0)

步驟 3:宣告一個包含所有點的列表

為了跟蹤所有訪問過的點,我們將建立一個列表,在其中我們將附加我們在影像上點選滑鼠的所有點。

Point = []

步驟 4:定義滑鼠點選事件

下一步是定義每當滑鼠在螢幕上的任何位置點選時我們需要執行的操作。

  • 我們首先將我們點選的點的座標新增到 points 列表中。

  • 然後,我們將建立一個小的點來顯示我們點選影像的位置。

  • 如果我們第一次點選影像,則無需繪製線條。

  • 但之後我們需要在 points 列表中的最後兩個點之間繪製一條線。然後我們將顯示新影像。

  • 我們將此函式作為回撥新增到滑鼠事件中。

在以下程式碼片段中,cv2.setMouseCallback 函式捕獲滑鼠事件,然後在按下滑鼠左鍵時附加滑鼠點選的位置,並將新點的座標儲存在 points 列表中。然後,使用直線連線 points 列表中最後兩個可用的點。

這裡我們使用了 **cv2.line()** 函式在先前點和新點之間繪製一條線。該函式將兩個點的座標以及線條的顏色和粗細作為輸入。然後,我們使用 cv2.imshow 函式顯示帶有線條的影像。

# Define a callback function to capture mouse events
def mouse_callback(event, x, y, flags, param):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
      cv2.imshow('image', img)
      
# Set the callback function for mouse events
cv2.setMouseCallback('Image', mouse_callback)

# Wait for the user to click on the image
cv2.waitKey(0)

步驟 6:關閉所有視窗

最後,我們需要使用 destroyAllWindows() 函式銷燬所有視窗:

Cv2.destroyAllWindows()

示例

以下是使用 OpenCV-Python 在影像上使用直線連線新點到前點的完整程式碼:

import cv2
import numpy as np
img = cv2.imread('image5.jpg')
cv2.imshow('image',img)
points = []
def click_event(event, x, y, flags, params):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
         cv2.imshow('image', img)
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出

結論

在本文中,我們瞭解瞭如何使用 Python 語言的 OpenCV 庫在影像上使用直線連線新點到前一點。我們介紹了讀取影像、定義前一點和新點,然後使用直線連線這些點所需的所有步驟。我們瞭解了 Python 的 Opencv 庫及其在影像處理中的應用。

更新於: 2023年4月20日

937 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.