vps 做网站,品牌网站建设可信大蝌蚪,wordpress需要备案吗,科技公司 网站 石家庄轮廓#xff08;Contours#xff09;#xff0c;指的是有相同颜色或者密度#xff0c;连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。 在轮廓检测之前#xff0c;首先要对图片进行二值化或者Canny边缘检测。在OpenCV中#xff0c;寻找… 轮廓Contours指的是有相同颜色或者密度连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。 在轮廓检测之前首先要对图片进行二值化或者Canny边缘检测。在OpenCV中寻找的物体是白色的而背景必须是黑色的因此图片预处理时必须保证这一点。 cv2.findContours函数 Python版示例如下也可以参考【OpenCV-Python教程11、轮廓检测】【Contours : Getting Started】 contours, hierarchy cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 1. 完整例子
import cv2#读入图片
img cv2.imread(1.png)# 必须先转化成灰度图
gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
ret, thresh cv2.threshold(gray, 127, 255, cv2.THRESH_BINAEY)# 寻找轮廓
contours, hierarchy cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 画出轮廓-1,表示所有轮廓画笔颜色为(0, 255, 0)即Green粗细为3
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 显示图片
cv2.namedWindow(Contours, cv2.NORMAL_WINDOW)
cv2.imshow(Contours, img)# 等待键盘输入
cv2.waitKey(0)
cv2.destroyAllWindows()123456789101112131415161718192021222324123456789101112131415161718192021222324 2. 参数解释 这里的findContours函数有三个参数 thresh - 要寻找轮廓的图片注意这里的轮廓会直接改变在thresh上记得备份cv2.RETR_TREE - 表示轮廓检索模式Contour retrieval mode为检索所有的轮廓且重组为一个有层次的嵌套轮廓。层次信息返回在hierarchy中。cv2.CHAIN_APPROX_SIMPLE - 表示轮廓近似方法Contour approximation method。SIMPLE可以这样理解假如一个矩形有1000个点但是现在只用四个角的点表示就行了即去掉冗余信息。 返回值也有两个contours 和 hierarchy 对contours的理解如下
print 找到 %d 个轮廓 %(len(contours))
print 第 0 个轮廓有 %d 个点 %(len(contours[0]))# 画出第0个轮廓
cv2.drawContours(img, contours, 0, (0, 255, 0), 3)
cv2.imshow(first contours, img)# 画出第1个轮廓
cv2.drawContours(img, contours, 1, (0, 255, 0), 3)
cv2.imshow(second contours, img)# 画出所有的轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow(all contours, img)12345678910111213141234567891011121314 对 hierarchy 的深究可以参考这里【Contours Hierarchy】 轮廓特征Contour Features 查找到轮廓以后我们可以得出轮廓的一些特征信息也可以在轮廓上做一些简单的操作参考Python教程【Contour Features】 1. 面积和周长示例
# 寻找轮廓
contours, hierarchy cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 取第 0 个轮廓
cnt contours[0]# 轮廓面积
area cv2.contourArea(cnt)# 周长或者说弧长第二个参数的True表示该轮廓是否封闭
perimeter cv2.arcLength(cnt, True)12345678910111234567891011 2. 轮廓近似 轮廓近似Contour Approximation要理解概念先来看下面的三张图。第一张是找到的轮廓第二张近似的幅度很大忽略了很多的细节第三细节多一点. OpenCV中是用 cv2.approxPolyDP()函数来进行轮廓的近似的。见代码
# 假设取第30个轮廓为例
cnt contours[30]# 10%即0.1的精确度
epsilon 0.1 * cv2.arcLength(cnt, True)
approx cv2.approxPolyDP(cnt, epsilon, True)# 这里是第二张10%的精确度
cv2.imshow(10% approximation, approx)123456789123456789 同理第三张可以用1%的精确度来得到。 3. 计算凸包 涉及凸多面体和凹多面体的概念不多解释。如下图本来是一个手掌的形状现在用最小的凸多面体把它包起来。其中凸进去Bulge Inside的部分称为凸包缺陷Convexity Defects即箭头处即偏导的局部最大值处。 函数调用以后用到再来细究吧
hull cv2.convexHull(cnt)
cv2.imshow(hull, hull)1212 4. 矩形边框 矩形边框Bounding Rectangle是说用一个最小的矩形把找到的形状包起来。还有一个带旋转的矩形面积会更小效果见下图 上代码
# 用绿色(0, 255, 0)来画出最小的矩形框架
x, y, w, h cv2.boundingRect(cnt)
cv2.rectangle(img, (x, y), (xw, yh), (0, 255, 0), 2)# 用红色表示有旋转角度的矩形框架
rect cv2.minAreaRect(cnt)
box cv2.cv.BoxPoints(rect)
box np.int0(box)
img cv2.drawContours(img, [box], 0, (0, 0, 255), 2)123456789123456789 PS其他的形状如 封闭的圆形椭圆直线 等例子见这里【Contour Features】原理差不多不再赘述。