什么是角点?

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

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

为什么要检测角点?

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

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角点检测的资料请关注Devmax其它相关文章!

Android基于OpenCV实现Harris角点检测的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  4. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  5. Ionic – Splash Screen适用于iOS,但不适用于Android

    我有一个离子应用程序,其中使用CLI命令离子资源生成的启动画面和图标iOS版本与正在渲染的启动画面完美配合,但在Android版本中,只有在加载应用程序时才会显示白屏.我检查了config.xml文件,所有路径看起来都是正确的,生成的图像出现在相应的文件夹中.(我使用了splash.psd模板来生成它们.我错过了什么?这是config.xml文件供参考,我觉得我在这里做错了–解决方法在config.xml中添加以下键:它对我有用!

  6. ios – 无法启动iPhone模拟器

    /Library/Developer/CoreSimulator/Devices/530A44CB-5978-4926-9E91-E9DBD5BFB105/data/Containers/Bundle/Application/07612A5C-659D-4C04-ACD3-D211D2830E17/ProductName.app/ProductName然后,如果您在Xcode构建设置中选择标准体系结构并再次构建和运行,则会产生以下结果:dyld:lazysymbolbindingFailed:Symbol

  7. iOS使用openCV检测来自摄像头的矩形

    如果我在处理它之前克隆matimage,通过记录它,它似乎处理图像甚至找到矩形,但矩形不会被绘制到图像输出到imageView.我很确定我错过了一些东西,可能是因为我没有正确传递某个对象,指向对象的指针等等,而我需要修改的对象则没有.无论如何,如果这不是正确的方法,我真的很感谢他们做这样的事情的教程或例子,使用openCV或GPUImage…它不需要尝试使用matimage来设置imageView.image,而只需要将matimage转换为在imageView中实际修改,因为CvVideoCamera已

  8. Xamarin iOS图像在Grid内部重叠

    heyo,所以在Xamarin我有一个使用并在其中包含一对,所有这些都包含在内.这在Xamarin.Android中看起来完全没问题,但是在Xamarin.iOS中,图像与标签重叠.我不确定它的区别是什么–为什么它在Xamarin.Android中看起来不错但在iOS中它的全部都不稳定?

  9. 使用Xcode为OS X Lion / Mountain Lion编译OpenCV(2.3.1)

    任何人都可以为我提供一些如何使用Xcode在OSXLion上编译OpenCV2.3.1的详细指南吗?我对此感到生气…我得到了源码,使用cmake创建Xcode模板并尝试构建它,但它失败了大约200个错误.提前致谢,大教堂解答我的回答帖子.解决方法详细指南如何使用MacPorts在Xcode4.2.1的OSXLion下启动和运行OpenCV2.3.1编辑08/06/2012:这也适用于OpenCV2.4.1.只需确保您获得最新版本的Xcode并安装“命令行工具”.编辑15/08/2012:使用Mountai

  10. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部