Android基于OpenCV实现Harris角点检测

作者:易冬 时间:2023-07-16 12:19:47 

目录
  • 什么是角点?

  • 为什么要检测角点?

  • Harris角点检测

  • API

  • 操作

  • 效果

  • 源码

什么是角点?

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

  • 灰度梯度的最大值对应的像素点;

  • 两条直线或者曲线的交点;

  • 一阶梯度的导数最大值和梯度方向变化率最大的像素点;

  • 一阶导数最大,二阶导数为零的像素点(指示物体边缘变化不连续的方向)。

为什么要检测角点?

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

Harris角点检测

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

Android基于OpenCV实现Harris角点检测

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

Android基于OpenCV实现Harris角点检测

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

Android基于OpenCV实现Harris角点检测

Android基于OpenCV实现Harris角点检测

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

Android基于OpenCV实现Harris角点检测

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,邻域大小。

  • 参数四:ksize,Sobel算子的半径。

  • 参数五: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的角点检测结果。代码中的参数可自行调整测试。

Android基于OpenCV实现Harris角点检测

源码

github.com/onlyloveyd/…

来源:https://juejin.cn/post/6976746764082610206

标签:Android,OpenCV,Harris角点检测
0
投稿

猜你喜欢

  • Android Service启动流程刨析

    2023-07-31 11:28:58
  • Android 背景透明度设置总结

    2023-06-06 04:31:13
  • Springboot打包为Docker镜像并部署的实现

    2023-06-05 23:11:52
  • 详解Spring Boot的GenericApplicationContext使用教程

    2021-06-09 14:05:40
  • Spring Boot中配置定时任务、线程池与多线程池执行的方法

    2021-08-08 13:31:30
  • Java实现小型图书馆管理系统

    2021-06-14 04:27:35
  • C# PDF Page操作设置页面切换按钮的方法

    2021-11-18 04:33:43
  • SpringBoot 多Profile使用与切换方式

    2022-04-13 14:58:27
  • C# WinForm中禁止改变窗口大小的方法

    2022-03-03 21:42:09
  • C#操作session的类实例

    2023-07-17 13:57:19
  • Android搭建grpc环境过程分步详解

    2023-02-16 01:41:31
  • SpringBoot @Cacheable自定义KeyGenerator方式

    2022-12-25 13:23:11
  • Java中接收键盘输入的三种方法

    2023-11-13 16:11:29
  • HashMap原理及手写实现部分区块链特征

    2023-10-15 03:27:27
  • C#实现简单点餐系统

    2021-06-27 22:00:56
  • SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发

    2022-07-26 20:39:48
  • Android选项菜单用法实例分析

    2022-11-02 07:42:44
  • C#如何从byte[]中直接读取Structure实例详解

    2021-11-07 22:02:00
  • Android 源码浅析RecyclerView ItemAnimator

    2022-04-20 19:47:41
  • springboot+vue部署按照及运行方法

    2023-07-15 06:16:09
  • asp之家 软件编程 m.aspxhome.com