21 opencv的輪廓
經常使用函數:
def findContours(image, #二值單通道圖像
mode, #輪廓的檢測方式
method, #輪廓的近似辦法
contours=None, #要繪製的邊緣數組
hierarchy=None, #輪廓個數
offset=None)#輪廓點的偏移量
Mode的檢測模式有:
Cv2.RETR_EXTERNAL #獲得最外面的輪廓
CV_RETR_LIST
CV_RETR_TREE
method輪廓的近似方法
CV_CHAIN_APPROX_NONE #全部邊界點都會被存儲
CV_CHAIN_APPROX_SIMPLE# 會去掉輪廓上的冗餘點
CV_CHAIN_APPROX_TC89_L1
CV_CHAIN_APPROX_TC89_KCOS
def drawContours(image, #目標圖像
contours, #要繪製的邊緣數組
contourIdx, #須要繪製的邊緣索引
color, #繪製的顏色
thickness=None, #畫筆寬度
lineType=None, #連線類型
hierarchy=None, #用於傳入層級關係
maxLevel=None, #層級中的最大級別
offset=None)#每一個輪廓點的偏移量
1 繪製輪廓
示例代碼以下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2016/11/22 8:38 # @Author : Retacn # @Site : 圖像輪廓 # @File : imageContuor.py # @Software: PyCharm import cv2
import numpy as np
from matplotlib import pyplot as plt
# 讀入圖像 img = cv2.imread('../test.jpg')
img2=cv2.imread('../test1.jpg')
temp_img = img.copy()
# 變爲灰度圖像 imggray = cv2.cvtColor(temp_img, cv2.COLOR_BGR2GRAY)
# 設定閾值 ret, thresh = cv2.threshold(imggray, 127, 255, 0)
# 查找輪廓 image, contours, hierarchy = cv2.findContours(thresh,#二值單通道圖像 cv2.RETR_TREE,#輪廓的檢測方法 cv2.CHAIN_APPROX_SIMPLE)#輪廓的近似方法 # 繪製輪廓 image_re = cv2.drawContours(img2,#目標圖像 contours,#邊緣數組 263,#要繪製的輪廓的索引 (0, 255, 0),#顏色 3)#畫筆寬度 # 源圖像 plt.subplot(131), plt.imshow(img, 'gray')
plt.title("Original"), plt.xticks([]), plt.yticks([])
# 查詢完後圖像 plt.subplot(132), plt.imshow(image, 'gray')
plt.title("Image"), plt.xticks([]), plt.yticks([])
# 繪製輪廓 plt.subplot(133), plt.imshow(image_re, 'gray')
plt.title("Image_re"), plt.xticks([]), plt.yticks([])
plt.show()
2 輪廓特徵
查詢輪廓的不一樣特徵 面積 周長 重心 邊界
矩
def moments(array,#二維點列
binaryImage=None)#若是是true全部非零值像素置1
示例代碼以下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2016/11/22 10:15 # @Author : Retacn # @Site : 輪廓特徵 # @File : contuorFeature.py # @Software: PyCharm import cv2
import numpy as np
from matplotlib import pyplot as plt
#讀入圖像 img=cv2.imread('../test.jpg')
temp_img = img.copy()
# 變爲灰度圖像 imggray = cv2.cvtColor(temp_img, cv2.COLOR_BGR2GRAY)
# 設定閾值 ret, thresh = cv2.threshold(imggray, 127, 255, 0)
# 查找輪廓 image, contours, hierarchy = cv2.findContours(thresh,#二值單通道圖像 cv2.RETR_TREE,#輪廓的檢測方法 cv2.CHAIN_APPROX_SIMPLE)#輪廓的近似方法 contour=contours[0]
M=cv2.moments(contour)
print(M)
#輸出結果: #{'m11': 821515965.3333333, #空間矩形
'nu11': -2.035886991415788e-05,
'mu12': -2124606.8292655945,
'm30': 259471192096.6,
'nu12': -2.7573417567631675e-06,#中心歸一化矩
'm12': 119381836048.86667,
'mu11': -65793.66022455692, #中心矩形
'nu20': 0.10060818323074136,
'nu02': 0.06901872613271595,
'm10': 7503469.333333333,
'mu21': -2677871.7602539062,
'm20': 1315531329.0,
'm21': 144022195380.86667,
'nu30': 2.0259690085904074e-06,
'nu21': -3.475376018798413e-06,
'mu20': 325134973.16912174,
'm01': 6224491.333333333,
'm03': 147891998777.6,
'm02': 904589351.6666666,
'm00': 56848.0,
'mu03': 731122.353302002,
'nu03': 9.488598861180405e-07,
'mu02': 223047479.327415,
'mu30': 1561064.2318725586}
計算對象的重心
Cx=int(M[‘m10’]/M[‘m00’])
Cy=int(M[‘m01’]/M[‘m00’])
輪廓面積
def contourArea(contour,#二維點集
oriented=None)#面向區域標誌,ture有向面積值
False是絕對值
示例代碼以下:
#輪廓的面積 area=cv2.contourArea(contour)
print("輪廓面積:",area)
#輸出結果: 56848.0
輪廓周長
def arcLength(curve, #圖像輪廓
closed)#指定對像形狀是閉合的
#輪廓周長 perimeter=cv2.arcLength(contour,True)
print("輪廓周長:",perimeter)
#輸入結果爲:963.3137083053589
#輪廓近似
def approxPolyDP(curve, #輸入的點集
epsilon, #指定的精度
closed, #true爲閉合
approxCurve=None)#輸出的點集
示例代碼以下:
# 繪製輪廓 image_re = cv2.drawContours(temp_img,#目標圖像 contours,#邊緣數組 3,#要繪製的輪廓的索引 (0, 255, 0),#顏色 3)#畫筆寬度
示例代碼爲:
# 輪廓的近似 epsilon = 0.1 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
print('輪廓近似',approx)
#輸出結果: #[[[ 1 1]] #[[ 1 218]] #[[263 218]] #[[263 1]]]
#凸包
def convexHull(points, #要求凸包的焦點
hull=None, #輸出的凸點包
clockwise=None, #順時針仍是逆時針方向
returnPoints=None)#函數的輸出類型
True 返加凸包點上的座標
False 凸包點對應的輪廓的點
示例代碼爲:#凸包 hull=cv2.convexHull(contour)
print('凸包',hull)
#輸出結果爲:矩形的四個角 #[[[263 218]] #[[ 1 218]] #[[ 1 1]] #[[263 1]]]
#凸性檢測,返回布爾值
def isContourConvex(contour)#
示例代碼以下:
#凸性檢測,返回布爾值 k=cv2.isContourConvex(contour)
print('是否凸性',k)
邊界矩形
直邊界矩形
def boundingRect(points)#邊界數組
def rectangle(img, #源圖像
pt1, #對角線上的兩個頂點
pt2, #
color,# 線條的顏色
thickness=None, #線條的寬度
lineType=None, #線條的類型
shift=None)#座標點的小數點位數
旋轉邊界矩形
def minAreaRect(points)#邊界數組