opencv_python學習筆記十八

 
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)#邊界數組
相關文章
相關標籤/搜索