这篇文章主要介绍“JavaOpenCV中SIFT角点检测的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaOpenCV中SIFT角点检测的方法”文章能帮助大家解决问题。

介绍

在某些情况下对图像进行缩放后,角点信息可能会丢失,这时候Harri便不能检测到所有的角点。SIFT(scale-invariant feature transform) 刚好克服了这个问题,对图像特征的检测,尽量不受图像尺寸变化的影响.SIFT并不直接检测关键点。

其中关键点的检测是由DOG(Difference of Gaussians)检测完成的(DOG是通过不同的高斯滤波器对同一张图像进行处理,来得到关键点的)。SIFT仅通过特征向量来描述特征点周围的像素情况。

示例代码

packagecom.xu.opencv;importorg.opencv.core.Core;importorg.opencv.core.Mat;importorg.opencv.core.MatOfKeyPoint;importorg.opencv.core.Scalar;importorg.opencv.features2d.Features2d;importorg.opencv.features2d.SIFT;importorg.opencv.highgui.HighGui;importorg.opencv.imgcodecs.Imgcodecs;importorg.opencv.imgproc.Imgproc;/***@Title:Image.java*@Description:OpenCV-4.0.0测试文件*@Packagecom.xu.Image*@author:hyacinth*@date:2022年2月18日12点20分*@version:V-1.0.0*@Copyright:2019hyacinth*/publicclassImage{static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}publicstaticvoidmain(String[]args){sift();}/***OpenCV-4.1.0SIFT角点检测**@returnvoid*@Author:hyacinth*@Title:harris*@Description:TODO*@date:2022年2月18日12点32分*/publicstaticvoidsift(){Matsrc=Imgcodecs.imread("D:\\OneDrive\\桌面\\1.png");Matgray=newMat();Imgproc.cvtColor(src,gray,Imgproc.COLOR_BGR2GRAY);SIFTsift=SIFT.create(8000);MatOfKeyPointpoint=newMatOfKeyPoint();sift.detect(gray,point);Features2d.drawKeypoints(src,point,src,newScalar(0,0,255),Features2d.DrawMatchesFlags_DRAW_RICH_KEYPOINTS);HighGui.imshow("SIFT角点检测",src);HighGui.waitKey(0);}}效果图

补充

角点检测除了有SIFT算法,还有FAST算法

FAST(Features from Accelerated Segment Test)算法会在像素周围绘制一个圆,圆内包含16个像素,FAST算法是将圆内的像素分别与加上一个阈值的圆心像素作比较,若圈内出现连续的几个像素比加上一个阈值的像素还亮或是暗,则可认为圆心是角点.FAST是一个很有效率的检测算法,但是需要确定阈值参数来检测角点。

BRIEF(Binary Robust Independent Elementary Features)在OpenCV中主要是通过detectAndCompute()来实现,这个函数包含两个部分,检测和计算,同时也返回两个结果.一个是检测到的关键点,一个是描述符.SIFT和SURF也是这样.关键点的描述符包含了图像的关键信息,可看作是图像的另一种表现形式,在比较两个图像的时候可以通过比较两个图像的特征描述来实现.也可以用来做图像特征的匹配。

下面将展示通过FAST算法进行角点检测的示例代码,需要的可以参考一下

packagecom.xu.opencv;importorg.opencv.core.Core;importorg.opencv.core.Mat;importorg.opencv.core.MatOfKeyPoint;importorg.opencv.core.Scalar;importorg.opencv.features2d.Features2d;importorg.opencv.features2d.ORB;importorg.opencv.features2d.SIFT;importorg.opencv.highgui.HighGui;importorg.opencv.imgcodecs.Imgcodecs;importorg.opencv.imgproc.Imgproc;/***@Title:Image.java*@Description:OpenCV-4.0.0测试文件*@Packagecom.xu.Image*@author:hyacinth*@date:2022年2月18日12点20分*@version:V-1.0.0*@Copyright:2019hyacinth*/publicclassImage{static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}publicstaticvoidmain(String[]args){fast();}publicstaticvoidfast(){Matsrc=Imgcodecs.imread("D:\\OneDrive\\桌面\\5.jpeg");Matgray=newMat();Imgproc.cvtColor(src,gray,Imgproc.COLOR_BGR2GRAY);ORBorb=ORB.create(500,1.2f,8,31,0,2,ORB.HARRIS_SCORE,31,20);MatOfKeyPointpoint=newMatOfKeyPoint();orb.detect(gray,point);Features2d.drawKeypoints(src,point,src,newScalar(0,0,255),Features2d.DrawMatchesFlags_DRAW_RICH_KEYPOINTS);HighGui.imshow("FAST角点检测",src);HighGui.waitKey(0);}}

效果图

关于“JavaOpenCV中SIFT角点检测的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。