本文为作者原创,转载请注明出处(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. Python-老男孩-03_socket

    Socket简介: 所谓Socket也称"套接字",用于描述IP和端口,是一个通信链的句柄,应用程序通过"套接字"向网络发出请求或应答网络请求. Socket起 ...

  2. 谈一谈最近学了一段时间的node.js

    官方说明 1.NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”. 2.node是一个基于Chrome V8引擎进行代码解释的.轻量.可伸缩的具有事件驱动和非阻塞I/O机制的js运 ...

  3. vue.js项目构建

    这里构建的vue.js项目依赖node服务器运行. 项目搭建完整步骤: 安装node.js ,转至nodeJs网站http://nodejs.cn/ 下载nodeJs进行安装. 安装完毕检查nodeJ ...

  4. iOS蓝牙心得

    1.获取蓝牙mac地址 因为安卓不能得到uuid,所以,在要同步的时候要将uuid转换成mac地址,下面是转换方法 [peripheral discoverServices:@[[CBUUID UUI ...

  5. sdk&jdk&jre

    1. jre and jdkJRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只能运行Jav ...

  6. Go语言下载、安装、配置、使用

    Go语言 Go语言(Golang,The Go Programming Language),是谷歌2009发布的第二款开源编程语言.2009年7月份,谷歌曾发布了Simple语言,它是用来开发Andr ...

  7. Redis学习——Redis持久化之AOF备份方式保存数据

    新技术的出现一定是在老技术的基础之上,并且完善了老技术的某一些不足的地方,新技术和老技术就如同JAVA中的继承关系.子类(新技术)比父类(老技术)更加的强大! 在前面介绍了Redis学习--Redis ...

  8. 让MessageBox对话框总在最前面

    调用MessageBox的时候,如果最后一个参数用上MB_SYSTEMMODAL的话,可以让对话框在最前面

  9. 通过SQL脚本导入数据到不同数据库避免重复导入三种方式

    前言 无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在SQL同样如此,若我们没有界面来维护而且需要经常进行的操作,我们会写脚本避免下次又得重新写一遍,但是这其中就涉及到一个问题,这个问题 ...

  10. Java 中的语法糖

    百度百科对语法糖的定义 语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这 ...