纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

Android OpenCV实现Harris角点检测 Android基于OpenCV实现Harris角点检测

易冬   2021-06-23 我要评论
想了解Android基于OpenCV实现Harris角点检测的相关内容吗易冬在本文为您仔细讲解Android OpenCV实现Harris角点检测的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Android,OpenCV,OpenCV,Harris角点检测下面大家一起来学习吧

什么是角点?

角点就是极值点即在某方面属性特别突出的点当然你可以自己定义角点的属性(设置特定熵值进行角点检测)角点可以是两条线的交叉处也可以是位于相邻的两个主要方向不同的事物上的点角点通常被定义为两条边的交点或者说角点的局部邻域应该具有两个不同区域的不同方向的边界常见的角点有:

  • 灰度梯度的最大值对应的像素点
  • 两条直线或者曲线的交点
  • 一阶梯度的导数最大值和梯度方向变化率最大的像素点
  • 一阶导数最大二阶导数为零的像素点(指示物体边缘变化不连续的方向)

为什么要检测角点?

角点是图像很重要的特征对图像图形的理解和分析有很重要的作用角点在保留图像图形重要特征的同时可以有效地减少信息的数据量使其信息的含量很高有效地提高了计算的速度有利于图像的可靠匹配,使得实时处理成为可能角点在三维场景重建、运动估计、目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用

Harris角点检测

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的如果在各个方向上移动这个特征的小窗口窗口内区域的灰度发生了较大的变化那么就认为在窗口内遇到了角点如果这个特定的窗口在图像各个方向上移动时窗口内图像的灰度没有发生变化那么窗口内就不存在角点如果窗口在某一个方向移动时窗口内图像的灰度发生了较大的变化而在另一些方向上没有发生变化那么窗口内的图像可能就是一条直线的线段

Harris角点检测原理用公式演算如下:

其中w(x,y)表示滑动窗口权重函数可以是常数也可以是高斯函数E(u,v)表示滑动窗口向各个方向移动时像素值衡量系数的变化

这里λ1,λ2是矩阵M的2个特征值k是一个指定值这是一个经验参数需要实验确定它的合适大小通常它的值在0.04和0.06之间,它的存在只是调节函数的形状而已R取决于M的特征值对于角点|R|很大平坦的区域|R|很小边缘的R为负值;

API

public static void cornerHarris(Mat src, Mat dst, int blockSize, int ksize, double k, int borderType) 
  • 参数一:src输入源图像必须是单通道8U或者32F类型
  • 参数二:dst输出评价系数R的矩阵尺寸与src相同类型为单通道32F
  • 参数三:blockSize邻域大小
  • 参数四:ksizeSobel算子的半径
  • 参数五:k计算Harris评价系数R的权重系统
  • 参数六:borderType像素外推算法标志位

方法的输出dst为评价系数R的矩阵由于评价系数有正有负且范围较广计算结束后通常需要进行归一化处理然后通过经验阈值比较判断像素点是否为Harris角点阈值越大提取的Harris角点越少阈值越小提取的Harris角点越多

操作

/**
 * Harris角点检测
 * author: yidong
 * 2020/12/30
 */
class HarrisActivity : AppCompatActivity() {
    private val mBinding: ActivityHarrisBinding by lazy {
        ActivityHarrisBinding.inflate(layoutInflater)
    }

    private val gray by lazy {
        this.getBgrFromResId(R.drawable.lena).toGray()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)

        mBinding.ivLena.showMat(gray)
        wrapCoroutine({ showLoading() }, { doCornerHarris() }, { hideLoading() })
    }

    private fun doCornerHarris() {
        val dst = Mat()
        val dstNorm = Mat()
        val dstNormal8U = Mat()
        Imgproc.cornerHarris(gray, dst, 2, 3, 0.04)
        Core.normalize(dst, dstNorm, 0.0, 255.0, Core.NORM_MINMAX)
        Core.convertScaleAbs(dstNorm, dstNormal8U)
        Imgproc.threshold(dstNormal8U, dstNormal8U, 120.0, 255.0, Imgproc.THRESH_BINARY)
        GlobalScope.launch(Dispatchers.Main) {
            mBinding.ivResult.showMat(dstNormal8U)
        }
    }

    private fun showLoading() {
        mBinding.isLoading = true
    }

    private fun hideLoading() {
        mBinding.isLoading = false
    }
    
    override fun onDestroy() {
        super.onDestroy()
        gray.release()
    }
}

效果

如下图图中白点即为评价系数大于120的角点检测结果代码中的参数可自行调整测试

源码

github.com/onlyloveyd/…


相关文章

猜您喜欢

  • Java模板方法 Java设计模式之浅谈模板方法模式

    想了解Java设计模式之浅谈模板方法模式的相关内容吗盛开在夏天的太阳在本文为您仔细讲解Java模板方法的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java模板方法,Java设计模式下面大家一起来学习吧..
  • OpenCV轮廓检测与绘制 OpenCV实现轮廓检测与绘制

    想了解OpenCV实现轮廓检测与绘制的相关内容吗我有一個夢想在本文为您仔细讲解OpenCV轮廓检测与绘制的相关知识和一些Code实例欢迎阅读和指正我们先划重点:OpenCV轮廓检测,OpenCV轮廓绘制,OpenCV轮廓检测绘制下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式