Java+opencv3.2.0实现轮廓检测

轮廓是由一系列的点组成的集合,表现在图像中就是一条曲线。

OpenCV3.2.0中提供了查找轮廓的方法:
Imgproc.findContours(Mat image, List contours, Mat hierarchy, int mode, int method, Point offset)

参数说明:

image:8位单通道图像。
contours:存储检测到的轮廓的集合。
hierarchy:可选的输出向量,包含了图像轮廓的拓扑信息。
mode:轮廓检索模式。有如下几种模式:

1、RETR_EXTERNAL只检测最外围的轮廓
2、RETR_LIST提取所有的轮廓,不建立上下等级关系,只有兄弟等级关系
3、RETR_CCOMP提取所有轮廓,建立为双层结构
4、RETR_TREE提取所有轮廓,建立网状结构

method:轮廓的近似方法。取值如下:
1、CHAIN_APPROX_NONE获取轮廓的每一个像素,像素的最大间距不超过1
2、CHAIN_APPROX_SIMPLE压缩水平垂直对角线的元素,只保留该方向的终点坐标(也就是说一条中垂线a-b,中间的点被忽略了)
3、CHAIN_APPROX_TC89_LI使用TEH_CHAIN逼近算法中的LI算法
4、CHAIN_APPROX_TC89_KCOS使用TEH_CHAIN逼近算法中的KCOS算法

offset:每个轮廓点的可选偏移量。

示例代码:

public static void main(String[] args)
  {
    // TODO Auto-generated method stub
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    Mat src = Imgcodecs.imread("F:\\1_m1109048058.jpg");
    Mat dst = src.clone();
    Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGRA2GRAY);
    Imgproc.adaptiveThreshold(dst, dst, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C,
        Imgproc.THRESH_BINARY_INV, 3, 3);

    java.util.List<MatOfPoint> contours = new java.util.ArrayList<MatOfPoint>();
    Mat hierarchy = new Mat();
    Imgproc.findContours(dst, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE,
        new Point(0, 0));
    System.out.println(contours.size());
    for (int i = 0; i < contours.size(); i++)
    {
      Imgproc.drawContours(src, contours, i, new Scalar(0, 0, 0, 0), 1);
    }

    Imgcodecs.imwrite("F:\\test.jpg", src);
  }

原图片:

结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV实现图像轮廓检测以及外接矩形

    前两篇博文分别介绍了图像的边缘检测和轮廓检测,本文接着介绍图像的轮廓检测和轮廓外接矩形: 一.代码部分: // extract_contours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<cv.h> #include<highgui.h> using namespace cv; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { /

  • OpenCV 轮廓检测的实现方法

    轮廓概述 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓在形状分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测. 查找轮廓的函数会修改原始图像.如果你在找到轮廓之后还想使用原始图像的话,你应该将原始图像存储到其他变量中. 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体,要找的物体应该是白色而背景应该是黑色. 轮廓检测的作用: 1.可以检测图图像或者视频中物体的轮廓 2.计算

  • Java+opencv3.2.0实现轮廓检测

    轮廓是由一系列的点组成的集合,表现在图像中就是一条曲线. OpenCV3.2.0中提供了查找轮廓的方法: Imgproc.findContours(Mat image, List contours, Mat hierarchy, int mode, int method, Point offset) 参数说明: image:8位单通道图像. contours:存储检测到的轮廓的集合. hierarchy:可选的输出向量,包含了图像轮廓的拓扑信息. mode:轮廓检索模式.有如下几种模式: 1.R

  • Java+opencv3.2.0实现人脸检测功能

    说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface

  • Java+opencv3.2.0实现hough直线检测

    hough变换是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合特定形状的集合作为hough变换结果. 发展史: 1962年由PaulHough首次提出,用来检测直线和曲线. 1972年由Richard Duda & Peter Hart推广使用,扩展到任意形状物体的识别. 原理: 一条直线在直角坐标系下的表示形式为y=k*x+b,而在极坐标系下表示为r=x*cos(theta)+y*sin(theta).hough变换的思想为在直角坐标系下的一个点对

  • Java+opencv3.2.0实现hough圆检测功能

    hough圆检测和hough线检测的原理近似,对于圆来说,在参数坐标系中表示为C:(x,y,r). 函数: Imgproc.HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius) 参数说明: image:源图像 circles:检测到的圆的输出矢量(x,y,r) method:使用的

  • Java+opencv3.2.0实现重映射

    通过重映射来表达每个像素的位置(x,y) :g(x,y)=f(h(x,y)),h(x,y)是映射方法函数.当h(x,y) = (I.cols()-x,y),表示按照x轴方向发生偏转. 函数:Imgproc.remap(Mat src, Mat dst, Mat map1, Mat map2, int interpolation, int borderMode, Scalar borderValue) 参数说明: src:源图像 dst:目标图像 map1:它有两种可能表示的对象,一种是表示点(x

  • Java+opencv3.2.0实现模板匹配

    模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 函数:Imgproc.matchTemplate(Mat image, Mat templ, Mat result, int method) 参数说明: image:源图像 templ:模板图像 result:比较结果 method:匹配算法 匹配算法: TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配:最好的匹配值为0:匹配越差,匹配值越大. TM_CCORR 相关匹配法:该方法采用乘法操作:数值越大表明匹配

  • Java+opencv3.2.0之scharr滤波器

    在opencv中scharr滤波器是配合sobel算子的运算而存在的.当sobel内核为3时,结果可能会产生比较明显的误差,针对这一问题,Opencv提供了scharr函数.该函数只针对大小为3的核,并且运算速率和sobel函数一样快,结果更加精确,但抗噪性不如sobel函数. 使用scharr滤波器计算x或y方向的图像差分,它的参数变量和sobel一样. 函数:Imgproc.Scharr(Mat src, Mat dst, int ddepth, int dx, int dy, double

  • Java+opencv3.2.0之直方图均衡详解

    直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法. 直方图均衡化的步骤: 1.计算输入图像的直方图H 2.进行直方图归一化,使直方图组距的和为255 3.计算直方图积分 4.采用H'作为查询表:dst(x,y)=H'(src(x,y))进行图像变换 函数:Imgproc.equalizeHist(Mat src, Mat dst) 参数说明: src:源图像 dst:运算结果图像 示例代码: public static void main(String[] args) { Sys

  • python+opencv3.4.0 实现HOG+SVM行人检测的示例代码

    参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果. 网址 :https://docs.opencv.org/3.4.0/d5/d77/train_HOG_8cpp-example.html opencv版本:3.4.0 训练集和opencv官方用了同一个,可以从http://pascal.inrialpes.fr/data/human/下载,在网页的最下方"here(970MB处)",用迅雷下载比较快(500kB/s).训练集文件比较

  • OpenCV-Python实现轮廓检测实例分析

    相比C++而言,Python适合做原型.本系列的文章介绍如何在Python中用OpenCV图形库,以及与C++调用相应OpenCV函数的不同之处.这篇文章介绍在Python中使用OpenCV检测并绘制轮廓. 提示: 转载请详细注明原作者及出处,谢谢! 本文介绍在OpenCV-Python中检测并绘制轮廓的方法. 本文不介详细的理论知识,读者可从其他资料中获取相应的背景知识.笔者推荐清华大学出版社的<图像处理与计算机视觉算法及应用(第2版)>. 轮廓检测 轮廓检测也是图像处理中经常用到的.Ope

随机推荐