1. 程式人生 > >3 用python進行OpenCV實戰之畫圖(直線,矩形,圓形)

3 用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, 0, 255) #8 cv2.line(canvas, (300, 0), (0, 300), red, 3) #9 cv2.imshow("Canvas", canvas) #10 cv2.waitKey(0) #11

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

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

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

#9-11:


我們在canvas上畫了一條紅線從座標(300,0)到(0,300),並且該線的線型為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), 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()方法,這個方法與cv2.line()方法用法是一樣的,第一個引數表示我們想要在canvas這個畫布上進行畫圖,第二個引數是我們矩形的開始點(10,10),第三個引數是我們矩形的結束點(60,60),通過這兩個點我們定義了一個50*50畫素大小的區域,第四個引數是我們矩形邊框的顏色——綠色,然後將結果顯示出來,並等待按下任意按鍵。

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

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

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

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

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:
我們重新將我們的畫板變成一個白板

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

#24:
定義一個白色的畫素

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

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

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

2.2 隨機圓

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

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:
通過迴圈表示,我們將畫25個圓

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

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

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

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

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

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

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

#33:

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

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

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

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 效果展示

畫直線和矩形
畫同心圓
畫隨機圓

相關推薦

3 python進行OpenCV實戰畫圖直線矩形圓形

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

4 python進行OpenCV實戰影象變換1平移

前言 到目前為止,經過前幾節的介紹,我們已經有了一個堅實的基礎去做一些影象處理,在本節我們先將介紹影象變換中的平移,為後面幾節學習影象變換中的旋轉、改變大小、映象、裁剪打下一個好的基礎 1 平移 1.1 平移基本操作 新建 translatio

2 python進行OpenCV實戰影象基本知識

前言 在這一節,我們將學習影象的基本構成單元——畫素,我們將詳細的探討什麼是畫素?畫素是如何使用來構成影象的?然後學習如何通過OpenCV來獲取和操縱畫素。 1 什麼是畫素 所有的影象都包含一組畫素,畫素是影象的原始構建塊。 沒有比畫素更細的單位了。

5 python進行OpenCV實戰影象變換2旋轉

前言 最近有些其他事情,一週未更新了,實在抱歉。以後爭取,每週多更新幾次。雖然也不知道能有多少人看到,但是也算自己的一種堅持吧! 1 旋轉 1.1 旋轉基本操作 旋轉的概念正如我們平常聽見的一樣:將圖片選裝x度。我們先通過多少度來旋轉圖片,然後我們將

linux下python進行opencv開發----簡單的圖片操作

初學opencv做的例子程式,儲存一下。 之所以選擇用python,是因為python上手快,開發快。 #!/usr/bin/python2 # coding: utf-8 import cv2 import numpy as np #原始圖片 image = cv

Python做資料分析Numpy

基礎索引和切片 numpy陣列索引是一個豐富的主題,有時候給你一個數組,可能你只想對其中一部分或者個別元素進行操作,這個時候就該索引出場了。 一維陣列十分簡單,表面上與Python list是一樣的。如下: In [60]: arr = np.arange(10) In [61]: ar

手把手從無到有帶你vue進行專案實戰 系列二(cdn、gzip效能加速篇

相關連結: 一、前言 在系列一中桃子叔叔介紹了使用iview-cli構建專案框架並基於框架進行的相關改造,主要包括: 路徑規範 dev-server配置 啟用熱更新 封裝axios 解決跨域 二、問題 經過以上的改造,已經能夠滿足基本生產開發的需求了

我的python中級班學習全程筆記第一模塊 第二章第2部分

一個 文件操作 模塊 生成 字符串 講解 mar style 定義 第二章 數據類型 字符編碼 文件操作 第二部分 第三節 :數據類型—字符串講解 一、定義: 字符串是一個有序的字符的字符

Python廖雪峰實戰web開發Day12-編寫日誌列表頁

編寫一個日誌列表頁,想想我們期待它是怎樣的,有什麼樣的功能。 其實也無非諸如點進,刪除,修改日誌,把資料庫的日誌按照格式顯示在網頁面上,比方說一個網頁面設定顯示十篇日誌,當資料庫不足20篇日誌有超過1

python進行簡單的畫圖操作

line 51cto imp spin osi style data gen ott 我用python的matplotlib模塊進行簡單的畫圖操作,作為入門參考,下面直接上代碼:#coding:utf-8 import numpy as np import matplotl

機器學習Python進行邏輯迴歸分析

前言 迴歸和分類方法是機器學習中經常用到的方法,本文首先介紹這兩種方法的區別和聯絡,然後對分類方法中的邏輯迴歸進行較詳細的說明(包括其基本原理及評估指標),最後結合案例介紹如何利用Python進行邏輯迴歸分析。 一、分類與迴歸 1.1什麼是分類和迴歸 區分迴歸問題

3-4 Python 進行資料庫連線與資料查詢版本:py3

PyMySQL 1.安裝PyMySQL包 pip install PyMySQL #推薦使用conda 來安裝 conda install PyMySQL 2.補充閱讀 請閱讀官方文件中Documentation的User Guide部分,熟悉一個包最直接方法就是

Python進行網頁抓取

google 神奇 顯示 rss 遍歷 ecb data- 可用 appdata 引言   從網頁中提取信息的需求日益劇增,其重要性也越來越明顯。每隔幾周,我自己就想要到網頁上提取一些信息。比如上周我們考慮建立一個有關各種數據科學在線課程的歡迎程度和意見的索引。我們不僅需要

小記 python進行排序

排序Linux 中可以使用 sort 進行排序,python中也一樣,那麽怎樣實現把一個數字的 list 從小到大排序,然後寫入文件,然後從文件中讀取出來文件內容,然後反序,再追加到文件的下一行中呢?思路如下:1、取一個列表內容2、對列表內容使用 sort 進行排序,並打印出結果3、打開一個文件,將正序排列後

Python進行數據分析-1

優化 離散概率 采樣 可變對象 測量 pca -o 維表 session 第一章 準備工作 1.3 重要的python數據庫 Numpy:是python科學計算的基礎包,本書大部分內容都基於numpy以及構建於其上的庫功能如下: -快速高效的多維數組對象ndarray。 -

python進行服務器的監控

網絡協議 硬盤信息 以及 4.0 簡單 frs 偽文件系統 apache star 用python進行服務器的監控 在linux服務器中,一切皆為文件,就是說,服務器運行的個中信息,其實是可以從某些文件中查詢得到的;百度後,你會知道,在Linux系統中,有一個/proc的虛

Python進行數據分析-2

gpo div range 局部變量 blog local 數據分析 可選參數 function 函數 -如果你要重復使用相同的或者非常相似的功能,就寫一個函數。 -函數使用def關鍵字聲明,用return關鍵字返回值 def my_function(x, y, z=1.5

python進行微信公眾號開發僅測試學習

python 微信公眾號 api開發今天看到篇教程,是用python開發微信公眾號的,覺得有意思,就敲代碼實現了一下,成功後更覺得好玩,故記錄,方便開發深入時使用。 基礎背景介紹: 首先得有個人微信號(沒有自行註冊),為方便測試學習; 其次,還要註冊微信公眾號,微信公眾號不止一種,是分多種的,具體詳情見官方

我的python中級班學習全程筆記第一模組 第二章3部分

第二章                       資料型別    字元編碼    檔案操作 第三部分  第六節 :資料型別—元祖型別

Python小白學習十三—【遞歸調

結束 style mon port 特性 小白 好的 就是 實例 一、遞歸調用定義 在函數內部,可以調用其他函數。 如果在調用一個函數的過程中直接或間接調用自身本身,則稱為遞歸調用 從某種意義上來說,遞歸調用可以實現無限循環 二、遞歸調用的特性 必須有一個明確的結束條件