opencv ORB各参数的含义

ORB中有很多参数可以设置,在OpenCV中它可以通过ORB来创建一个ORB检测器。

ORB::ORB(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31)

下面介绍一下各个参数的含义:

nfeatures - 最多提取的特征点的数量;

scaleFactor - 金字塔图像之间的尺度参数,类似于SIFT中的kk

nlevels – 高斯金字塔的层数;

edgeThreshold – 边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘edgeThreshold以内的像素是不检测特征点的。

firstLevel - 看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。

WET_K - 用于产生BIREF描述子的 点对的个数,一般为2个,也可以设置为3个或4个,那么这时候描述子之间的距离计算就不能用汉明距离了,而是应该用一个变种。OpenCV中,如果设置WET_K = 2,则选用点对就只有2个点,匹配的时候距离参数选择NORM_HAMMING,如果WET_K设置为3或4,则BIREF描述子会选择3个或4个点,那么后面匹配的时候应该选择的距离参数为NORM_HAMMING2。

scoreType - 用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择FAST_SCORE,但是它也只是比前者快一点点而已。

patchSize – 用于计算BIREF描述子的特征点邻域大小

转载于:https://www.cnblogs.com/luoyinjie/p/7219328.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Java OpenCV 中使用 ORB 算法进行图像比对可以分为以下几个步骤: 1. 加载两张待比对的图像并转换为灰度图像。 2. 使用 ORBDetector 类中的 detectAndCompute 方法对两张灰度图像进行特征提取。 3. 使用 BFMatcher 类中的 match 方法对两张图像的特征点进行匹配,并计算匹配度。 4. 根据匹配度进行筛选,得到最佳匹配的特征点。 下面是一个简单的示例代码: ```java import org.opencv.core.*; import org.opencv.features2d.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class ORBMatch { public static void main(String[] args) { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Mat img1 = Imgcodecs.imread("path/to/image1.jpg"); Mat img2 = Imgcodecs.imread("path/to/image2.jpg"); Mat gray1 = new Mat(); Mat gray2 = new Mat(); Imgproc.cvtColor(img1, gray1, Imgproc.COLOR_BGR2GRAY); Imgproc.cvtColor(img2, gray2, Imgproc.COLOR_BGR2GRAY); MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); Mat descriptors1 = new Mat(); Mat descriptors2 = new Mat(); ORB orb = ORB.create(); orb.detectAndCompute(gray1, new Mat(), keypoints1, descriptors1); orb.detectAndCompute(gray2, new Mat(), keypoints2, descriptors2); BFMatcher matcher = BFMatcher.create(NORM_HAMMING, true); MatOfDMatch matches = new MatOfDMatch(); matcher.match(descriptors1, descriptors2, matches); double max_dist = 0; double min_dist = 100; DMatch[] dmatches = matches.toArray(); for (int i = 0; i < dmatches.length; i++) { double dist = dmatches[i].distance; if (dist < min_dist) { min_dist = dist; } if (dist > max_dist) { max_dist = dist; } } System.out.println("Max distance: " + max_dist); System.out.println("Min distance: " + min_dist); LinkedList<DMatch> good_matches = new LinkedList<DMatch>(); for (int i = 0; i < dmatches.length; i++) { if (dmatches[i].distance <= 2 * min_dist) { good_matches.addLast(dmatches[i]); } } Mat img_matches = new Mat(); Features2d.drawMatches(img1, keypoints1, img2, keypoints2, good_matches, img_matches); Imgcodecs.imwrite("path/to/output.jpg", img_matches); } } ``` 以上代码实现了 ORB 算法的图像比对,并将匹配结果输出到一张图像中。其中,NORM_HAMMING 是匹配算法的类型,true 表示使用交叉检查法进行匹配。根据实际需求,可以调整这些参数来改善匹配结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值