該應用程序將有四個軌道欄:三個將用于更改顏色(B,G,R),第四個將用于選擇在矩形,圓形,直線或自由線之間。
也可以將軌跡欄用作開關。默認情況下,OpenCV沒有按鈕功能,但我們可以將軌跡欄用作按鈕。
我們可以在這個應用程序中使用的另一個有用的功能是鼠標回調函數,它將在鼠標事件發生時執行。
我們可以使用不同的形狀使用我們的OpenCV繪圖應用程序繪制。
Python代碼
以下是用于創建簡單繪畫應用程序的完整Python代碼:
import math
import cv2
def nothing(x):
pass
# Load an image
img = cv2.imread(‘obama.jpg’)
cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
# Create trackbars for color change
cv2.createTrackbar(‘R’,‘image’,0,255,nothing)
cv2.createTrackbar(‘G’,‘image’,0,255,nothing)
cv2.createTrackbar(‘B’,‘image’,0,255,nothing)
# Create trackbars for drawing shapes
cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)
drawing = False # true if mouse is pressed
ix,iy = -1,-1
# mouse callback function
def draw(event,x,y,flags,param):
global ix,iy,drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if s == 3:
cv2.circle(img,(x,y),5,(b, g, r),-1)
elif event == cv2.EVENT_LBUTTONUP:
if drawing == True:
if s == 0:
cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)
elif s == 1:
cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)
elif s == 2:
cv2.line(img,(ix,iy),(x,y),(b, g, r),5)
drawing = False
cv2.setMouseCallback(‘image’,draw)
while(1):
cv2.imshow(‘image’,img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
# get current positions of four trackbars
r = cv2.getTrackbarPos(‘R’,‘image’)
g = cv2.getTrackbarPos(‘G’,‘image’)
b = cv2.getTrackbarPos(‘B’,‘image’)
s = cv2.getTrackbarPos(‘Select’,‘image’)
cv2.destroyAllWindows()
閱讀圖像
函數 cv2.imread()用于讀取圖像,其參數是圖像的名稱。如果圖像在工作目錄中,只需寫入圖像的名稱。否則,您將必須提供圖像的完整路徑。
我們將創建一個窗口并將其標記為“圖像”。所有軌跡都將附加到此窗口。
img = cv2.imread(‘obama.jpg’)
cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
創建軌跡欄
要創建軌跡欄,我們使用 cv2.createTrackbar()函數,它有五個參數:
軌跡欄名稱
它所附加的窗口名稱
默認值
最大值
回調函數(每次跟蹤欄值更改時執行)
回調函數始終具有默認參數,即軌跡欄位置。在我們的例子中,函數什么都不做,所以我們只是傳遞。
我們為紅色,綠色和藍色創建了三個軌跡欄。每個軌跡欄的默認值為0,最大值為255,并將它們附加到名為“image”的窗口。
接下來我們需要創建一個軌跡欄,在矩形,圓形,直線之間進行選擇和自由行,默認值為0,最大值為3.我們將按如下方式設置值:
0:矩形
1:圓圈
2:直線
3:自由行
# Create trackbars for color change
cv2.createTrackbar(‘R’,‘image’,0,255,nothing)
cv2.createTrackbar(‘G’,‘image’,0,255,nothing)
cv2.createTrackbar(‘B’,‘image’,0,255,nothing)
# Create trackbars for drawing shapes
cv2.createTrackbar(‘Select’, ‘image’,0,3,nothing)
鼠標回調函數
我們現在可以創建一個鼠標回調函數,該函數在發生鼠標事件時執行。鼠標事件可以是與鼠標相關的任何事件:左鍵向下,左鍵向上,左鍵雙擊等。
該函數為我們提供每個坐標(x,y)鼠標事件。通過這個事件和位置,我們可以做任何我們喜歡的事情。
創建一個鼠標回調函數有一個特定的格式,在任何地方都是一樣的。它僅在功能方面有所不同。在我們的例子中,回調函數是繪制函數,它將根據第四個軌跡欄的位置繪制矩形,圓形,直線或自由線。
def draw(event,x,y,flags,param):
global ix,iy,drawing
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if s == 3:
cv2.circle(img,(x,y),5,(b, g, r),-1)
elif event == cv2.EVENT_LBUTTONUP:
if drawing == True:
if s == 0:
cv2.rectangle(img,(ix,iy),(x,y),(b, g, r),5)
elif s == 1:
cv2.circle(img,(int((ix+x)/2), int((iy+y)/2)),int(math.sqrt( ((ix-x)**2)+((iy-y)**2) )),(b, g, r),5)
elif s == 2:
cv2.line(img,(ix,iy),(x,y),(b, g, r),5)
drawing = False
cv2.setMouseCallback(‘image’,draw)
獲取軌跡欄位置
Cv2.getTrackbarPos()函數用于獲取軌跡欄的當前位置。它所采用的第一個參數是我們之前創建的軌跡欄的名稱,第二個參數是它將附加到的窗口的名稱。
# get current positions of four trackbars
r = cv2.getTrackbarPos(‘R’,‘image’)
g = cv2.getTrackbarPos(‘G’,‘image’)
b = cv2.getTrackbarPos(‘B’,‘image’)
s = cv2.getTrackbarPos(‘Select’,‘image’)
-
OpenCV
+關注
關注
32文章
642瀏覽量
42434 -
樹莓派
+關注
關注
121文章
1942瀏覽量
106982
發布評論請先 登錄
從初學到進階:樹莓派上最適合你的代碼編輯器推薦!

為LSDK構建opencv時遇到的問題求解
在樹莓派上構建和部署 Node.js 項目

如何在 Raspberry Pi AI Camera 上構建為開發人員提供實時的智能應用程序!

零基礎入門:如何在樹莓派上編寫和運行Python程序?

樹莓派云OS哪個最受歡迎?來看看Github Star 28.9k的項目!

在樹莓派上設置 DeepSeek R1:2025 年離線人工智能的未來

不要等Manus的邀請碼了,樹莓派上也能實現 AI Agent !

ANACONDA——關于發布數據應用程序的新簡單方法

評論