Python Opencv 繪製圖形詳解(包含一個練習)——線/矩形/圓/多邊形/文字

                         QQ:3020889729                                                                                 小蔡

才學習opencv沒多久,本意是經驗總結、積累和回顧,望大神/大佬勿怪~
末尾有一個圖形繪製樣例——算是一個小練習吧 點擊前往

繪製線條

函數詳解

線條繪製,將用到cv2.line()——每次調用繪製一條直線:由起止座標組成

  • 參數一:圖像——你要繪製到哪個圖像上,就放入哪個圖象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,這是一張圖片/當然你打開攝像頭是也可以放入cv2.read返回的幀圖像)
  • 參數二:開始座標——爲一個二元·元組(x, y)
  • 參數三:結束座標——爲一個二元·元組(x, y)
  • 參數四:color——採用RGB,三原色值,一個三元·元組
  • 參數五:線條大小——默認爲1
  • 參數六:lineType——參數爲:cv2.LINE_AA(抗鋸齒線)----以及cv2.LINE_4和cv2.LINE_8
  • 參數七:shift ——偏移——默認爲0,可以通過調節shift值實現縮小(由於座標偏移導致的)和座標偏移

代碼實例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 創建黑色圖片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)  # 創建可調節窗體
    cv2.resizeWindow('imag', 510, 510)  # 設置初始窗體大小

    cv2.line(img, (0, 0), (510, 510), (255, 0, 0), 5)  # 畫藍色背景線

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在這裏插入圖片描述

繪製矩形

函數詳解

矩形繪製,將用到cv2.rectangle()——每次調用繪製一個矩形:由一條對角線座標組成

  • 參數一:圖像——你要繪製到哪個圖像上,就放入哪個圖象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,這是一張圖片/當然你打開攝像頭是也可以放入cv2.read返回的幀圖像)
  • 參數二:左上角的座標——爲一個二元·元組(x, y)
  • 參數三:右小角的座標——爲一個二元·元組(x, y)
  • 參數四:color——採用RGB,三原色值,一個三元·元組
  • 參數五:線條大小——默認爲1
  • 參數六:lineType——參數爲:cv2.LINE_AA(抗鋸齒線)----以及cv2.LINE_4和cv2.LINE_8
  • 參數七:shift ——偏移——默認爲0,可以通過調節shift值實現縮小(由於座標偏移導致的)和座標偏移

代碼實例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 創建黑色圖片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.rectangle(img, (215, 215), (295, 295), (0, 255, 0), 2)  # 畫綠色矩形

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在這裏插入圖片描述

繪製圓

函數詳解

圓繪製,將用到cv2.circle()——每次調用繪製一個矩形:由一條對角線座標組成

  • 參數一:圖像——你要繪製到哪個圖像上,就放入哪個圖象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,這是一張圖片/當然你打開攝像頭是也可以放入cv2.read返回的幀圖像)
  • 參數二:圓心座標——爲一個二元·元組(x, y)
  • 參數三:半徑大小
  • 參數四:color——採用RGB,三原色值,一個三元·元組
  • 參數五:線條大小——默認爲1——在繪製圖形時,如果設置爲-1,則爲圖形填充
  • 參數六:lineType——線條類型——參數爲:cv2.LINE_AA(抗鋸齒線)----以及cv2.LINE_4和cv2.LINE_8
  • 參數七:shift ——偏移——默認爲0,可以通過調節shift值實現縮小(由於座標偏移導致的)和座標偏移

代碼實例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 創建黑色圖片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.circle(img, (255, 235), 30, (0, 0, 255), -1)  # 畫紅色圓

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在這裏插入圖片描述

繪製文字

函數詳解

文字繪製,將用到cv2.putText()——每次調用繪製一個矩形:由一條對角線座標組成

  • 參數一:圖像——你要繪製到哪個圖像上,就放入哪個圖象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,這是一張圖片/當然你打開攝像頭是也可以放入cv2.read返回的幀圖像)
  • 參數二:文字內容——爲一個字符串
  • 參數三:文字繪製開始座標——爲一個二元·元組
  • 參數四:字體——由opencv中的字體確定——包含以下字體參數
  • ①cv2.FONT_HERSHEY_SIMPLEX ②cv.FONT_HERSHEY_PLAIN ③cv.FONT_HERSHEY_DUPLEX ④cv.FONT_HERSHEY_COMPLEX ⑤cv.FONT_HERSHEY_TRIPLEX ⑥cv.FONT_HERSHEY_COMPLEX_SMALL ⑦cv.FONT_HERSHEY_SCRIPT_SIMPLEX ⑧cv.FONT_HERSHEY_SCRIPT_COMPLEX ⑨cv.FONT_ITALIC
  • 參數五:字體大小
  • 參數六:color——顏色設置,RGB
  • 參數七:線條大小——默認爲1
  • 參數八:lineType——線條類型——參數爲:cv2.LINE_AA(抗鋸齒線)----以及cv2.LINE_4和cv2.LINE_8
  • 參數九:上下顛倒——默認爲False,不顛倒——輸入True爲顛倒

代碼實例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 創建黑色圖片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.putText(img, 'I LOVE', (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA)  
    # 白色文字

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在這裏插入圖片描述
將翻轉打開——
cv2.putText(img, ‘I LOVE’, (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA, True)
在這裏插入圖片描述

★★★繪製多邊形

函數詳解

多邊形繪製,將用到cv2.polylines()——每次調用繪製一個矩形:由一條對角線座標組成

  • 參數一:圖像——你要繪製到哪個圖像上,就放入哪個圖象(如:img = np.zeros((512, 512, 3), np.uint8) 中的 img,這是一張圖片/當然你打開攝像頭是也可以放入cv2.read返回的幀圖像)
  • 參數二:[頂點數組]——傳入一個array數組(後邊單獨說明如何創建!)
  • 參數三:是否閉合(首尾連接)——填入參數爲True爲首尾相連——如果是False的話就只是一條相繼連接的折線,而不是多邊形
  • 參數四:顏色color參數——RGB,元組
  • 參數五:線條大小——默認爲1
  • 參數六:lineType——線條類型——參數爲:cv2.LINE_AA(抗鋸齒線)----以及cv2.LINE_4和cv2.LINE_8
  • 參數七:shift偏移——決定偏移位置,默認爲零,無偏移——偏移會導致圖形位和大小改變

說明一下頂點數組——採用numpy科學數據處理包之一的數組包創建的一個多維數組(矩陣),並且同時規定數據類型爲numpy.int32
代碼實例如下:

  • import numpy as np pts2 = np.array([[190, 340], [325, 340], [315,370], [200, 370]], np.int32) # 頂點數組
  • 這樣就創建了5個頂點的array數組
  • 官網提示,要加一個矩陣形狀控制——pts2 = pts2.reshape((-1, 1, 2)) # 手動設置多維數組形狀
  • 形狀格式化爲:頂點數12的矩陣形狀——而傳入-1,代表全部頂點傳入
  • 然後,我們纔將這樣的數組傳入到多邊形繪製的方法中!!!

補充:多邊形/折線頂點設置規則

  • 採用逐個頂點點相連
  • 比如:假設頂點中,包含[0,0] [0,8] [8,8] [8,0]
  • 那麼它的連接方式就是:[0,0]先連接[0,8], 然後[0,8]連接 [8,8],接着 [8,8]連接 [8,0]
  • 如果你的cv2.polylines()中,參數三爲True,閉合——就會在最後實現[0,0]和 [8,0]的連接;否則繪製結束,不在連接!!!

代碼實例

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 520, 520)

    pts2 = np.array([[190, 340], [325, 340], [315, 370], [200, 370]], np.int32)  # 頂點數組
    pts2 = pts2.reshape((-1, 1, 2))  # 多維數組形狀
    cv2.polylines(img, [pts2], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用於多線繪畫——布爾型參數爲True時,返回多邊形;否則爲依次連接這些點的一條折線

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

效果:
在這裏插入圖片描述
折線形式:也就是參數三位False時
cv2.polylines(img, [pts2], False, (0, 255, 255), 2, cv2.LINE_AA)
在這裏插入圖片描述

一個小練習(放手練練吧)

設計內容

  1. 先用兩條對角線作爲背景
  2. 接着繪製一個矩形框位於窗體中心位置附近
  3. 再畫兩個實體圓位於矩形框兩邊(略微靠上一點會好看些)
  4. 上面完成了之後,我們就可以使用我們的文字繪製,將我們的文字放置在窗體中心位置左右——如果是一句話,就放在矩形下方;兩句或者多句就均勻放在矩形框上下(看你自己吧,目的是熟悉參數下的圖形繪製)
  5. 最後,我們會繪製一個多邊形,將我們的文字和矩形框包圍——多邊形形狀可以自己選擇,只要好看就好了——我這裏採用五邊形
  6. 其它補充——可以聯繫下其它小圖形的繪製,豐富圖像!!!

效果展示

略醜,請莫怪~
在這裏插入圖片描述

實現代碼如下

import cv2
import numpy as np

if __name__ == "__main__":
    img = np.zeros((512, 512, 3), np.uint8)  # 創建黑色圖片
    cv2.namedWindow('imag', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('imag', 510, 510)

    cv2.line(img, (0, 0), (510, 510), (255, 0, 0), 5)  # 畫背景線
    cv2.line(img, (0, 510), (510, 0), (255, 0, 0), 5)

    cv2.rectangle(img, (215, 215), (295, 295), (0, 255, 0), 2)  # 畫矩形
    cv2.circle(img, (195, 235), 30, (0, 0, 255), -1)  # 畫圓
    cv2.circle(img, (315, 235), 30, (0, 0, 255), -1)  # 畫圓

    pts = np.array([[260, 60], [80, 200], [100, 380], [420, 380], [440, 200]], np.int32)  # 頂點數組
    pts = pts.reshape((-1, 1, 2))  # 多維數組形狀
    cv2.polylines(img, [pts], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用於多線繪畫——布爾型參數爲True時,返回多邊形;否則爲依次連接這些點的一條折線

    pts2 = np.array([[190, 340], [325, 340], [315, 370], [200, 370]], np.int32)  # 頂點數組
    pts2 = pts2.reshape((-1, 1, 2))  # 多維數組形狀
    cv2.polylines(img, [pts2], True, (0, 255, 255), 2, cv2.LINE_AA)  # 用於多線繪畫——布爾型參數爲True時,返回多邊形;否則爲依次連接這些點的一條折線

    cv2.putText(img, 'I LOVE', (144, 190), cv2.FONT_HERSHEY_COMPLEX_SMALL, 3, (255, 255, 255), 2, cv2.LINE_AA)
    cv2.putText(img, 'OpenCV', (87, 310), cv2.FONT_HERSHEY_COMPLEX_SMALL, 4, (255, 255, 255), 2, cv2.LINE_AA)

    cv2.imshow('imag', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

小案例總結

在使用opencv繪製圖形時,和其它的GUI是一樣的,都是對座標進行處理——但是opencv的魅力在於,我們可以依託這樣的繪製在後期的人臉識別以及其它的圖像處理時,提供我們清晰的識別提示等幫助!!!
如:判別到人臉,在特徵區附近實現矩形的繪製,通過圖像反饋得出人臉檢測的反饋提示~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章