python-opencv轮廓检测(外轮廓检测和全部轮廓检测,计算轮廓面积和周长)

python-opencv轮廓检测(外轮廓检测和全部轮廓检测,计算轮廓面积和周长)

通过cv2.findContours,我们可以进行轮廓检测,当然也有很多检测模式,我们可以通过选择检测模式,进行外轮廓检测,或者全部轮廓检测等等,可以实现不同的需求。

另外opencv也封装了计算轮廓面积和周长的函数,注意,轮廓基本上都是点组成的,也就是说,我们可以通过opencv封装的函数计算一堆点集的周长和面积。

print(cv2.contourArea(cnt))#输出面接

print(cv2.arcLength(cnt,True))#True闭合的周长,输出周长

cnt为轮廓点集,这个函数,以后博主觉得是有很大实用效果的。

代码如下:

python 复制代码
from ctypes.wintypes import SIZE
from multiprocessing.pool import IMapUnorderedIterator
import cv2
import copy
import math
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import os

path=r'D:\learn\photo\cv\contours.png'

img=cv2.imread(path,1)

img_gray=cv2.imread(path,0)



def cv_show(name,img):
    cv2.imshow(name,img)
    #cv2.waitKey(0),接收0,表示窗口暂停
    cv2.waitKey(0)
    #销毁所有窗口
    cv2.destroyAllWindows()


#cv_show('img_gray',img_gray)



#进行二值化处理
ret,binary=cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)


#cv_show('dist',dist)

def BGR_TO_RGB(img):
    return img[:,:, ::-1]
#检测轮廓

#取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略


#           取值二:CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关

#                  系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓,

#                  所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到


#           取值三:CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围

#                  内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层


#           取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内

#                   层轮廓还可以继续包含内嵌轮廓。

#countourClose 轮廓坐标信息
#hierrachyclose 轮廓之间的层次结构


   
countourClose,hierrachyclose=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)


result2=cv2.drawContours(img.copy(),countourClose,-1,(0,0,255),2)

#CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围

#                  内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层
   
countourClose,hierrachyclose=cv2.findContours(binary,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)


result3=cv2.drawContours(img.copy(),countourClose,-1,(0,0,255),2)


countourClose,hierrachyclose=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

result=cv2.drawContours(img.copy(),countourClose,-1,(0,0,255),2)

print("len(countourclose) is",len(countourClose))

    #

plt.figure(figsize=(400,600))




print(img_gray.shape)
print(img_gray[0][0])
plt.subplot(221)
#img_gray=BGR_TO_RGB(img_gray,'gray')
plt.imshow(img_gray,'gray')
plt.title('img_gray')


plt.subplot(222)

plt.imshow(result,'gray')

plt.title('RETR_TREE')

plt.subplot(223)

plt.imshow(result2,'gray')

plt.title('RETR_EXTERNAL')
plt.subplot(224)

plt.imshow(result3,'gray')

plt.title('RETR_CCOMP')
plt.show()

#输出面接和周长


for  i in range(len(countourClose)):
     cnt=countourClose[i]
     print(cv2.contourArea(cnt))#输出面接
     print(cv2.arcLength(cnt,True))#True闭合的周长,输出周长



     


os.system("pause")

运行结果如下:


相关推荐
benchmark_cc13 分钟前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库18 分钟前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H22 分钟前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒36 分钟前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP1 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
2601_962382431 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
鹏哥带你干乡墅2 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
江畔柳前堤2 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
Figo_Cheung2 小时前
Figo基于RNC理论的宇宙演化第七纪元猜想
开发语言·php
veminhe2 小时前
python调用接口获取网络信息
python