3 用python進(jìn)行OpenCV實(shí)戰(zhàn)之畫圖(直線括享,矩形搂根,圓形)

前言

在上一節(jié)我們通過(guò)使用NumPy的數(shù)組分割成功的在我們的圖像上畫了一個(gè)綠色的方塊,但是如果我們想畫一個(gè)單一的線條或者圓圈該怎么辦呢铃辖?NumPy沒(méi)有提供相關(guān)的功能剩愧,但是OpenCV提供了相關(guān)的函數(shù),在本節(jié)就將為大家介紹三個(gè)基本的OpenCV畫圖方法:

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

1 畫直線和矩形

在開(kāi)始我們用OpenCV畫我們的杰作之前娇斩,我們需要定義一個(gè)畫布

import numpy as np #1
import cv2 #2

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

#1-2:
關(guān)于所需包的導(dǎo)入

#3:
我們使用np.zeros()方法構(gòu)造了一個(gè)300300的NumPy數(shù)組仁卷,同時(shí)分配了三個(gè)顏色空間,分別表示Red,Green,Blue,正如zeros*名字所描述的一樣犬第,這個(gè)方法用0填充了這個(gè)數(shù)組的每一個(gè)元素锦积。在np.zeros()的第二個(gè)變量是數(shù)據(jù)類型:dtype。由于我們需要用RGB格式來(lái)表示我們的圖像歉嗓,它的取值范圍是[0,255]丰介,所以我們用“uint8”就顯得至關(guān)重要了,如果不聲明的話np.zeros()默認(rèn)的變量類型是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, 0, 255) #8
cv2.line(canvas, (300, 0), (0, 300), red, 3) #9
cv2.imshow("Canvas", canvas) #10
cv2.waitKey(0) #11

#4:
我們定義了一個(gè)元組來(lái)表示綠色

#5-7:
我們?cè)赾anvas上畫了一條綠線從坐標(biāo)(0,0)到(300,300),將結(jié)果顯示出來(lái),并等待按下任意按鍵

#8:
我們定義了一個(gè)元組來(lái)表示紅色哮幢,再次強(qiáng)調(diào)OpenCV是BGR模式而不是RGB模式

#9-11:
我們?cè)赾anvas上畫了一條紅線從坐標(biāo)(300,0)到(0,300),并且該線的線型為3個(gè)像素带膀,這也是最后一個(gè)參數(shù)的含義,然后將結(jié)果顯示出來(lái)橙垢,并等待按下任意按鍵

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), red, 5) #15
cv2.imshow("Canvas", canvas) #16
cv2.waitKey(0) #17

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

#12-14:
我們使用了cv2.rectangle()方法本砰,這個(gè)方法與cv2.line()方法用法是一樣的,第一個(gè)參數(shù)表示我們想要在canvas這個(gè)畫布上進(jìn)行畫圖钢悲,第二個(gè)參數(shù)是我們矩形的開(kāi)始點(diǎn)(10,10),第三個(gè)參數(shù)是我們矩形的結(jié)束點(diǎn)(60,60),通過(guò)這兩個(gè)點(diǎn)我們定義了一個(gè)50*50像素大小的區(qū)域舔株,第四個(gè)參數(shù)是我們矩形邊框的顏色——綠色莺琳,然后將結(jié)果顯示出來(lái),并等待按下任意按鍵载慈。

#15-17:
在第15行代碼中惭等,正如我們可以控制話直線的線型粗細(xì)程度,我們也可以控制畫矩形的線型粗細(xì)办铡,在這行代碼中最后一個(gè)參數(shù)“5”辞做,則表示我們將在canvas上畫出一個(gè)邊框粗細(xì)為5個(gè)像素大小的起點(diǎn)為(50, 200),終點(diǎn)為 (200, 225)的紅色矩形,然后將結(jié)果顯示出來(lái)寡具,并等待按下任意按鍵秤茅。

#18-21
到目前為止,我們畫的都是圖形的邊框童叠,如果我們想要填充這個(gè)邊框怎么辦呢框喳?
在第19行代碼中:

cv2.rectangle(canvas, (200, 50), (225, 125), blue, -1) #19

我們畫了一個(gè)起點(diǎn)為(200,50),終點(diǎn)為(225,125)的藍(lán)色矩形厦坛,當(dāng)我們將最后一個(gè)設(shè)置線型的參數(shù)設(shè)置為“-1”五垮,我們便可以得到一個(gè)填充藍(lán)色的矩形。

2 畫圓形

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

2.1 同心圓

canvas = np.zeros((300, 300, 3), dtype="uint8") #22
(centerX, centerY) = (canvas.shape[1] // 2, canvas.shape[0] // 2) #23
white = (255, 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:
我們重新將我們的畫板變成一個(gè)白板

#23:
我們定義并計(jì)算一個(gè)中心點(diǎn)的坐標(biāo)(centerX,centerY),在第1節(jié)和第2節(jié)我們均提到過(guò)shape[0]表示圖片的高度放仗,shape[1]表示圖片的寬度,分別取它們的一半撬碟,得到centerY,centerX

#24:
定義一個(gè)白色的像素

#25-28:
我們從[0,175)的范圍以跨度為25進(jìn)行循環(huán)來(lái)取圓的半徑诞挨,

 cv2.circle(canvas, (centerX, centerY), r, white)  #26

然后在第26行通過(guò)cv2.circle()來(lái)進(jìn)行畫圓,第一個(gè)參數(shù)表示在canvas上進(jìn)行繪畫小作,第二個(gè)參數(shù)表示圓心亭姥,第三個(gè)參數(shù)表示半徑,第四個(gè)參數(shù)表示顏色顾稀。然后將結(jié)果顯示出來(lái)达罗,并等待按下任意按鍵。

2.2 隨機(jī)圓

讓我們來(lái)讓圓多一點(diǎn)趣味:

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

#29:
通過(guò)循環(huán)表示,我們將畫25個(gè)圓

#30-32:
如果要畫圓粮揉,我們需要三個(gè)基本元素:圓的半徑巡李,圓的顏色,圓的圓心扶认。在這里我們需要通過(guò)np.random.randint使用NumPy中產(chǎn)生隨機(jī)數(shù)的能力侨拦。

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

在第30行我們?cè)赱5,200)范圍內(nèi)產(chǎn)生隨機(jī)數(shù)

color = np.random.randint(0, high=256, size=(3,)) #31

在第31行我們將在[0,256)范圍內(nèi)產(chǎn)生隨機(jī)數(shù),由于顏色值擁有3個(gè)通道值辐宾,我們通過(guò)size=(3,)讓NumPy返回一個(gè)包含三個(gè)元素的列表狱从。

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

在第32行我們將在[0,300)范圍內(nèi)產(chǎn)生隨機(jī)數(shù),我們通過(guò)size=(2,)讓NumPy返回一個(gè)包含2個(gè)元素的列表來(lái)表示圓心叠纹。

#33:

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

在第33行中季研,我們通過(guò)調(diào)用cv2.circle()方法來(lái)畫圓,第一個(gè)參數(shù)表示在canvas上畫圓誉察,第二個(gè)參數(shù)圓心坐標(biāo)需要注意必須是元組与涡,所以使用tuple來(lái)進(jìn)行強(qiáng)制轉(zhuǎn)化列表,第三個(gè)參數(shù)是半徑持偏,第四個(gè)參數(shù)表示顏色驼卖,第5個(gè)參數(shù)為“-1”,表示產(chǎn)生實(shí)心圓鸿秆。

#34-35:
將結(jié)果顯示出來(lái)酌畜,并等待按下任意按鍵。

3 完整代碼

新建drawing.py

import numpy as np
import cv2

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

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

cv2.rectangle(canvas, (10, 10), (60, 60), green)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

cv2.rectangle(canvas, (50, 200), (200, 225), red, 5)
cv2.imshow("Canvas", canvas)
cv2.waitKey(0)

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

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

for r in range(0, 175, 25):
    cv2.circle(canvas, (centerX, centerY), r, 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, high=256, size=(3,))
    
    pt = np.random.randint(0, high=300, size=(2,))

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

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

4 效果展示

畫直線和矩形

畫同心圓

畫隨機(jī)圓

轉(zhuǎn)載請(qǐng)注明出處:
CSDN:樓上小宇__home:http://blog.csdn.net/sty945
簡(jiǎn)書:樓上小宇:http://www.reibang.com/u/1621b29625df

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谬莹,一起剝皮案震驚了整個(gè)濱河市檩奠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌附帽,老刑警劉巖埠戳,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蕉扮,居然都是意外死亡整胃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門喳钟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屁使,“玉大人,你說(shuō)我怎么就攤上這事奔则÷牛” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵易茬,是天一觀的道長(zhǎng)酬蹋。 經(jīng)常有香客問(wèn)我及老,道長(zhǎng),這世上最難降的妖魔是什么范抓? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任骄恶,我火速辦了婚禮,結(jié)果婚禮上匕垫,老公的妹妹穿的比我還像新娘僧鲁。我一直安慰自己,他們只是感情好象泵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布寞秃。 她就那樣靜靜地躺著,像睡著了一般偶惠。 火紅的嫁衣襯著肌膚如雪蜕该。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天洲鸠,我揣著相機(jī)與錄音,去河邊找鬼馋缅。 笑死扒腕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的萤悴。 我是一名探鬼主播瘾腰,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼覆履!你這毒婦竟也來(lái)了蹋盆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硝全,失蹤者是張志新(化名)和其女友劉穎栖雾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟众,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡析藕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凳厢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片账胧。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖先紫,靈堂內(nèi)的尸體忽然破棺而出治泥,到底是詐尸還是另有隱情,我是刑警寧澤遮精,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布居夹,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吮播。R本人自食惡果不足惜变屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望意狠。 院中可真熱鬧粟关,春花似錦、人聲如沸环戈。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)院塞。三九已至遮晚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拦止,已是汗流浹背县遣。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汹族,地道東北人萧求。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顶瞒,于是被迫代替她去往敵國(guó)和親夸政。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容