本文为作者原创,转载请注明出处(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. bootStrap事例代码

    最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...

  2. [06] Session实现机制以及和Cookie的区别

    1.为什么有Session和Cookie 根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接.TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于 ...

  3. JSP页面格式化数字或时间 基于jstl的

    jsp页面格式化数字或时间 转载自: http://blog.csdn.net/hakunamatata2008/archive/2011/01/21/6156203.aspx Tags fmt:re ...

  4. 【Spring】Spring的bean装配

    前言 bean是Spring最基础最核心的部分,Spring简化代码主要是依赖于bean,下面学习Spring中如何装配bean. 装配bean Spring在装配bean时非常灵活,其提供了三种方式 ...

  5. 与 Hadoop 对比,如何看待 Spark 技术?

    主要是先看MapReduce模型有什么问题? 第一:需要写很多底层的代码不够高效,第二:所有的事情必须要转化成两个操作Map/Reduce,这本身就很奇怪,也不能解决所有的情况. 其实Spark出现就 ...

  6. java实现excel和数据的交互

    1. 环境要求 本文环境为: 数据库为oracle,jdk为jdk7,依赖jar包为ojdbc6-11.2.0.4.0.jar+poi-3.14.jar 2.POI 使用 1. 建立工作空间 2. 获 ...

  7. Hive 存储类型 StoreType

    file_format: : SEQUENCEFILE | TEXTFILE -- (Default, depending on hive.default.fileformat configurati ...

  8. 修改host可以上的一些网站

    打开路径 C:\Windows\System32\drivers\etc 博客园 223.6.248.220 www.cnblogs.com github 192.30.253.112 github. ...

  9. TCP/IP 第二章

    1, 以太网的封装格式.其中MTU的最小值为46字节,所以,ARP和RARP需要添加18字节的PAD.CRC是检验和.(循环冗余检验) 2,SLIP:(串行线路ip) 首尾一个end字符加以区分数据. ...

  10. Dubbo服务接口的设计原则

    1.接口粒度 1.1 服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo暂未提供分布式事务支持.同时可以减少系统间的网络交互. 1.2 服务 ...