主页 > 互联网  > 

OpenCV-36多边形逼近与凸包


目录

一、多边形的逼近

二、凸包


一、多边形的逼近

findContours后的轮廓信息countours可能过于复杂不平滑,可以用approxPolyDP函数对该多边形曲线做适当近似,这就是轮廓的多边形逼近。

apporxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(方法名中的DP)

DP算法原理比较简单,核心就是不断去找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度(阈值)。

approxPolyDP(curve, epsilon, closed[, approxCurvel])

curve 要逼近的轮廓epsilon 即DP算法使用的阈值closed 轮廓是否闭合

阈值越大,逼近效果越粗糙;阈值越小,逼近效果越好。

得到的approx本质是一个数组ndarray类型,因此画轮廓的时候需要加上[]变成列表类型。

示例代码如下:

import cv2 import numpy as np # 导入图片 hand = cv2.imread("hand.png") # 变为单通道黑白图片 gray = cv2.cvtColor(hand, cv2.COLOR_BGR2GRAY) # 二值化操作 ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 查找轮廓 contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 复制一份原图 hand_copy = hand.copy() # 直接在img_copy上面操作 cv2.drawContours(hand_copy, contours, -1, (0, 0, 255), 2) # 使用多边形逼近,近似模拟手的轮廓 approx = cv2.approxPolyDP(contours[2], 20, closed=True) # approx本质上是一个轮廓数据,是一个ndarray类型 print(approx) print(type(approx)) # 二contours是一个元组/列表类型 # 画出近似逼近的轮廓 cv2.drawContours(hand_copy, [approx], -1, (0, 255, 0), 2) cv2.imshow("img", np.hstack((hand, hand_copy))) cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如下:

二、凸包

逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。 凸包和逼近多边形很像,只不过它是物体最外层的凸多边形。凸包指的是完全包含原有轮廓,并且仅由轮廓上的点所构成的多边形。凸包的每一处都凸的,即在凸包内连接任意两点的直线都在凸包的内部。在凸包内,任意连续三个点的内角小于180°。

convexHull(points[,hull [,clockwise[, returnpoints]]]])

points 即轮廓colckwise 顺时针绘制

示例代码如下:

import cv2 hand = cv2.imread("hand.png") # 二值化操作 gray = cv2.cvtColor(hand, cv2.COLOR_BGR2GRAY) # 二值化操作 thresh, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY) # 查找轮廓 contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(hand, contours, 0, (0, 0, 255), 2) # 多边形逼近 approx = cv2.approxPolyDP(contours[2], 20, True) # 画出多边形逼近的轮廓 cv2.drawContours(hand, [approx], 0, (0, 0, 255), 2) # 计算凸包 hull = cv2.convexHull(contours[2]) # 画出凸包 cv2.drawContours(hand, [hull], 0, (255, 0, 0), 2) cv2.imshow("hand", hand) cv2.waitKey(0) cv2.destroyAllWindows()

输出结果如下:

标签:

OpenCV-36多边形逼近与凸包由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“OpenCV-36多边形逼近与凸包