本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃
 
//2017-04-21更新:
很多网友希望能得到源码,由于在公司做的,所以不太方便传出来。而且我估计很多人可能都是对OpenCV在AndroidStudio环境下配置的问题,给大家推荐一本书《Mastering OpenCV Android Application Programming》,中文版叫《深入OpenCV Android应用开发》,某宝有卖正版,书中有详细代码(第二章有霍夫变换),可以到www.packtpub.com下载,如果不会可以私信邮箱给我,我可以发链接给你。
 
霍夫检测是Paul Hough1962年提出的图像中几何图形识别算法,霍夫线检测是基于图像二值化的变换,利用二值化图像中的点集合来发现候选直线集合。原理是利用坐标空间变换,将笛卡尔坐标系(直角坐标系)下的点(图1)映射到极坐标系(图2),这种点到曲线的映射变换称为霍夫变换,对极坐标进行峰值统计,对统计规则满足直线要求的点进行归类。
(图1)
(图2)
 
(图3)
 
(图4)
      如图1,直角坐标系中直线方程表示为:y = kx+b,其中的一个点(x0,y0)映射到极坐标中表示为:r = cos(θ)*x0 + sin(θ )*y0,r是半径,θ是角度,当x0和y0确定时,可以出现很多满足条件的r和θ,如果将图绘制出来就是图2的弦波。多个点就会出现多个弦波,交点存在唯一的r0和θ0,对应到直角坐标系即图4的直线,满足r0和θ0的点即为一条直线。
      Opencv提供了两种霍夫线检测算法:HoughLines和HoughLinesP,在Android中Java代码为:
HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn)
HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap)
image:输入图像,要求必须是二值化图像,通常是用canny后的图片作为输入图;
lines:输出结果,在HoughLines方法中,输出结果是(r,θ),lines是1行(row)n列(col)的Mat,通过get(0,i)可以获取到(r,θ)数组;在HoughLinesP方法中,输出结果是P1(x1,y1),P2(x2,y2),即端点的坐标值,lines是1行(row)n列(col)的Mat,通过get(0,i)可以获取到(x1, y1, x2, y2)数组;
rho:极坐标系中半径r的搜索步长(累加值),如果为1表示每次累计1个像素;
theta:极坐标系中角度θ的搜索步长,通常设置为π/180,表示每次累加角度为π/180;
threshold:累加器的阈值参数,只有满足阈值数量的点的直线才会被检测出来;
srn/stn:对于多尺度霍夫变换,rho为极坐标系中累加值的粗粒度表示,srn/stn为细粒度的累加值;
minLineLength:HoughLinesP方法中,只有长度超过minLineLength的线段才能被检测出来;
maxLineGap:HoughLinesP方法中,线段跨越的最大空隙为maxLineGap。
 
//Opencv在Android中,大部分的vector、指针、数组都是以Mat来呈现的
Imgproc.HoughLinesP(matIn, line, 1, Math.PI / 180, 20, 150, 10);
if (line.rows() > 0 && line.cols() > 0) {
    for (int i = 0; i < line.cols(); i++) {
        double[] l = line.get(0, i);
        if (l.length == 4) {
            if (Math.abs(l[1] - l[3]) < 2) {
                Point p1 = new Point(l[0], l[1]);
                Point p2 = new Point(l[2], l[3]);
                Core.line(matIn, p1, p2, new Scalar(255, 255, 255), 2);
            }
        }
    }
}
注意Mat变量的结构,通过get(x,y)获取坐标点值,坐标点的各通道在java中通过数组呈现。
 
//2017-04-06更新
忘记说检测效果了,首先一定要先canny,针对图片的检测问题还是不大的,但是在实时camera的场景下,检测到的直线是跳跃的,尤其是在复杂背景下,不要奢望能够得到一条稳定的直线。
 

Android开发中的OpenCV霍夫直线检测(Imgproc.HoughLines()&Imgproc.HoughLinesP())的更多相关文章

  1. opencv:霍夫直线检测

    #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...

  2. 霍夫直线检测 opencv

    本次实验是检测图像中的直线,用到了HoughLines()和HoughLinesP()函数,其中HoughLinesP()称为累计概率霍夫变换,实验结果显示累计概率霍夫变换要比标准霍夫变换的效果好.具 ...

  3. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, ...

  4. opencv::霍夫圆变换

    霍夫圆检测原理 从平面坐标到极坐标转换三个参数 假设平面坐标的任意一个圆上的点,转换到极坐标中: 处有最大值,霍夫变换正是利用这个原理实现圆的检测. cv::HoughCircles 因为霍夫圆检测对 ...

  5. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  6. android开发中fragment获取context

    在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...

  7. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  8. Android开发中的输入合法性检验

    Why ? 合法性检查对于程序的健壮性具有重要作用.在Android开发中,良好的合法性检查设计机制可以使程序更加清晰,产生bug更少,交互更加友好. What ? 合法性检查的目的在于确定边界.对于 ...

  9. 在android开发中使用multdex的方法-IT蓝豹为你整理

    Android系统在安装应用时,往往需要优化Dex,而由于处理工具DexOpt对id数目的限制,导致其处理的数目不能超过65536个,因此在Android开发中,需要使用到MultiDex来解决这个问 ...

随机推荐

  1. bookStore案例第一篇【部署开发环境、解决分类模块】

    前言 巩固Servlet+JSP开发模式,做一个比较完整的小项目 成果图 该项目包含了两个部分,前台和后台. 前台用于显示 后台用于管理 该项目可分为5个模块来组成:分类模块,用户模块,图书模块,购买 ...

  2. Oracle中Union与Union All的区别(适用多个数据库)

    Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...

  3. [js高手之路] html5 canvas系列教程 - 认识canvas以及基本使用方法

    canvas是html5中引入的一个新元素,俗称画布,既然是画布,当然是用来画图的.canvas技术指的是利用javascript操作canvas元素绘制图形的技术,要使用canvas,一定要浏览器支 ...

  4. 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数

    目录: »  plot 最常用的二维曲线绘图函数 >  帮助文档 >  基本使用语法 >  线条的样式.符号和颜色调整 >  图形属性调整 >  使用图形句柄进行设置 » ...

  5. Spring学习—生成图片验证码

    今天想学下一下验证码的生成,就之前搭建好的一个spring框架上写了一个demo,我会贴出细节代码,但是spring的配置就不在介绍了.需要完整代码可以联系我! 会从前台页面到后台实现完整的讲解: 1 ...

  6. SLB vs CLB

    什么是SLB? SLB, 服务器负载均衡(Server Load Balancing),可以看作HSRP(热备份路由器协议)的扩展,实现多个服务器之间的负载均衡. 虚拟服务器代表的是多个真实服务器的群 ...

  7. JS中var和let

       前  言 JavaScript 大家都知道声明一个变量时,通常会用'var'来声明,但是在ES6中,定义了另一个关键字'let'.今天我就为大家带来'var'与'let'这两个关键字声明有何异同 ...

  8. 最接近原生APP体验的高性能前端框架-MUI

      前  言 轻量,原生UI,流畅体验,是MUI的三个特征.   1. 新手指南 快速体验 1. 下载Hello mui App 下载已打包好的Hello mui 手机app,直接在手机上体验mui的 ...

  9. Sets 比赛时想错方向了。。。。 (大数不能处理负数啊)

    Sets Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) SubmitStatus P ...

  10. 关于form表单或者Ajax向后台发送数据时,数据格式的探究

    最近在做一个资产管理系统项目,其中有一个部分是客户端向服务端发送采集到的数据的,服务端是Django写的,客户端需要用rrequests模块模拟发送请求 假设发送的数据是这样的: data = {'s ...