本文为作者原创,转载请注明出处(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. htt p第一章概述

    http的概述 1 web客户端与服务器是如何通信 2 web资源来自的何方 3 web事务是怎样的工作的 4 http通信所使用的报文结构 5 底层tcp的传输的结构 6不同的http协议体 什么是 ...

  2. Angular2开发拙见

    本文集中讲讲笔者目前使用ng2来开发项目时对其组件的使用的个人的一些拙劣的经验. 先简单讲讲从ng1到ng2框架下组件的职责与地位: ng1中的一大特色--指令,分为属性型.标签型.css类型和注释型 ...

  3. 用static声明的函数和变量小结

    static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...

  4. GCD之after

    先介绍下C中的modf函数 函数名:modf 头文件:<math.h> 函数原型:double modf(double x, double *ipart) 函数用途:分解x,以得到x的整数 ...

  5. DOM中document对象的常用属性方法

    每个载入浏览器的 HTML 文档都会成为 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 属性 1  document.anchors  返 ...

  6. 深入理解计算机系统chapter8

    进程轮流使用处理器 父进程调用fork来创建一个新的子进程 回收子进程 waitpid/wait 非本地跳转:

  7. 编译httpd细节

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  8. C++中const用于函数重载

    C++中const用于函数重载 常成员函数和非常成员函数之间的重载 首先先回忆一下常成员函数 声明:<类型标志符>函数名(参数表)const: 说明: (1)const是函数类型的一部分, ...

  9. 【转】深入理解CSS定位中的偏移

    前面的话 CSS有三种基本的定位机制:普通流.浮动和绝对定位.利用定位,可以准确地定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置.但元素究竟如何定位,定 ...

  10. 配置 VirtualBox backend - 每天5分钟玩转 Docker 容器技术(75)

    Rexy-Ray 支持多种 backend,上一节我们已经安装配置了 Rex-Ray,今天演示如何配置 VirtualBox backend. 在 VirtualBox 宿主机,即我的笔记本上启动 v ...