首页 分享 OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆)

OpenCV(25)轮廓检测(轮廓提取、属性、近似轮廓、外接矩形和外接圆)

来源:花匠小妙招 时间:2024-12-28 20:28

目录

一、轮廓检测基础理论

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句

推荐分享