在前面实现了一些轮廓的查找,接着下来要根据周长和面积对一些轮廓进行处理。比如怎么样识别轮廓是一个三角形组成呢?显然就可看它是否有三条边组成的。如果一堆三角形里,还要找一个最大面积的三角形呢?这时就需要使用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