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

 更新时间:2018年02月10日 08:33:03   作者:帅气的猫爪  
这篇文章主要为大家详细介绍了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变换的思想为在直角坐标系下的一个点对应极坐标系下的一条直线,同样,极坐标系下的一个点对应直角坐标系下的一条直线。在直角坐标系中的直线,斜率和截距是一定的,这样这条直线上的所有点在极坐标系中聚焦于一点,这样的聚焦点就代表了直角坐标系中的直线。
对于直线x=c,在实际应用中,是采用参数方程p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数r—theta平面上的一条曲线上,其它的还是一样。

标准hough变换:

Imgproc.HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta, double max_theta)

参数说明:

image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
srn:rho参数的除数距离,有默认值0
stn:theta参数的除数距离,默认值0
min_theta:检测到的直线的最小角度
max_theta:检测到的直线的最大角度

示例代码:

public static void main(String[] args)
 {
 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

 Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
 Mat dstImage = srcImage.clone();
 Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
 Mat storage = new Mat();
 Imgproc.HoughLines(dstImage, storage, 1, Math.PI / 180, 200, 0, 0, 0, 10);
 for (int x = 0; x < storage.rows(); x++)
 {
  double[] vec = storage.get(x, 0);

  double rho = vec[0];
  double theta = vec[1];

  Point pt1 = new Point();
  Point pt2 = new Point();

  double a = Math.cos(theta);
  double b = Math.sin(theta);

  double x0 = a * rho;
  double y0 = b * rho;

  pt1.x = Math.round(x0 + 1000 * (-b));
  pt1.y = Math.round(y0 + 1000 * (a));
  pt2.x = Math.round(x0 - 1000 * (-b));
  pt2.y = Math.round(y0 - 1000 * (a));

  if (theta >= 0)
  {
  Imgproc.line(srcImage, pt1, pt2, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
  }
  }
  Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
  }

累计概率hough变换:

Imgproc.HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)

参数说明:

image:源图像
lines:hough变换后储存检测到的线条的输出矢量
rho:以像素为单位的距离精度
theta:以弧度为单位的角度精度
threshold:识别某部分为一条直线时必须达到的值
minLineLength:最低线段的长度,默认为0
maxLineGap:允许将同一行点与点之间连接起来的最大的距离,默认为0

示例代码:

public static void main(String[] args)
 {
 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 Mat srcImage = Imgcodecs.imread("F:\\6597210504144579394.jpg");
 Mat dstImage = srcImage.clone();
 Imgproc.Canny(srcImage, dstImage, 400, 500, 5, false);
 Mat storage = new Mat();
 Imgproc.HoughLinesP(dstImage, storage, 1, Math.PI / 180, 50, 0, 0);
 for (int x = 0; x < storage.rows(); x++)
 {
  double[] vec = storage.get(x, 0);
  double x1 = vec[0], y1 = vec[1], x2 = vec[2], y2 = vec[3];
  Point start = new Point(x1, y1);
  Point end = new Point(x2, y2);
  Imgproc.line(srcImage, start, end, new Scalar(255, 255, 255, 255), 1, Imgproc.LINE_4, 0);
 }
 Imgcodecs.imwrite("F:\\dst2.jpg", srcImage);
 }

源图片:

标准hough变换结果:


累计概率hough变换结果:

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

相关文章

  • Java实现开箱即用的redis分布式锁

    Java实现开箱即用的redis分布式锁

    这篇文章主要为大家详细介绍了如何使用Java实现开箱即用的基于redis的分布式锁,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以收藏一下
    2022-12-12
  • Java中DecimalFormat用法及符号含义

    Java中DecimalFormat用法及符号含义

    DecimalFormat是NumberFormat的一个具体子类,用于格式化十进制数字。这篇文章介绍了DecimalFormat的用法及符号含义,需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12
  • springSecurity实现简单的登录功能

    springSecurity实现简单的登录功能

    这篇文章主要为大家详细介绍了springSecurity实现简单的登录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java中检查字符串是否以特定字符结尾

    Java中检查字符串是否以特定字符结尾

    这篇文章主要介绍了Java中检查字符串是否以特定字符结尾,文章围绕主题展开字符串匹配问题,具有一定的参考价值需要的小伙伴可以参考一下
    2022-06-06
  • Maven生成可直接运行的jar包(多种方式)

    Maven生成可直接运行的jar包(多种方式)

    文章介绍了三种使用Maven生成可以直接运行的jar包的方法:通过maven-jar-plugin和maven-dependency-plugin插件、maven-assembly-plugin插件以及maven-shade-plugin插件,每种方法都有其特点和适用场景,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • 重试框架Guava-Retry和spring-Retry的使用示例

    重试框架Guava-Retry和spring-Retry的使用示例

    spring-retry 和 guava-retry 工具都是线程安全的重试,能够支持并发业务场景的重试逻辑正确性,本文主要介绍了重试框架Guava-Retry和spring-Retry的使用示例,感兴趣的可以一下
    2023-09-09
  • Java排序的那些事之sort方法的使用详解

    Java排序的那些事之sort方法的使用详解

    sort方法用于对数组的元素进行排序。排序顺序可以是字母或数字,并按升序或降序。默认排序顺序为按字母升序,当数字是按字母顺序排列时"40"将排在"5"前面。使用数字排序,你必须通过一个函数作为参数来调用。这些说起来可能很难理解,你可以通过本篇文章进一步了解它
    2021-09-09
  • tk.mybatis扩展通用接口使用详解

    tk.mybatis扩展通用接口使用详解

    这篇文章主要介绍了tk.mybatis扩展通用接口使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • spring boot+jwt实现api的token认证详解

    spring boot+jwt实现api的token认证详解

    这篇文章主要给大家介绍了关于spring boot+jwt实现api的token认证的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一学习学习吧
    2018-12-12
  • Java多线程之同步工具类CyclicBarrier

    Java多线程之同步工具类CyclicBarrier

    这篇文章主要介绍Java多线程之同步工具类CyclicBarrier,它是一个同步工具类,它允许一组线程互相等待,直到达到某个公共屏障点,支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后,该命令只在每个屏障点运行一次。下面来看文章具体内容
    2021-10-10

最新评论