Python 中 OpenCV 的 GUI 特性

Manav Narula 2023年1月30日 2022年7月18日
  1. 在 Python 中使用 OpenCV 讀取和寫入影象
  2. 在 Python 中使用 OpenCV 繪製影象
  3. 帶有軌跡欄的調色盤在 Python 中使用 OpenCV
  4. まとめ
Python 中 OpenCV 的 GUI 特性

GUI 代表圖形使用者介面,它允許使用者使用鍵盤和滑鼠等硬體裝置與程式進行互動。GUI 提供了一個相對容易使用的視覺上吸引人的介面。

opencv 庫實現了可以應用不同技術處理影象的各種函式和物件。我們可以使用這個庫非常有效地讀取和處理影象。

本教程將使用 Python 的 opencv 庫演示不同的 GUI 技術。

在 Python 中使用 OpenCV 讀取和寫入影象

最基本的 GUI 技術與讀取和顯示影象相關。opencv 庫使用 imshow() 函式建立一個顯示影象的視窗。

我們可以使用 imread() 函式預先讀取影象,甚至使用 imwrite() 方法將其儲存在某個指定路徑上。

Python 直譯器會在程式執行後立即關閉建立的視窗,我們可以使用 waitKey() 函式來防止這種情況發生。該函式等待使用者按下某個鍵,然後恢復程式執行。

我們可以使用 destroyAllWindows() 函式根據使用者要求關閉視窗。讓我們看一個工作示例。

程式碼示例:

import cv2

img = cv2.imread('obj.png')
cv2.imshow("Show image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('Newimage.png', img)

輸出:

True

在 python 中使用 opencv gui 讀寫影象

該程式碼使用 imread() 函式讀取影象並使用 imshow() 函式顯示它。然後我們等待使用者在恢復執行之前按下某個鍵。

按下某個鍵後,將關閉建立的視窗。然後 imwrite() 函式繼續將給定影象儲存到指定路徑。

請注意,我們還在函式中指定檔名及其格式。該函式返回 True,表示檔案已成功寫入。

在 Python 中使用 OpenCV 繪製影象

opencv 庫還提供了在影象上繪圖的功能。我們可以使用 line()rectangle()circle() 等函式在影象上繪製不同的形狀。

我們可以在之前閱讀的影象上繪製這些形狀。

程式碼示例:

import cv2

img = cv2.imread('obj.png')

cv2.line(img,(0,0),(511,511),(255,0,0),5)
cv2.rectangle(img,(400,0),(510,128),(255,255,0),3)
cv2.imshow("Show image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('Newimage.png', img)

輸出:

True

在 Python 中使用 OpenCV 繪製影象

在上面的示例中,我們向輸入影象新增了一條線和一個矩形,然後將其儲存在某個位置。

line() 函式將線條新增到影象中。我們指定線條的起點和終點座標以及粗細和顏色程式碼。

rectangle() 函式建立一個矩形。此函式指定右下角和左上角座標以及顏色程式碼和厚度。

繪製影象後,我們使用 imwrite() 函式將其匯出到裝置。

我們還可以將滑鼠用作畫筆,並在給定影象上所需的位置新增形狀或線條。如前所述,opencv 庫具有可以讀取和檢測使用者輸入的函式,例如 waitKey() 函式。

該庫儲存不同的事件,例如滑鼠左鍵單擊、滑鼠右鍵單擊等等。我們可以等待使用者執行一些事件,然後根據事件呼叫函式。

首先,我們需要使用 namedWindow() 方法建立一個視窗,併為該視窗分配一個標題。setMouseCallback() 處理某些指定視窗上的滑鼠事件。

我們可以在函式中指定視窗標題。我們還需要指定一個需要執行的函式。

程式碼示例:

import cv2

def add_circle(e,x,y,flags,param):
    if e == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),25,(0,0,255),-1)

img = cv2.imread('obj.png')
cv2.namedWindow('Draw')
cv2.setMouseCallback('Draw',add_circle)

while(True):
    cv2.imshow('Draw',img)
    if cv2.waitKey(20) & 0xFF == 27:
        break
cv2.destroyAllWindows()

輸出:

使用 opencv python 在影象上繪製形狀(圓形)

讓我們理解上面示例中的程式碼。首先,我們讀取影象並使用 namedWindow() 函式建立一個視窗。

我們建立了一個函式 add_circle(),它接受事件、座標、標誌和其他引數。我們通過雙擊滑鼠左鍵(cv2.EVENT_LBUTTONDBLCLK)檢查事件是否相同。

當滑鼠在視窗上雙擊時,條件為 True,我們將座標傳遞給 circle() 函式,該函式在滑鼠單擊的位置建立一個圓。我們建立一個迴圈來重複執行此操作。

必須按下 Escape 鍵才能跳出迴圈。waitKey() 函式檢測按下的鍵。

帶有軌跡欄的調色盤在 Python 中使用 OpenCV

讓我們繼續使用 Python 中的 opencv 來了解更復雜的 GUI 技術。使用黑屏可以更好地理解這一點。

我們將為此建立一個三維的 numpy 陣列,該陣列用零填充,並將用作黑屏。然後,我們將使用 namedWindow() 方法為該影象建立一個視窗,就像我們在前面的示例中所做的那樣。

現在我們需要建立軌跡欄。我們將通過使用軌跡欄更改其 RGB 值來控制此黑屏的調色盤。

要建立軌跡欄,我們使用 createTrackbar() 函式。此方法將建立一個跟蹤欄,將其附加到提供的視窗,並在函式內指定跟蹤欄的影象物件和範圍。

在我們的例子中,範圍是從 0255。它還需要一個 OnChange 引數,其中包含一個在每次滑塊位置更改時都需要呼叫的函式。

當位置改變時,我們不需要一個函式來執行任何操作。因此,我們將建立一個不執行任何操作且僅包含 pass 語句的函式。

我們將建立一個迴圈,直到按下特定鍵為止。在這個迴圈中,我們將使用 getTrackbarPos() 位置獲取滑塊的當前位置,我們將根據跟蹤器位置設定此影象的 RBG 值。

程式碼示例:

import cv2
import numpy as np

def ignore(x):
    pass

img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('rgb_palette')

cv2.createTrackbar('R','rgb_palette',0,255,ignore)
cv2.createTrackbar('G','rgb_palette',0,255,ignore)
cv2.createTrackbar('B','rgb_palette',0,255,ignore)

while(True):
    cv2.imshow('rgb_palette',img)
    c = cv2.waitKey(1) & 0xFF
    if c == 27:
        break

    R = cv2.getTrackbarPos('R','rgb_palette')
    G = cv2.getTrackbarPos('G','rgb_palette')
    B = cv2.getTrackbarPos('B','rgb_palette')

    img[:] = [B,G,R]

cv2.destroyAllWindows()

帶有軌跡欄的調色盤在 Python 中使用 OpenCV

在上面的例子中,我們在 Python 中使用 opencv 建立了一個 RGB 調色盤。我們為紅色、綠色和藍色值建立三個軌跡欄。

我們在滑塊上更改它們的值,這反映在影象(黑屏)上。要跳出迴圈,我們可以按下 Escape> 鍵,使用 waitKey() 函式來檢測按下的鍵。

まとめ

本教程演示了與 Python 的 opencv 庫相關的各種 GUI 技術和功能。我們詳細演示了這些技術。

使用 opencv 庫讀取和寫入影象可以被認為是最簡單的 GUI 功能,因為影象顯示在新建立的視窗中。我們也可以匯出此影象並將其儲存在裝置上。

然後,我們討論瞭如何使用 opencv 在影象上繪製形狀和線條。我們討論了可用於繪製這些形狀的函式,並通過向其新增使用者互動和使用滑鼠單擊繪製形狀來新增更多 GUI 功能。

在最後的 GUI 功能中,我們演示了軌跡欄的使用。這些是使用者可以更改的滑塊。

我們建立一個 RGB 調色盤軌跡欄。值發生了變化,我們觀察螢幕上的變化。

Author: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相關文章 - Python OpenCV