Android基于OpenCV实现Harris角点检测

目录
  • 什么是角点?
  • 为什么要检测角点?
  • Harris角点检测
  • API
  • 操作
  • 效果
  • 源码

什么是角点?

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

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

为什么要检测角点?

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

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

源码

github.com/onlyloveyd/…

以上就是Android基于OpenCV实现Harris角点检测的详细内容,更多关于Android OpenCV实现Harris角点检测的资料请关注我们其它相关文章!

(0)

相关推荐

  • OpenCV特征提取与检测之Harris角点检测

    目录 前言 1. 效果图 2. 原理 3. 源码 3.1 Harris角点检测 3.2 精细角点检测 总结 前言 这篇博客将了解什么是特征,角点,哈里斯角点检测(Harris Corner Detection)的概念.并使用cv2.cornerHarris(),cv2.cornerSubPix()实现哈里斯角点检测: 1. 效果图 原图 VS Harris角点检测效果图如下: 原图 VS Harris角点检测效果图如下: 惊细角点效果图如下:Harris角点用红色像素标记,精细角点用绿色像素标记

  • OpenCV哈里斯(Harris)角点检测的实现

    环境 pip install opencv-python==3.4.2.16 pip install opencv-contrib-python==3.4.2.16 理论 克里斯·哈里斯(Chris Harris)和迈克·史蒂芬斯(Mike Stephens)在1988年的论文<组合式拐角和边缘检测器>中做了一次尝试找到这些拐角的尝试,所以现在将其称为哈里斯拐角检测器. 函数:cv2.cornerHarris(),cv2.cornerSubPix() 示例代码 import cv2 impor

  • python 实现Harris角点检测算法

    算法流程: 将图像转换为灰度图像 利用Sobel滤波器求出 海森矩阵 (Hessian matrix) : 将高斯滤波器分别作用于Ix².Iy².IxIy 计算每个像素的 R= det(H) - k(trace(H))².det(H)表示矩阵H的行列式,trace表示矩阵H的迹.通常k的取值范围为[0.04,0.16]. 满足 R>=max(R) * th 的像素点即为角点.th常取0.1. Harris算法实现: import cv2 as cv import numpy as np impo

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

    目录 什么是角点? 为什么要检测角点? Harris角点检测 API 操作 效果 源码 什么是角点? 角点就是极值点,即在某方面属性特别突出的点.当然,你可以自己定义角点的属性(设置特定熵值进行角点检测).角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点.角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.常见的角点有: 灰度梯度的最大值对应的像素点: 两条直线或者曲线的交点: 一阶梯度的导数最大值和梯度方向变化率最大的像素点: 一阶

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

    目录 霍夫直线检测 点和线的对偶性 极坐标参数方程 API 操作 效果 霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的点 共点的直线,在霍夫空间中对应的点在一条直线上 共线的点,在霍夫空间中对应的直线交于一点 极坐标参数方程 对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法.然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的

  • Android基于OpenCV实现QR二维码检测

    目录 QR二维码 QR二维码格式 QR二维码结构 API QRCodeDetector类结构 检测QR二维码 识别QR二维码 检测并识别QR二维码 操作 结果 源码 QR二维码 QR码(英语:Quick Response Code:全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明.QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以快速解码其内容.QR码使用四种标准化编码模式(数字.字母数字.字节(二进制)和日文(Shift_

  • Python中OpenCV图像特征和harris角点检测

    目录 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 概念 第一步:计算一个梯度 Ix,Iy 第二步:整合矩阵,计算特征值 第三步:比较特征值的大小 第四步: 非极大值抑制,把真正的角点留下来,角点周围的过滤掉 代码实现 import cv2 import numpy as np img =cv2.imread('pie.png') print('img.shape',img.

  • OpenCV基于ORB算法实现角点检测

    本文实例为大家分享了OpenCV基于ORB算法实现角点检测的具体代码,供大家参考,具体内容如下 ORB算法是FAST算法和BRIEF算法的结合,ORB可以用来对图像中的关键点快速创建特征向量,并用这些特征向量来识别图像中的对象. 实例化ORB orb = cv.ORB_create(nfeatures) 参数: nfeatures:特征点的最大数量 利用orb.detectAndCompute()检测关键点并计算 kp, des = orb.detectAndCompute(gray, None

  • Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys import logging as log import datetime as dt from time import sleep cascPath = "haarcascade_frontalface_default.xml" faceCascade = cv2.CascadeCla

  • Android基于OpenCV实现图像修复

    目录 API 操作 图像修复 实际应用中,图像常常容易受损,如存在污渍的镜头.旧照片的划痕.人为的涂画(比如马赛克),亦或是图像本身的损坏.将受到损坏的图像尽可能还原成原来的模样的技术,称之为图像修复.所谓修复,就代表图像大部分内容是完好的,所以,图像修复的原理,就是用完好的部分去推断受损部分的信息,特别是完好部分与受损部分的交界处,即受损区域的边缘,在这个推断过程中尤为重要. OpenCV给我们提供了inpaint方法来实现这个功能,并提供了两种图像修复的算法: 基于Navier-Stokes

随机推荐