闵行广州网站建设,百度seo排名如何提升,苏州企业展厅设计公司,商城网站框架目录
一、多边形的逼近
二、凸包 一、多边形的逼近
findContours后的轮廓信息countours可能过于复杂不平滑#xff0c;可以用approxPolyDP函数对该多边形曲线做适当近似#xff0c;这就是轮廓的多边形逼近。
apporxPolyDP就是以多边形去逼近轮廓#xff0c;采用的是Doug…目录
一、多边形的逼近
二、凸包 一、多边形的逼近
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, closedTrue)
# 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°。
convexHullpoints[,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()
输出结果如下