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:层级
contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
2、cv.drawContours函数(画出轮廓)dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)
检测轮廓并画出:(用二值图检测轮廓)def GetGontours():
contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)
cv.imshow('dst', dst)
'
二、代码及效果
import cv2 as cv
def ToBinray():
global imgray, binary
imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('imgray', imgray)
ret, binary = cv.threshold(imgray, 127, 255, 0)
cv.imshow('binary', binary)
def GetGontours():
contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
dst = cv.drawContours(img, contours, -1, (0, 0, 255), 3)
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)
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)
perimeter = cv.arcLength(cnt, True)
print("轮廓周长:", perimeter)
'四、近似轮廓
1、步骤
1、获取轮廓外围
2、设置精度(从轮廓到近似轮廓的最大距离)
3、获取近似轮廓
4、绘制轮廓
2、API
epsilon = 0.03 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
3、实现
def GetApprox():
cnt = contours[0]
epsilon = 0.05 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
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():
cnt = contours[0]
x, y, w, h = cv.boundingRect(cnt)
dst = img.copy()
dst = cv.rectangle(dst, (x,y),(x+w,y+h), (0,0,255), 3)
cv.imshow("dst", dst)
'2、外接圆
def Circle():
cnt = contours[0]
(x, y), radius = cv.minEnclosingCircle(cnt)
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
imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('imgray', imgray)
ret, binary = cv.threshold(imgray, 127, 255, 0)
cv.imshow('binary', binary)
def GetContours():
global contours
contours, hierarchy = cv.findContours(binary, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
dst = img.copy()
dst = cv.drawContours(dst, contours, -1, (0, 0, 255), 3)
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)
perimeter = cv.arcLength(cnt, True)
print("轮廓周长:", perimeter)
def GetApprox():
cnt = contours[0]
epsilon = 0.01 * cv.arcLength(cnt, True)
approx = cv.approxPolyDP(cnt, epsilon, True)
dst = img.copy()
dst = cv.drawContours(dst, [approx], -1, (0, 0, 255), 3)
cv.imshow("apporx", dst)
def BoundingRect():
cnt = contours[0]
x, y, w, h = cv.boundingRect(cnt)
dst = img.copy()
dst = cv.rectangle(dst, (x,y),(x+w,y+h), (0,0,255), 3)
cv.imshow("rect", dst)
def Circle():
cnt = contours[0]
(x, y), radius = cv.minEnclosingCircle(cnt)
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实验篇:识别图片颜色并绘制轮廓
Opencv之识别图片颜色并绘制轮廓
OpenCV中的识别图片颜色并绘制轮廓
基于机器视觉的昆虫种类及计数检测研究
基于机器视觉的害虫种类及计数检测研究
OpenCV识别图片颜色并绘制轮廓
Opencv之颜色识别
基于STM32的农业病虫害检测检测系统:OpenCV、MQTT、Flask框架、MySQL(代码示例)
北京建筑高度包含的轮廓数据压缩包
python 识别某个颜色的文字的坐标
网址: OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆) https://www.huajiangbk.com/newsview1345840.html
上一篇: 榕树叶片发黄原因和处理方法 |
下一篇: 榕树写比喻句10句 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039