小言_互联网的博客

在OpenCV里实现周长、面积计算

803人阅读  评论(0)

在前面实现了一些轮廓的查找,接着下来要根据周长和面积对一些轮廓进行处理。比如怎么样识别轮廓是一个三角形组成呢?显然就可看它是否有三条边组成的。如果一堆三角形里,还要找一个最大面积的三角形呢?这时就需要使用OpenCV的函数:arcLength、contourArea、approxPolyDP,相关的函数定义如下:

参数详解

 

(1) 第一个参数,InputArray curve,一般是由图像的轮廓点组成的点集;

 

(2) 第二个参数,bool closed,表示输出的多边形是否封闭;true表示封闭,false表示不封闭;

这个函数用来计算周长。

 

参数详解

 

(1) 第一个参数,InputArray contour,一般是由图像的轮廓点组成的点集;

 

(2) 第二个参数,bool oriented,如果设置为true时,表示返回有正负号的面积(根据点的顺序方向),否则返回绝对值。

这个函数用来计算面积。

 

参数详解;

 

InputArray curve:一般是由图像的轮廓点组成的点集

 

OutputArray approxCurve:表示输出的多边形点集

 

double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数

 

bool closed:表示输出的多边形是否封闭

主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。

 

有了这三个函数,就可用下面的例子来演示:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
from scipy import signal
import math

#图片的路径
imgname = "7board1.png"

#读取图片
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))

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 = contour
            show = True
#
if show:
    cv2.drawContours(image, [largest], FIRST, RED, THICKNESS)
cv2.imshow("Image",image)

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

二值化后图片

识别出来的三角形图片

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/102401079
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场