轮廓检测

图像轮廓

cv2.findContours(img,mode,method)

  • mode :轮廓检测的模式

    • RETR_EXTERNAL :只检索最外面的轮廓;
    • RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;
    • RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;
    • RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次;
  • method:轮廓逼近方法
    • CHAIN_APPROX_NONE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。
    • CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。


  • 绘制轮廓

import cv2 as cv
import numpy as np

img = cv.imread(‘contours.png‘)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 为了更高的准确率,使用二值图像。当值大于127时,值赋予255,否则为0.
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
draw_img = img.copy()# 之所以copy原图,是因为绘制轮廓时,原图会被改变。
finally_img = cv.drawContours(draw_img, contours, -1, (0, 0, 255), 2) # 绘制轮廓。传入绘制图像,轮廓,轮廓索引,颜色模式((0, 0, 255)按照BGR来说就是红色),线条厚度

res = np.hstack((img, finally_img))
cv.imshow(‘img‘, res)
cv.waitKey(0)
cv.destroyAllWindows()

  • 轮廓特征

    •   面积

cv2.contourArea(参数)

    •   周长

cv2.arcLength(参数,True) # True表示闭合的

import cv2 as cv
import numpy as np

img = cv.imread(‘contours.png‘)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 为了更高的准确率,使用二值图像。当值大于127时,值赋予255,否则为0.
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
cnt = contours[0]
Area = cv.contourArea(cnt)
Length = cv.arcLength(cnt, True)
print(‘面积是:{},周长是:{}‘.format(Area, Length))

  • 轮廓近似

假设曲线AB是一段轮廓。现在我们要对它做轮廓近似。

首先我们设置一个阈值T。

第一步,先找到垂线DC,DC是垂直于AB的最长垂线,只有一条。判断DC是否大于T,若小于T,则AB就是近似轮廓,否则继续下一步。

第二步,连接AD和DB,同理找到最长垂线EG和FH。判断他们是否大于阈值T,若小于阈值,则AD或者DB就是近似轮廓,否则继续找。

cv2.approxPolyDP(传入图, 阈值, True) :轮廓近似函数

import cv2 as cv
import numpy as np

img = cv.imread(‘contours2.png‘)
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 转换为灰度图
ret, thresh = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY) #二值图
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE) # 找到轮廓图
cnt = contours[0] # 获取第一个轮廓,这是一个外轮廓,还有一个内轮廓。
draw_img1 = img.copy()
res1 = cv.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2) # 绘制第一个轮廓
epsilon = 0.1*cv.arcLength(cnt, True) # 设置一个阈值,阈值取的是轮廓周长的0.1,0.1可改变成其他值。
approx = cv.approxPolyDP(cnt, epsilon, True)
draw_img2 = img.copy()
res2 = cv.drawContours(draw_img2, [approx], -1, (0, 0, 255), 2)
res = np.hstack((res1, res2))
cv.imshow(‘res‘, res)
cv.waitKey(0)
cv.destroyAllWindows()

  • 边界矩形

x, y, w, h = boundingRect(输入图像)

  • 计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的。
  • 返回四个值,分别是x,y,w,h;x,y是矩阵左上点的坐标,w,h是矩阵的宽和高

rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

  • 绘制矩形
import cv2 as cv
import numpy as np

img = cv.imread(‘contours2.png‘)
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
cnt = contours[0]

x, y, w, h = cv.boundingRect(cnt)
rect_img = cv.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv.imshow(‘img‘, rect_img)
cv.waitKey(0)
cv.destroyAllWindows()

  • 外接圆

(x, y), radius = cv.minEnclosingCircle(cnt) # 得到中心点和半径

circle_img = cv.circle(img, center, radius, (0, 0, 255), 2) # 绘制边界圆

import cv2 as cv
import numpy as np

img = cv.imread(‘contours.png‘)
gray_img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
binary, contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_NONE)
cnt = contours[0]

x, y, w, h = cv.boundingRect(cnt)
(x, y), radius = cv.minEnclosingCircle(cnt) # 得到中心点和半径
center = (int(x), int(y))
radius = int(radius)
circle_img = cv.circle(img, center, radius, (0, 0, 255), 2) # 绘制边界圆
cv.imshow(‘img‘, circle_img)
cv.waitKey(0)
cv.destroyAllWindows()

原文地址:https://www.cnblogs.com/missdx/p/12386189.html

时间: 2024-11-01 13:54:49

轮廓检测的相关文章

视频中人体轮廓检测

传统的运动人体轮廓检测算法主要有三类:帧间差分法,背景减除法,光流法. 优点                                                                缺点 帧间差分法                运算简单.                                               对于缓慢运动的前景目标容易产生空洞现象. 背景减除法                简单易行.                        

OPENCV图像轮廓检测

前面在图像转换的时候学到canny算子,可以检测出图像的轮廓信息,但是,该算子检测到的轮廓信息还需要我们手动的用眼睛去识别,而实际工程应用中,我们需要得到轮廓的具体数学信息,这就涉及到今天的主题,图像轮廓检测. 一.图像轮廓检测 在opencv中,轮廓对应着一系列的点的集合,opencv提供了一个函数,用来获得这些点的集合 API:void finContours(输入图像,输出轮廓点集,输出向量,int 轮廓检索模式,int 轮廓近似方法,Point 轮廓点的可选偏移量) 注:1.输入图像,是

[转载+原创]Emgu CV on C# (七) —— Emgu CV on 轮廓检测

轮廓检测 对于查找轮廓我们一般要对图像Canny检测.但是对于很特殊的场合其实我们还可以直接对二值化的图像进行轮廓的提取. 关键函数 1. cvFindContours Retrieves contours from the binary image and returns the number of retrieved contours. The pointer firstContour is filled by the function. It will contain pointer to

3D轮廓检测技术讲解

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 今天我们将讨论一种可以检测到3D物体的轮廓方式. 为了使事情变得更清楚,我指的是一个3D对象的轮廓,当光从任意方向落在它上面时. 移动光源可能会相应地改变轮廓. 这完全不同于在图像空

OpenCV入门笔记(六) 轮廓检测(Detect Contours)

轮廓(Contours),指的是有相同颜色或者密度,连接所有连续点的一条曲线.检测轮廓的工作对形状分析和物体检测与识别都非常有用. 在轮廓检测之前,首先要对图片进行二值化或者Canny边缘检测.在OpenCV中,寻找的物体是白色的,而背景必须是黑色的,因此图片预处理时必须保证这一点. cv2.findContours函数 Python版示例如下,也可以参考[OpenCV-Python教程(11.轮廓检测)][Contours : Getting Started] contours, hierar

【OpenCV入门指南】第六篇 轮廓检测 下

<OpenCV入门指南>系列文章地址:http://blog.csdn.net/morewindows/article/category/863841 上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有个更加深入的认识. 代码如下: //图像的轮廓检测下 //By MoreWindows (http://blog.csdn.net/MoreWin

OpenCV轮廓检测,计算物体旋转角度

效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/core/core.h

emguCv3.x 实现字符分割,轮廓检测

/// <summary> /// 获取区域 /// </summary> /// <param name="bitmap"></param> /// <param name="graybtm"></param> /// <returns></returns> public static Bitmap FindBundingBox(Bitmap bitmap, out B

Python-OpenCV中的图像轮廓检测

目录 cv2.findContours() ? 主要记录Python-OpenCV中的cv2.findContours()方法:官方文档: cv2.findContours() ? 在二值图像中寻找图像的轮廓:与cv2.drawubgContours()配合使用: # 方法中使用的算法来源 Satoshi Suzuki and others. Topological structural analysis of digitized binary images by border followin