一、學習目標
- 了解如何在圖片中加入文字
- 了解如何使用鼠標進行圖像繪制
二、了解如何通過鼠標進行圖像繪制
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循環并且每次改變顏色和大小就可以完成,首先我們引入隨機庫;
import random
隨后定義一個字體大小變量以及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坐標處。
最后使用循環以及顯示圖片顯示內容,完整代碼如下:
import cv2
import numpy as npdef draw_circle(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDBLCLK:cv2.circle(img,(x,y),10,(255,0,0),1)img=np.zeros((800,800,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
while(1):cv2.imshow('image',img)if cv2.waitKey(20)&0xFF==27:break
cv2.destroyAllWindows()
為什么不把setMouseCallback放到循環當中?那是因為以及指定了窗口名后就會使這個監聽生效于這個窗口之中。運行結果如下:
該系列首發于ebaina
三、總結
- 了解在圖片中加入文字使用putText方法,并且可以通過位移或者改變大小、顏色增加字體的觀感效果
- 了解使用鼠標進行圖像繪制使用setMouseCallback方法,并且了解了事件是什么