1. 程式人生 > 程式設計 >python進行OpenCV實戰之畫圖(直線、矩形、圓形)

python進行OpenCV實戰之畫圖(直線、矩形、圓形)

前言

在上一節我們通過使用NumPy的陣列分割成功的在我們的影象上畫了一個綠色的方塊,但是如果我們想畫一個單一的線條或者圓圈該怎麼辦呢?NumPy沒有提供相關的功能,但是OpenCV提供了相關的函式,在本節就將為大家介紹三個基本的OpenCV畫圖方法:

cv2.line() #1
cv2.rectangle() #2
cv2.circle() #3

1 畫直線和矩形

在開始我們用OpenCV畫我們的傑作之前,我們需要定義一個畫布

import numpy as np #1
import cv2 #2

canvas = np.zeros((300,300,3),dtype="uint8") #3

#1-2:

關於所需包的匯入

#3:

我們使用np.zeros()方法構造了一個300*300的NumPy陣列,同時分配了三個顏色空間,分別表示Red,Green,Blue,正如zeros名字所描述的一樣,這個方法用0填充了這個陣列的每一個元素。在np.zeros()的第二個變數是資料型別:dtype。由於我們需要用RGB格式來表示我們的影象,它的取值範圍是[0,255],所以我們用“uint8”就顯得至關重要了,如果不宣告的話np.zeros()預設的變數型別是float64.

1.1 畫直線

green = (0,255,0) #4
cv2.line(canvas,(0,0),(300,300),green) #5
cv2.imshow("Canvas",canvas) #6
cv2.waitKey(0) #7

red = (0,255) #8
cv2.line(canvas,red,3) #9
cv2.imshow("Canvas",canvas) #10
cv2.waitKey(0) #11

#4:

我們定義了一個元組來表示綠色

#5-7:

我們在canvas上畫了一條綠線從座標(0,0)到(300,將結果顯示出來,並等待按下任意按鍵

#8:

我們定義了一個元組來表示紅色,再次強調OpenCV是BGR模式而不是RGB模式

#9-11:

我們在canvas上畫了一條紅線從座標(300,0)到(0,並且該線的線型為3個畫素,這也是最後一個引數的含義,然後將結果顯示出來,並等待按下任意按鍵

1.2 畫矩形

cv2.rectangle(canvas,(10,10),(60,60),green) #12
cv2.imshow("Canvas",canvas) #13
cv2.waitKey(0) #14

cv2.rectangle(canvas,(50,200),(200,225),5) #15
cv2.imshow("Canvas",canvas) #16
cv2.waitKey(0) #17

blue = (255,0) #18
cv2.rectangle(canvas,50),(225,125),blue,-1) #19
cv2.imshow("Canvas",canvas) #20
cv2.waitKey(0) #21

#12-14:

我們使用了cv2.rectangle()方法,這個方法與cv2.line()方法用法是一樣的,第一個引數表示我們想要在canvas這個畫布上進行畫圖,第二個引數是我們矩形的開始點(10,10),第三個引數是我們矩形的結束點(60,通過這兩個點我們定義了一個50*50畫素大小的區域,第四個引數是我們矩形邊框的顏色——綠色,然後將結果顯示出來,並等待按下任意按鍵。

#15-17:

在第15行程式碼中,正如我們可以控制話直線的線型粗細程度,我們也可以控制畫矩形的線型粗細,在這行程式碼中最後一個引數“5”,則表示我們將在canvas上畫出一個邊框粗細為5個畫素大小的起點為(50,終點為 (200,225)的紅色矩形,然後將結果顯示出來,並等待按下任意按鍵。

#18-21

到目前為止,我們畫的都是圖形的邊框,如果我們想要填充這個邊框怎麼辦呢?
在第19行程式碼中:

cv2.rectangle(canvas,-1) #19

我們畫了一個起點為(200,50),終點為(225,125)的藍色矩形,當我們將最後一個設定線型的引數設定為“-1”,我們便可以得到一個填充藍色的矩形。

2 畫圓形

畫圓形和畫直線和矩形是一樣容易的,但是它有有一些不同:

2.1 同心圓

canvas = np.zeros((300,dtype="uint8") #22
(centerX,centerY) = (canvas.shape[1] // 2,canvas.shape[0] // 2) #23
white = (255,255) #24

for r in range(0,175,25): #25
 cv2.circle(canvas,(centerX,centerY),r,white) #26

cv2.imshow("Canvas",canvas) #27
cv2.waitKey(0) #28

for i in range(0,25): #29
 radius = np.random.randint(5,high=200) #30
 color = np.random.randint(0,high=256,size=(3,)) #31

 pt = np.random.randint(0,high=300,size=(2,)) #32

 cv2.circle(canvas,tuple(pt),radius,color,1) #33

cv2.imshow("Canvas",canvas) #34
cv2.waitKey(0) #35

#22:

我們重新將我們的畫板變成一個白板

#23:

我們定義並計算一箇中心點的座標(centerX,centerY),在第1節和第2節我們均提到過shape[0]表示圖片的高度,shape[1]表示圖片的寬度,分別取它們的一半,得到centerY,centerX

#24:

定義一個白色的畫素

#25-28:

我們從[0,175)的範圍以跨度為25進行迴圈來取圓的半徑,

cv2.circle(canvas,white) #26

然後在第26行通過cv2.circle()來進行畫圓,第一個引數表示在canvas上進行繪畫,第二個引數表示圓心,第三個引數表示半徑,第四個引數表示顏色。然後將結果顯示出來,並等待按下任意按鍵。

2.2 隨機圓

讓我們來讓圓多一點趣味:

for i in range(0,-1) #33

cv2.imshow("Canvas",canvas) #34
cv2.waitKey(0) #35

#29:

通過迴圈表示,我們將畫25個圓

#30-32:

如果要畫圓,我們需要三個基本元素:圓的半徑,圓的顏色,圓的圓心。在這裡我們需要通過np.random.randint使用NumPy中產生隨機數的能力。

radius = np.random.randint(5,high=200) #30

在第30行我們在[5,200)範圍內產生隨機數

color = np.random.randint(0,)) #31

在第31行我們將在[0,256)範圍內產生隨機數,由於顏色值擁有3個通道值,我們通過size=(3,)讓NumPy返回一個包含三個元素的列表。

pt = np.random.randint(0,)) #32

在第32行我們將在[0,300)範圍內產生隨機數,我們通過size=(2,)讓NumPy返回一個包含2個元素的列表來表示圓心。

#33:

cv2.circle(canvas,-1) #33

在第33行中,我們通過呼叫cv2.circle()方法來畫圓,第一個引數表示在canvas上畫圓,第二個引數圓心座標需要注意必須是元組,所以使用tuple來進行強制轉化列表,第三個引數是半徑,第四個引數表示顏色,第5個引數為“-1”,表示產生實心圓。

#34-35:
將結果顯示出來,並等待按下任意按鍵。

3 完整程式碼

新建drawing.py

import numpy as np
import cv2

canvas = np.zeros((300,dtype="uint8")
green = (0,0)
cv2.line(canvas,green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

red = (0,255)
cv2.line(canvas,3)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

cv2.rectangle(canvas,5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

blue = (255,0)
cv2.rectangle(canvas,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

canvas = np.zeros((300,dtype="uint8")
(centerX,canvas.shape[0] // 2)
white = (255,255)

for r in range(0,25):
 cv2.circle(canvas,white)

cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

for i in range(0,25):
 radius = np.random.randint(5,high=200)
 color = np.random.randint(0,))

 pt = np.random.randint(0,))

 cv2.circle(canvas,-1)

cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

4 效果展示

python進行OpenCV實戰之畫圖(直線、矩形、圓形)

python進行OpenCV實戰之畫圖(直線、矩形、圓形)

python進行OpenCV實戰之畫圖(直線、矩形、圓形)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。