轮廓查找与绘制总结轮廓查找与绘制总结怎么写
本文分享內容來自圖書《學習OpenCV 4:基于Python的算法實戰》,該書內容如下:
第1章 OpenCV快速入門;
第2章 圖像讀寫模塊imgcodecs;
第3章 核心庫模塊core;
第4章 圖像處理模塊imgproc(一);
第5章 圖像處理模塊imgproc(二);
第6章 可視化模塊highgui;
第7章 視頻處理模塊videoio;
第8章 視頻分析模塊video;
第9章 照片處理模塊photo;
第10章 2D特征模塊features2d;
第11章 相機標定與三維重建模塊calib3d;
第12章 傳統目標檢測模塊objdetect;
第13章 機器學習模塊ml;
第14章 深度神經網絡模塊dnn
歡迎關注圖書《深度學習計算機視覺實戰》與《學習OpenCV4:基于Python的算法實戰》。
Canny邊緣檢測算法可以很好的檢測出目標的邊緣,但是沒有將這些邊緣作為一個整體進行處理。而輪廓是一系列連續的點組成的曲線,可以表達物體的基本外形,在目標識別中有著重要作用。
案例65:輪廓查找
OpenCV中提供了輪廓查找的函數findContours,該函數處理的圖像可以是Canny邊緣檢測的結果,也可以是使用閾值化得到的圖像,函數定義如下:
contours, hierarchy = findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
參數說明如下:
u image,輸入圖像,需傳入二值圖像;
u mode,輪廓查找的模式,由RetrievalModes定義(見4.1節);
u method,輪廓近似方式,由ContourApproximationModes定義(見4.1節);
u contours,檢測到的輪廓的坐標點(返回值);
u hierarchy,輪廓層次(返回值);
u offset,每個輪廓點移動的偏移量。
本案例使用的源圖像如圖5.39所示。
圖5.39
輪廓查找的案例代碼如下:
import cv2
import numpy as np
#讀取圖像,轉為灰度圖像
img = cv2.imread('contour_src.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#閾值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 尋找二值圖像的輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#打印輪廓數量
print("Contour Numbers:", len(contours))
#打印層次關系
print("hierarchy\n", hierarchy)
執行后的打印信息如下:
Contour Numbers: 4
hierarchy
[[[-1 -1 1 -1]
[-1 -1 2 0]
[-1 -1 3 1]
[-1 -1 -1 2]]]
輪廓數量為4個,包括五邊形、圓形,四邊形和整個圖像最外圍的輪廓。
hierarchy為輪廓的層次關系,每一個輪廓中的四個元素的含義對應為:[下一個輪廓索引,上一個輪廓索引,第一個子輪廓索引,父輪廓索引],如果對應的關系不存在則對應位置的值為-1。hierarchy與參數mode有關,不同的mode對應的hierarchy不同。
案例66:輪廓繪制
對于查找到的輪廓,可以使用OpenCV中提供的輪廓繪制函數drawContours進行繪制,函數定義如下:
image = drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
參數說明如下:
u image,輸入圖像,在該圖像上繪制輪廓(返回值);
u contours,查找到的輪廓;
u contourIdx,繪制的輪廓編號,全部繪制則編號為負數;
u color,繪制顏色;
u thickness,繪制線的粗細;
u lineType,繪制線的線型,由LineTypes定義(見4.1節);
u hierarchy,繪制輪廓的層次;
u maxLevel,輪廓繪制級別;
u offset,繪制輪廓偏移。
輪廓查找與輪廓繪制的完整案例代碼如下:
import cv2
import numpy as np
#讀取圖像,轉為灰度圖像
img = cv2.imread('contour_src.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#閾值化
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 尋找二值圖像的輪廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#打印輪廓數量
print("Contour Numbers:", len(contours))
#打印層次關系
print("hierarchy\n", hierarchy)
#創建白底圖像
contours_img = np.zeros(img.shape[:], dtype=np.uint8)
contours_img[:] = 255
#繪制輪廓
cv2.drawContours(contours_img, contours, -1, (0, 0, 255), 2)
cv2.imshow('contours_result', contours_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
本案例中繪制了所有的輪廓,繪制結果如圖5.40所示。
圖5.40
如果想繪制某個輪廓,則傳入對應的輪廓編號即可,本案例中包括四個輪廓,從外到內的輪廓編號分別為0,1,2,3,輪廓2的繪制的結果如圖5.41所示。
圖5.41
OpenCV中提供了輪廓面積的計算函數contourArea,函數定義如下:
retval = contourArea(contour, oriented=None)
參數說明如下:
contour,待計算面積的輪廓。
oriented,帶方向的面積標志。如果為true,函數將根據輪廓方向(順時針或逆時針)返回帶符號的面積值,這樣可以通過獲取某個面積的符號來確定輪廓的方向。默認情況下,參數為false,這意味著返回面積的絕對值;
u retval,計算的面積結果。
在輪廓繪制案例代碼的基礎上,計算面積的案例代碼如下:
area = cv2.contourArea(contours_list[1])
print("Contour 1 Area is: ", area)
計算結果輸出如下:
Contour 1 Area is: 219110.0
總結
以上是生活随笔為你收集整理的轮廓查找与绘制总结轮廓查找与绘制总结怎么写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 固定符号分列显示_MySql
- 下一篇: mysql 5.5 免安装_mysql