OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆)
生活随笔
收集整理的這篇文章主要介紹了
OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
目錄
一、輪廓檢測基礎理論
1、輪廓概述
2、API介紹
1、cv.findContours函數(查找輪廓)
2、cv.drawContours函數(畫出輪廓)
檢測輪廓并畫出:(用二值圖檢測輪廓)
二、代碼及效果
三、輪廓檢測的屬性
1、畫出單個輪廓
2、顯示面積和周長
代碼及效果
四、近似輪廓
1、步驟
2、API
3、實現
各精度的近似輪廓:?
五、邊界矩形和外接圓
1、邊界矩形?
2、外接圓
總代碼
參考資料
一、輪廓檢測基礎理論
1、輪廓概述
邊緣和輪廓區別:邊緣是零散的點,輪廓是整體。
在二值圖中找輪廓。
2、API介紹
1、cv.findContours函數(查找輪廓)
contours, hierarchy = cv2.findContours(img,mode,method)參數:?
?返回:
contours:輪廓
hierarchy:層級
# 1、根據二值圖找到輪廓contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)# 輪廓 層級 輪廓檢索模式(推薦此) 輪廓逼近方法
2、cv.drawContours函數(畫出輪廓)
# 2、畫出輪廓dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)# 輪廓 第幾個(默認-1:所有) 顏色 線條厚度
檢測輪廓并畫出:(用二值圖檢測輪廓)
# 提取輪廓
def GetGontours():# 1、根據二值圖找到輪廓contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)# 輪廓 層級 輪廓檢索模式(推薦此) 輪廓逼近方法# 2、畫出輪廓dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)# 輪廓 第幾個(默認-1:所有) 顏色 線條厚度cv.imshow('dst', dst)
二、代碼及效果
# 輪廓提取
import cv2 as cv# 轉二進制圖像
def ToBinray():global imgray, binary# 1、灰度圖imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv.imshow('imgray', imgray)# 2、二進制圖像ret, binary = cv.threshold(imgray, 127, 255, 0)# 閾值 二進制圖像cv.imshow('binary', binary)# 提取輪廓
def GetGontours():# 1、根據二值圖找到輪廓contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)# 輪廓 層級 輪廓檢索模式(推薦此) 輪廓逼近方法# 2、畫出輪廓dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)# 輪廓 第幾個(默認-1:所有) 顏色 線條厚度cv.imshow('dst', dst)if __name__ == '__main__':img = cv.imread('Resource/test11.jpg')cv.imshow('img', img)ToBinray() #轉二進制GetGontours() #提取輪廓cv.waitKey(0)
三、輪廓檢測的屬性
1、畫出單個輪廓
# 畫出第一個輪廓cnt = contours[0]dst = cv.drawContours(img, cnt, -1, (0, 0, 255), 3)cv.imshow('dst1', dst)
?
2、顯示面積和周長
# 獲取輪廓面積area = cv.contourArea(cnt)print("輪廓面積:", area)# 周長(True表示合并)perimeter = cv.arcLength(cnt, True)print("輪廓周長:", perimeter)
代碼及效果
# 獲取輪廓信息
def GetContours_Attrib():# 畫出第一個輪廓cnt = contours[0]dst = cv.drawContours(img, cnt, -1, (0, 0, 255), 3)cv.imshow('dst1', dst)# 獲取輪廓面積area = cv.contourArea(cnt)print("輪廓面積:", area)# 周長(True表示合并)perimeter = cv.arcLength(cnt, True)print("輪廓周長:", perimeter)
四、近似輪廓
1、步驟
1、獲取輪廓外圍
2、設置精度(從輪廓到近似輪廓的最大距離)
3、獲取近似輪廓
4、繪制輪廓
2、API
# 2、設置精度(從輪廓到近似輪廓的最大距離)epsilon = 0.03 * cv.arcLength(cnt, True)# 輪廓 閉合輪廓還是曲線
# 3、獲取近似輪廓approx = cv.approxPolyDP(cnt, epsilon, True)# 近似度(這里為10%) 閉合輪廓還是曲線
3、實現
# 輪廓近似
def GetApprox():# 1、取外圍輪廓cnt = contours[0]# 2、設置精度(從輪廓到近似輪廓的最大距離)epsilon = 0.05 * cv.arcLength(cnt, True)# 輪廓 閉合輪廓還是曲線# 3、獲取近似輪廓approx = cv.approxPolyDP(cnt, epsilon, True)# 近似度(這里為5%) 閉合輪廓還是曲線# 4、繪制輪廓draw_img = img.copy()res = cv.drawContours(draw_img, [approx], -1, (0, 0, 255), 3)# 顯示cv.imshow("res", res)
各精度的近似輪廓:?
精度epsilon=0.01時的近似輪廓:?
精度epsilon=0.02時的近似輪廓:
精度epsilon=0.03時的近似輪廓:
精度epsilon=0.04時的近似輪廓:
?精度epsilon=0.05時的近似輪廓:
五、邊界矩形和外接圓
邊界矩形:根據坐標、長寬繪制矩形。
外接圓:根據圓心坐標、半徑繪制圓。
1、邊界矩形?
# 獲取邊界矩形
def BoundingRect():# 1、取外圍輪廓cnt = contours[0]# 2、獲取正方形坐標長寬x, y, w, h = cv.boundingRect(cnt)# 3、畫出矩形dst = img.copy()dst = cv.rectangle(dst, (x,y),(x+w,y+h), (0,0,255), 3)# 顯示cv.imshow("dst", dst)
2、外接圓
# 獲取外接圓
def Circle():# 1、獲取第一個輪廓cnt = contours[0]# 2、獲取外接圓(x, y), radius = cv.minEnclosingCircle(cnt)# 坐標 半徑# 3、畫圓dst = img.copy()dst = cv.circle(dst, (int(x), int(y)), int(radius), (0, 0, 255), 3)# 顯示cv.imshow("dst", dst)
總代碼
# 輪廓提取、屬性、近似輪廓、邊界矩形和外接圓
import cv2 as cv# 轉二進制圖像
def ToBinray():global imgray, binary# 1、灰度圖imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv.imshow('imgray', imgray)# 2、二進制圖像ret, binary = cv.threshold(imgray, 127, 255, 0)# 閾值 二進制圖像cv.imshow('binary', binary)# 提取輪廓
def GetContours():global contours# 1、根據二值圖找到輪廓contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)# 輪廓 層級 輪廓檢索模式(推薦此) 輪廓逼近方法# 2、畫出輪廓dst = img.copy()dst = cv.drawContours(dst, contours, -1, (0, 0, 255), 3)# 輪廓 第幾個(默認-1:所有) 顏色 線條厚度cv.imshow('contours', dst)# 獲取輪廓信息
def GetContours_Attrib():# 畫出第一個輪廓cnt = contours[0]dst = img.copy()dst = cv.drawContours(dst, cnt, -1, (0, 0, 255), 3)cv.imshow('contour0', dst)# 獲取輪廓面積area = cv.contourArea(cnt)print("輪廓面積:", area)# 周長(True表示合并)perimeter = cv.arcLength(cnt, True)print("輪廓周長:", perimeter)# 輪廓近似
def GetApprox():# 1、取外圍輪廓cnt = contours[0]# 2、設置精度(從輪廓到近似輪廓的最大距離)epsilon = 0.01 * cv.arcLength(cnt, True)# 輪廓 閉合輪廓還是曲線# 3、獲取近似輪廓approx = cv.approxPolyDP(cnt, epsilon, True)# 近似度(這里為5%) 閉合輪廓還是曲線# 4、繪制輪廓dst = img.copy()dst = cv.drawContours(dst, [approx], -1, (0, 0, 255), 3)# 顯示cv.imshow("apporx", dst)# 獲取邊界矩形
def BoundingRect():# 1、取外圍輪廓cnt = contours[0]# 2、獲取正方形坐標長寬x, y, w, h = cv.boundingRect(cnt)# 3、畫出矩形dst = img.copy()dst = cv.rectangle(dst, (x,y),(x+w,y+h), (0,0,255), 3)# 顯示cv.imshow("rect", dst)# 獲取外接圓
def Circle():# 1、獲取第一個輪廓cnt = contours[0]# 2、獲取外接圓(x, y), radius = cv.minEnclosingCircle(cnt)# 坐標 半徑# 3、畫圓dst = img.copy()dst = cv.circle(dst, (int(x), int(y)), int(radius), (0, 0, 255), 3)# 顯示cv.imshow("circle", dst)if __name__ == '__main__':img = cv.imread('Resource/contour.jpg')cv.imshow('img', img)ToBinray() #轉二進制GetContours() #提取輪廓GetContours_Attrib() #獲取輪廓信息GetApprox() #輪廓近似BoundingRect() #邊界矩形Circle() #外接圓cv.waitKey(0)
參考資料
https://www.bilibili.com/video/BV1PV411774y?p=25
http://woshicver.com/FifthSection/4_9_2_%E8%BD%AE%E5%BB%93%E7%89%B9%E5%BE%81/
總結
以上是生活随笔為你收集整理的OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV(24)角点检测3 -- O
- 下一篇: OpenCV(26)图像分割 -- 距离