先斩后奏,源码:

#python 3.7.4,opencv4.1
# https://www.freesion.com/article/6289910425/
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
from scipy import signal
import math#图片的路径
imgname = 'S:\\AdobeppPS\\SKOO\\cc33.jpg'#读取图片
image = cv2.imread(imgname, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))
ret, img_bin = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
img_bin = cv2.erode(img_bin,kernel,iterations = 1)
cv2.imshow("img_bin",img_bin)
#查找,绘制
contours , hierarchy = cv2.findContours(img_bin , cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
# print(contours)
print("dgcaijid",len(hierarchy))
# print(hierarchy)largest = None
show = False
FIRST = 0
RED = (0, 0, 255)
THICKNESS = 3
for contour in contours:approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)    if len(approx) == 3:#发现三角形if largest is None or cv2.contourArea(contour) > cv2.contourArea(largest):largest = contourshow = True
if show:cv2.drawContours(image, [largest], FIRST, RED, THICKNESS)
cv2.imshow("Image",image)cv2.waitKey(0)
# cv2.destroyAllWindows()

数据输出:

参考来源:https://www.freesion.com/article/6289910425/
根据周长和面积对一些轮廓进行处理。比如怎么样识别轮廓是一个三角形组成呢?显然就可看它是否有三条边组成的。如果一堆三角形里,还要找一个最大面积的三角形呢?
这时就需要使用OpenCV的函数:
arcLength、contourArea、approxPolyDP,相关的函数定义如下:


1、计算周长参数详解 arcLength 函数
基本格式;
CV-C++/
double cv::arcLength(InputArray curve,bool closed)
python:
cv2.arcLength(InputArray curve,bool closed)

(1) 第一个参数,InputArray curve,一般是由图像的轮廓点组成的点集;
(2) 第二个参数,bool closed,表示输出的多边形是否封闭;true表示封闭,false表示不封闭;这个函数用来计算周长。
2、计算面积参数详解 contourArea 函数
基本格式;
CV-C++/
double cv::contourArea(InputArray contour,bool oriented)
python:
cv2.contourArea(InputArray contour,bool oriented)

(1) 第一个参数,InputArray contour,一般是由图像的轮廓点组成的点集;
(2) 第二个参数,bool oriented,如果设置为true时,表示返回有正负号的面积(根据点的顺序方向),否则返回绝对值。
这个函数用来计算面积。

3、拟合折线参数详解 approxPolyDP 函数
基本格式;
CV-C++/
double cv::approxPolyDP(InputArray contour,OutputArray approxCurve,
double epsilon,bool closed)
python:
cv2.approxPolyDP(InputArray contour,OutputArray approxCurve,
double epsilon,bool closed)

(1) 第一个参数,InputArray contour,一般是由图像的轮廓点组成的点集;
(2) 第二个参数,OutputArray approxCurve,表示输出的多边形点集;
(3) 第三个参数,double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数。
(4) 第四个参数,bool closed:表示输出的多边形是否封闭,布尔操作
主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。

简言之,对于cv的函数周长面积的参数,或者换句话说:
ContourArea 计算整个轮廓或部分轮廓的面积
double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
contour 代表的是轮廓 (定点的序列或数组).
slice 代表的是感兴趣特征轮廓部分的起始点,缺省是计算整个轮廓的面积。
对后面的情况,面积表示轮廓部分和起始点连线构成的封闭部分的面积。
注意:
轮廓的方向影响面积的符号。因此函数也许会返回负的结果。应用函数 fabs() 得到面积的绝对值。
ArcLength 计算轮廓周长或曲线长度
double cvArcLength( const void* curve, CvSlice slice=CV_WHOLE_SEQ, int is_closed=-1 );
curve 曲线点集序列或数组
slice 曲线的起始点,缺省是计算整个曲线的长度
is_closed 表示曲线是否闭合,有三种情况:
is_closed=0 ——假设曲线不闭合
is_closed>0 ——假设曲线闭合
is_closed<0 ——若曲线是序列,检查 ((CvSeq*)curve)->flags 中的标识 CV_SEQ_FLAG_CLOSED 来确定曲线是否闭合。否则 (曲线由点集的数组 (CvMat*) 表示) 假设曲线不闭合。
函数 cvArcLength 通过依次计算序列点之间的线段长度,并求和来得到曲线的长度参考自博客


有效性不太好,对多个轮廓。
参考其他

opencv-pythons实现图像周长面积(三角形)检测DIY整理相关推荐

  1. 计算机视觉OpenCV(五):图像金字塔与轮廓检测

    目录 图像金字塔 1. 高斯金字塔(Gaussian Pyramid) 2. 拉普拉斯金字塔(Laplacian Pyramid) 图像轮廓 1. 查找检测物体的轮廓 2. 绘制轮廓 3. 轮廓特征 ...

  2. OpenCV与图像处理学习八——图像边缘提取(Canny检测代码)

    OpenCV与图像处理学习八--图像边缘提取(Canny检测代码) 一.图像梯度 1.1 梯度 1.2 图像梯度 二.梯度图与梯度算子 2.1模板卷积 2.2 梯度图 2.3 梯度算子 2.3.1 R ...

  3. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  4. Python+OpenCV:图像Harris角点检测(Harris Corner Detection)

    Python+OpenCV:图像Harris角点检测(Harris Corner Detection) 理论 corners are regions in the image with large v ...

  5. 使用Python,OpenCV对图像进行亚像素点检测,并拟合椭圆进行绘制

    这篇博客将介绍如何使用Python,OpenCV对图像进行亚像素检测,并对亚像素点进行椭圆拟合绘制. 1. 效果图 原始图上绘制拟合椭圆 VS 原始图上绘制拟合椭圆及亚像素点绘制随机半径及颜色的圆 V ...

  6. 《OpenCv视觉之眼》Python图像处理十六:Opencv图像处理实战一之图像中的硬币检测

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  7. OpenCV中的图像处理中

    图像金字塔 一般情况下,我们要处理是一副具有固定分辨率的图像.但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理.比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸 ...

  8. 【opencv】(6) 图像轮廓处理

    各位同学好,今天和大家分享一下opencv中如何获取图像轮廓,以及对轮廓的一些其他操作.内容有: (1)轮廓检测:cv2.findContours():(2)轮廓绘制:cv2.drawContours ...

  9. OpenCV:07图像轮廓

    图像轮廓 什么是图形轮廓 查找轮廓 绘制轮廓 计算轮廓的面积和周长 轮廓面积 轮廓周长 多边形逼近 凸包 轮廓拟合 外接矩形 最小外接矩形 最大外接矩形 外接圆 边缘检测`Canny` 霍夫变换 直线 ...

  10. 用opencv的dnn模块做yolov5目标检测

    最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的.于是,我就想着编写一套用opencv的dnn模块做yol ...

最新文章

  1. 1136 A Delayed Palindrome 需再做
  2. Nginx 的 default_server 指令
  3. PetShop 4.0讨论专贴(QA)
  4. 理解Flight框架核心
  5. 在Spring中使用JTA事务管理
  6. 技术解析:一文看懂 Anolis OS 国密生态 | 龙蜥专场
  7. html标签的pre语义,HTML pre 标签
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的小学生智能学习系统
  9. Python风格总结:ASCII码与字符相互转换
  10. 尝试用LoadRunner录制单机程序--未生成录制脚本
  11. ubuntu 下星际译王词典下载地址
  12. 企业电子邮箱怎么申请免费注册账号?
  13. 新旧版MATLAB中的希尔伯特-黄变换(HHT)及其边际谱的求取问题
  14. V8源码边缘试探-黑魔法指针偏移
  15. 撩人飙新意,美汁源首次转战“AR微电影”,要你变身当“导演”
  16. linux shell用户,Linux 系统 利用shell脚本获取所有用户
  17. 谈判技巧——执行合同
  18. Oracle读取数据库中表填充,Oracle数据库中查看所有表和字段以及表注释.字段注释...
  19. C#怎么将GBK编码转换成UTF-8编码?
  20. 408又来了!华中科技大学软件学院改考408!

热门文章

  1. 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
  2. w764位计算机右键管理,为win764位旗舰版右键添加“管理员取得所有权”方法
  3. 悟以往之不谏,知来者之可追~
  4. 江湖之事(一)之WPS office 与 MS office 第一篇
  5. 【NOIP2016普及组】复赛——魔法阵
  6. JavaScrpit+Html实现“网页播放视频“效果(应用场景:腾讯PC端视频播放器、以及各视频网站页面开发设计)
  7. 三进制 四进制计算机原理,三进制计算机(中国三进制计算机)
  8. matlab取包络取得过细怎么解决,matlab如何求包络线
  9. 3.3.3 Camelot亚瑟王的宫殿 USACO
  10. win10下出现.net framework 3.5错误代码0x800F081F的问题