[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画
一、學習目標
二、了解如何通過鼠標進行圖像繪制
2.1 了解putText方法的使用
putText方法接收圖像,文字內容, 坐標 ,字體,大小,顏色,字體厚度這幾個參數,我們用中文的函數原型說明如下:
putText(圖像,文字內容, 坐標 ,字體,大小,顏色,字體厚度)我們可以首先自定義一張純黑圖片,代碼如下:
import cv2 import numpy as npimg=np.zeros((800,800,3), np.uint8)隨后定義一個字體:
font = cv2.FONT_HERSHEY_SIMPLEX以上是一個黑色簡體,并且賦值到font變量中。接著我們使用putText參數,使用putText參數傳入,代碼如下:
cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1)以上代碼使用了putText方法,傳入了img參數,為所需要繪制的圖像,第二個參數為需要顯示的內容,第三個是顯示的其實坐標為(0,300),font表示為字體,1表示為字體的大小,(255,255,255)為字體的顏色,1為字體的厚度。我們接下來查看一下顯示效果如何,完整代碼如下:
import cv2 import numpy as npimg=np.zeros((800,800,3), np.uint8) font=cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img,'Blog 1_bit @ebaina @csdn',(0,300), font,1,(255,255,255),1) cv2.imshow("Image", img) cv2.waitKey (0) cv2.destroyAllWindows()結果如下:
我們可以移動其實坐標查看繪制效果,例如改成100,300,結果如下:
更改字體大小以及更改字體厚度為2:
相比來說在圖片上繪制顏色還是比較簡單的。
我們也可以通過繪制出好看的圖片文字,例如:
這種圖片繪制起來很簡單,只需要添加一個for循環并且每次改變顏色和大小就可以完成,首先我們引入隨機庫;
隨后定義一個字體大小變量以及bgr三通道的變量值:
fsize=2 b,g,r=255,255,255接下來使用一個for循環,每次循環都改變大小以及bgr三通道值:
fsize+=0.05 b=random.uniform(0,255) g=random.uniform(0,255) r=random.uniform(0,255)所有的完整代碼如下:
import cv2 import numpy as np import randomimg=np.zeros((800,800,3), np.uint8) font=cv2.FONT_HERSHEY_SIMPLEXfsize=2 b,g,r=255,255,255 for i in range(5):fsize+=0.05b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)cv2.putText(img,'Blog 1_bit',(100,300), font,fsize,(b,g,r),2) cv2.imshow("Image", img) cv2.waitKey (0) cv2.destroyAllWindows()這樣就繪制出來了這種略帶動感的圖片,其實可以通過圖片位置的不同變化讓文字顯示的更有梯度和層次。如改變x的值,每次使這個x坐標值向右移動,大小不變,代碼如下:
xpoint=100 for i in range(5):b=random.uniform(0,255)g=random.uniform(0,255)r=random.uniform(0,255)xpoint+=1cv2.putText(img,'Blog 1_bit',(xpoint,300), font,2,(b,g,r),2)結果如下:
再或者移動x軸,同理可得,不再贅述代碼,結果如下:
這些效果都是可以移動上下左右坐標去進行位置的變換,從而達到不一樣的肉眼視覺效果。
2.2 了解setMouseCallback方法的使用
其實setMouseCallback方法就是一個鼠標的回調函數,這個函數涉及到事件這個概念。我們可以把事件理解成一種響應觸發,例如小明吃蘋果時、小麗喝奶茶時、小楊唱歌時;這些事件可以有一個對應的動作進行處理。例如小明吃蘋果時他會開心地手舞足蹈、小麗喝奶茶時會吐掉珍珠、小楊唱歌時他的舍友會說他唱的難聽,這些事件觸發了之后的響應。
setMouseCallback方法就是一個鼠標的事件回調函數。在我們在圖片上進行雙擊時,我們若想在雙擊點進行繪制一個圓形,這個時候就需要這個setMouseCallback方法。
setMouseCallback方法接收兩個參數,一個是要顯示的窗口名稱,還有一個是響應的處理函數。
首先我們創建一個窗口和一張圖片:
img=np.zeros((800,800,3), np.uint8) cv2.namedWindow('image')隨后使用setMouseCallback方法響應我們的鼠標事件:
cv2.setMouseCallback('image',draw_circle)以上傳入的第一個參數是image,表示窗口名為image,第二個參數是一個方法名,當我們鼠標進行操作后,我們需要一個函數對這個操作進行后續的響應。這個函數是需要進行創建的,我們可以創建出來,并且需要傳入指定的參數:
def draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)以上函數draw_circle中參數event會直接被setMouseCallback函數進行值的傳遞x,y,flags,param也是如此。我們先看event,event是表示你的鼠標進行了那些操作,例如event==cv2.EVENT_LBUTTONDBLCLK就表示判斷event是否進行了雙擊事件;x與y是當前事件點的鼠標x與y坐標。
在draw_circle函數中,使用if語句判斷了事件是否是雙擊事件,如果是,那么就繪制一個圓,圓中心就在雙擊的x與y坐標處。
最后使用循環以及顯示圖片顯示內容,完整代碼如下:
為什么不把setMouseCallback放到循環當中?那是因為以及指定了窗口名后就會使這個監聽生效于這個窗口之中。運行結果如下:
該系列首發于ebaina
三、總結
總結
以上是生活随笔為你收集整理的[python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [python opencv 计算机视觉
- 下一篇: [Python MoviePy 音视频开