iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android基于OpenCV实现霍夫直线检测
  • 652
分享到

Android基于OpenCV实现霍夫直线检测

2024-04-02 19:04:59 652人浏览 独家记忆
摘要

目录霍夫直线检测点和线的对偶性极坐标参数方程api操作效果霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的

霍夫直线检测

点和线的对偶性

  • 图像空间中的点,对应霍夫空间中的直线
  • 图像空间中的直线,对应霍夫空间中的点
  • 共点的直线,在霍夫空间中对应的点在一条直线上
  • 共线的点,在霍夫空间中对应的直线交于一点

极坐标参数方程

对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法。然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线。其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角。如下图所示:

根据霍夫变换原理,利用极坐标形式表示直线时,在图像空间中经过某一点的所有直线映射到参数空间中是一个正弦曲线。图像空间中直线上的两个点在参数空间中映射的两条正弦曲线相交于一点。

通过上述的变换过程,将图像中的直线检测转换成了在参数空间中寻找某个点 通过的正线曲线最多的问题。由于在参数空间内的曲线是连续的,而在实际情况中图像的像素是离散的,因此我们需要将参数空间的坐标轴进行离散化,用离散后的方格表示每一条正弦曲线。首先寻找符合条件的网格,之后寻找该网格对应的图像空间中所有的点,这些点共同组成了原图像中的直线。

由此可见,霍夫变换算法检测图像中的直线主要分为4个步骤

  • 将参数空间的坐标轴离散化,例如theta=0,10,20……, r=0.1,0.2,0.3……
  • 将图像中每个非0像素通过映射关系求取在参数空间通过的方格。
  • 统计参数空间内每个方格出现的次数,选取次数大于某一阈值的方格作为表示直线的方格。
  • 将参数空间中表示直线的方格的参数作为图像中直线的参数。

霍夫检测具有抗干扰能力强,对图像中直线的残缺部分、噪声以及其它共存的非直线结构不敏感,能容忍特征边界描述中的间隙,并且相对不受图像噪声影响等优点,但是霍夫变换的时间复杂度和空间复杂度都很高,并且检测精度受参数离散间隔制约。离散间隔较大时会降低检测精度,离散间隔较小时虽然能提高精度,但是会增加计算负担,导致计算时间边长

API


public static void HoughLines(Mat image, Mat lines, double rho, double theta, int threshold, double srn, double stn, double min_theta)
  • 参数一:image,待检测直线的原图像,必须是CV_8U的单通道图像.
  • 参数二:lines,霍夫变换检测到的直线输出量,每一条直线都由两个或者三个参数表示。第一个表示直线距离坐标原点的距离 ,第二个表示坐标原点到直线的垂线与x轴的夹角,若有第三个,则表示累加器的数值。

  • 参数三:rho,距离分辨率,以像素为单位,距离离散化时的单位长度
  • 参数四:theta,角度分辨率,以弧度为单位,夹角离散化时的单位角度。
  • 参数五:threshold,累加器的阈值,即参数空间中离散化后每个方格被通过的累计次数大于该阈值时将被识别为直线,否则不被识别为直线。
  • 参数六:srn,对于多尺度霍夫变换算法中,该参数表示距离分辨率的除数,粗略的累加器距离分辨率是第三个参数rho,精确的累加器分辨率是rho/srn。这个参数必须是非负数,默认参数为0。
  • 参数七:stn,对于多尺度霍夫变换算法中,该参数表示角度分辨率的除数,粗略的累加器距离分辨率是第四个参数rho,精确的累加器分辨率是rho/stn。这个参数必须是非负数,默认参数为0。当这个参数与第六个参数srn同时为0时,此函数表示的是标准霍夫变换。
  • 参数八:min_theta,检测直线的最小角度,默认参数为0。
  • 参数九:max_theta,检测直线的最大角度,默认参数为CV_PI,是OpenCV 4中的默认数值具体为3.1415926535897932384626433832795。

使用标准霍夫变换和多尺度霍夫变换函数HoughLins()提取直线时无法准确知道图像中直线或者线段的长度,只能得到图像中是否存在符合要求的直线以及直线的极坐标解析式。如果需要准确的定位图像中线段的位置,HoughLins()函数便无法满足需求。但是OpenCV 4提供的渐进概率式霍夫变换函数HoughLinesP()可以得到图像中满足条件的直线或者线段两个端点的坐标,进而确定直线或者线段的位置。


public static void HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap) 

参数一:image,待检测直线的原图像,必须是CV_8U的单通道图像.

参数二:lines,输出线段。每条线由4元素表示。如下,分别代表每个线段的两个端点

  • 参数三:rho,距离分辨率,以像素为单位,距离离散化时的单位长度
  • 参数四:theta,角度分辨率,以弧度为单位,夹角离散化时的单位角度。
  • 参数五:threshold,累加器的阈值,即参数空间中离散化后每个方格被通过的累计次数大于该阈值时将被识别为直线,否则不被识别为直线。该累积数越大,则得到的直线可能就越长。
  • 参数六:minLineLength,表示可以检测的最小线段长度,根据实际需要进行设置。
  • 参数七:maxLineGap,表示线段之间的最大间隔像素,假设5表示小于5个像素的两个相邻线段可以连接起来。

操作


package cn.onlyloveyd.demo.ui

import Android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import cn.onlyloveyd.demo.R
import cn.onlyloveyd.demo.databinding.ActivityHoughLineBinding
import cn.onlyloveyd.demo.ext.showMat
import org.opencv.android.Utils
import org.opencv.core.Mat
import org.opencv.core.Point
import org.opencv.core.Scalar
import org.opencv.imgproc.Imgproc
import Kotlin.math.cos
import kotlin.math.roundToInt
import kotlin.math.sin


class HoughLineDetectActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityHoughLineBinding
    private lateinit var mGray: Mat
    private lateinit var mEdge: Mat
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_hough_line)
        mBinding.presenter = this
        mGray = Mat()
        mEdge = Mat()
        val bgr = Utils.loadResource(this, R.drawable.book)
        Imgproc.cvtColor(bgr, mGray, Imgproc.COLOR_BGR2GRAY)
        mBinding.ivLena.showMat(mGray)
        Imgproc.Canny(mGray, mEdge, 80.0, 150.0, 3, false)
    }

    override fun onDestroy() {
        mGray.release()
        mEdge.release()
        super.onDestroy()
    }

    fun doHoughLineDetect() {
        title = "HoughLine"
        val lines = Mat()
        Imgproc.HoughLines(mEdge, lines, 1.0, Math.PI / 180.0, 150)
        val out = Mat.zeros(mGray.size(), mGray.type())
        val data = FloatArray(2)
        for (i in 0 until lines.rows()) {
            lines.get(i, 0, data)
            val rho = data[0] // 直线距离坐标原点的距离
            val theta = data[1] // 直线过坐标原点垂线与x轴夹角
            val a = cos(theta.toDouble())  //夹角的余弦值
            val b = sin(theta.toDouble())  //夹角的正弦值
            val x0 = a * rho  //直线与过坐标原点的垂线的交点
            val y0 = b * rho
            val pt1 = Point()
            val pt2 = Point()
            pt1.x = (x0 + 1000 * (-b)).roundToInt().toDouble()
            pt1.y = (y0 + 1000 * (a)).roundToInt().toDouble()
            pt2.x = (x0 - 1000 * (-b)).roundToInt().toDouble()
            pt2.y = (y0 - 1000 * (a)).roundToInt().toDouble()
            Imgproc.line(out, pt1, pt2, Scalar(255.0, 255.0, 255.0), 2, Imgproc.LINE_AA, 0)
        }
        mBinding.ivResult.showMat(out)
        out.release()
        lines.release()
    }

    fun doHoughLinePDetect() {
        title = "HoughLineP"
        val lines = Mat()
        Imgproc.HoughLinesP(mEdge, lines, 1.0, Math.PI / 180.0, 100, 50.0, 10.0)
        val out = Mat.zeros(mGray.size(), mGray.type())
        for (i in 0 until lines.rows()) {
            val data = IntArray(4)
            lines.get(i, 0, data)
            val pt1 = Point(data[0].toDouble(), data[1].toDouble())
            val pt2 = Point(data[2].toDouble(), data[3].toDouble())
            Imgproc.line(out, pt1, pt2, Scalar(255.0, 255.0, 255.0), 2, Imgproc.LINE_AA, 0)
        }
        mBinding.ivResult.showMat(out)
        out.release()
        lines.release()
    }
}

效果

以上就是Android基于OpenCV实现霍夫直线检测的详细内容,更多关于Android OpenCV实现霍夫直线检测的资料请关注编程网其它相关文章!

--结束END--

本文标题: Android基于OpenCV实现霍夫直线检测

本文链接: https://www.lsjlt.com/news/128471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android基于OpenCV实现霍夫直线检测
    目录霍夫直线检测点和线的对偶性极坐标参数方程API操作效果霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的...
    99+
    2022-11-12
  • OpenCV实现霍夫变换直线检测
    霍夫变换(Hough Transform)是图像处理中检测是否存在直线的重要算法,该算法是由Paul Hough在1962年首次提出,最开始只能检测图像中的直线,但是霍夫变换经过不断...
    99+
    2022-11-12
  • 如何基于OpenCV&Python实现霍夫变换圆形检测
    简述 基于python使用opencv实现在一张图片中检测出圆形,并且根据坐标和半径标记出圆。不涉及理论,只讲应用。 霍夫变换检测圆形的原理 其实检测圆形和检测直线的原理差别不大...
    99+
    2022-11-12
  • OpenCV利用霍夫变换实现交通车道线检测
    目录一、霍夫变换二、霍夫变换直线检测的原理三、霍夫变换直线检测 API函数接口四、霍夫直线变换实现车道线的检测一、霍夫变换 经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以...
    99+
    2022-11-13
  • OpenCV实现直线检测
    本文实例为大家分享了OpenCV实现直线检测的具体代码,供大家参考,具体内容如下 1 介绍 本文主要介绍OpenCV自带的直线检测函数HoughLines()的用法,这个函数的第一个...
    99+
    2022-11-11
  • Python OpenCV基于霍夫圈变换算法如何检测图像中的圆形
    小编给大家分享一下Python OpenCV基于霍夫圈变换算法如何检测图像中的圆形,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一章:霍夫变换检测圆①...
    99+
    2023-06-22
  • Android基于OpenCV实现Harris角点检测
    目录什么是角点? 为什么要检测角点? Harris角点检测 API操作效果 源码 什么是角点? 角点就是极值点,即在某方面属性特别突出的点。当然,你可以自己定义角点的属性(设置特定...
    99+
    2022-11-12
  • Android基于OpenCV实现QR二维码检测
    目录QR二维码QR二维码格式QR二维码结构APIQRCodeDetector类结构检测QR二维码识别QR二维码检测并识别QR二维码操作结果源码QR二维码 QR码(英语:Quick...
    99+
    2022-11-12
  • OpenCV实现直线检测并消除
    本文实例为大家分享了OpenCV实现直线检测并消除的具体代码,供大家参考,具体内容如下 很简单,代码如下 #include<iostream> #include<...
    99+
    2022-11-12
  • python opencv检测直线 cv2.HoughLinesP的实现
    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段。 cv2.HoughLinesP()函数原型: HoughLin...
    99+
    2022-11-12
  • Python OpenCV Hough直线检测算法如何实现
    这篇文章主要介绍了Python OpenCV Hough直线检测算法如何实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python OpenCV Hough直线检测算...
    99+
    2023-07-02
  • python基于Opencv实现人脸口罩检测
    一、开发环境 python 3.6.6 opencv-python 4.5.1 二、设计要求 1、使用opencv-python对人脸口罩进行检测 三、设计原理 设计流程图如图3-1...
    99+
    2022-11-12
  • OpenCV基于ORB算法实现角点检测
    本文实例为大家分享了OpenCV基于ORB算法实现角点检测的具体代码,供大家参考,具体内容如下 ORB算法是FAST算法和BRIEF算法的结合,ORB可以用来对图像中的关键点快速创建...
    99+
    2022-11-11
  • 基于Python OpenCV和 dlib实现眨眼检测
    目录了解“眼睛纵横比”(EAR)使用面部标志和 OpenCV 检测眨眼眨眼检测结果总结今天,我们使用面部标记和 OpenCV 检测视频流中的眨眼次数。 为了构建我们的眨眼检测器,我们...
    99+
    2022-11-12
  • 基于Mediapipe+Opencv实现手势检测功能
    目录一、前言二、环境配置软件:环境:三、全部源码MediapipeHandTracking.py程序结构:MediapipeHandTracking.py源码与注释四、环境配置1、在...
    99+
    2022-11-12
  • 如何实现基于opencv的行人检测
    这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向...
    99+
    2023-06-22
  • 基于OpenCV实现车道线检测(自动驾驶机器视觉)
    目录0 前言1 车道线检测2 目标3 检测思路4 代码实现4.1 视频图像加载4.2 车道线区域4.3 区域4.4 canny 边缘检测4.5 霍夫变换(Hough transfor...
    99+
    2022-11-12
  • 基于Mediapipe+Opencv如何实现手势检测功能
    今天给大家介绍一下基于Mediapipe+Opencv如何实现手势检测功能。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、前言基于Mediapipe+Op...
    99+
    2023-06-26
  • 基于深度学习和OpenCV实现目标检测
    目录使用深度学习和OpenCV进行目标检测MobileNets:高效(深度)神经网络使用OpenCV进行基于深度学习的对象检测使用OpenCV检测视频使用深度学习和 OpenCV 进...
    99+
    2022-11-12
  • python目标检测基于opencv实现目标追踪示例
    目录主要代码信息封装类更新utilspython-opencv3.0新增了一些比较有用的追踪器算法,这里根据官网示例写了一个追踪器类 程序只能运行在安装有opencv3.0以上版本和...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作