該應用程序將有四個軌道欄:三個將用于更改顏色(B,G,R),第四個將用于選擇在矩形,圓形,直線或自由線之間。
也可以將軌跡欄用作開關。默認情況下,OpenCV沒有按鈕功能,但我們可以將軌跡欄用作按鈕。
我們可以在這個應用程序中使用的另一個有用的功能是鼠標回調函數(shù),它將在鼠標事件發(fā)生時執(zhí)行。
我們可以使用不同的形狀使用我們的OpenCV繪圖應用程序繪制。
Python代碼
以下是用于創(chuàng)建簡單繪畫應用程序的完整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()
閱讀圖像
函數(shù) cv2.imread()用于讀取圖像,其參數(shù)是圖像的名稱。如果圖像在工作目錄中,只需寫入圖像的名稱。否則,您將必須提供圖像的完整路徑。
我們將創(chuàng)建一個窗口并將其標記為“圖像”。所有軌跡都將附加到此窗口。
img = cv2.imread(‘obama.jpg’)
cv2.namedWindow(‘image’, cv2.WINDOW_NORMAL)
創(chuàng)建軌跡欄
要創(chuàng)建軌跡欄,我們使用 cv2.createTrackbar()函數(shù),它有五個參數(shù):
軌跡欄名稱
它所附加的窗口名稱
默認值
最大值
回調函數(shù)(每次跟蹤欄值更改時執(zhí)行)
回調函數(shù)始終具有默認參數(shù),即軌跡欄位置。在我們的例子中,函數(shù)什么都不做,所以我們只是傳遞。
我們?yōu)榧t色,綠色和藍色創(chuàng)建了三個軌跡欄。每個軌跡欄的默認值為0,最大值為255,并將它們附加到名為“image”的窗口。
接下來我們需要創(chuàng)建一個軌跡欄,在矩形,圓形,直線之間進行選擇和自由行,默認值為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)
鼠標回調函數(shù)
我們現(xiàn)在可以創(chuàng)建一個鼠標回調函數(shù),該函數(shù)在發(fā)生鼠標事件時執(zhí)行。鼠標事件可以是與鼠標相關的任何事件:左鍵向下,左鍵向上,左鍵雙擊等。
該函數(shù)為我們提供每個坐標(x,y)鼠標事件。通過這個事件和位置,我們可以做任何我們喜歡的事情。
創(chuàng)建一個鼠標回調函數(shù)有一個特定的格式,在任何地方都是一樣的。它僅在功能方面有所不同。在我們的例子中,回調函數(shù)是繪制函數(shù),它將根據(jù)第四個軌跡欄的位置繪制矩形,圓形,直線或自由線。
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()函數(shù)用于獲取軌跡欄的當前位置。它所采用的第一個參數(shù)是我們之前創(chuàng)建的軌跡欄的名稱,第二個參數(shù)是它將附加到的窗口的名稱。
# 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
+關注
關注
29文章
622瀏覽量
41091 -
樹莓派
+關注
關注
116文章
1679瀏覽量
105257
發(fā)布評論請先 登錄
相關推薦
評論