双目和多目摄像头对齐与拼接

双目摄像头或者多目组合摄像头因为组装工艺原因可能会有瑕疵,表现在拍照录相上是图像焦点不在一个水平线或者垂直线,一般场合勉强可用,对精度有要求的场合,需要校正。比如使双目图像录相处于同一水平线,多目拼接也需要找到共同点合并。这可以使用opencv实现,寻找不同图像的相似点,进一步调优,通过比较相以点的坐标,计算出偏移,在拍照和录相时进行校正。

public static Mat FeatureOrbLannbased(Mat src, Mat dst) {
		FeatureDetector fd = FeatureDetector.create(FeatureDetector.ORB);
		DescriptorExtractor de = DescriptorExtractor.create(DescriptorExtractor.ORB);
		DescriptorMatcher Matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_L1);

		MatOfKeyPoint mkp = new MatOfKeyPoint();
		fd.detect(src, mkp);
		Mat desc = new Mat();
		de.compute(src, mkp, desc);
		Features2d.drawKeypoints(src, mkp, src);

		MatOfKeyPoint mkp2 = new MatOfKeyPoint();
		fd.detect(dst, mkp2);
		Mat desc2 = new Mat();
		de.compute(dst, mkp2, desc2);
		Features2d.drawKeypoints(dst, mkp2, dst);

		// Matching features
		MatOfDMatch Matches = new MatOfDMatch();
		Matcher.match(desc, desc2, Matches);
		// 筛选点
		double maxDist = Double.MIN_VALUE;
		double minDist = Double.MAX_VALUE;
		DMatch[] mats = Matches.toArray();

		for (int i = 0; i < mats.length; i++) {
			double dist = mats[i].distance;
			if (dist < minDist) {
				minDist = dist;
			}
			if (dist > maxDist) {
				maxDist = dist;
			}
		}
		System.out.println("Min Distance:" + minDist);
		System.out.println("Max Distance:" + maxDist);
		List<DMatch> goodMatch = new LinkedList<>();
		KeyPoint[] smkp = mkp.toArray();
		KeyPoint[] dmkp = mkp2.toArray();
		// double[] arr = new double[mats.length];
		List<Double> list = new ArrayList<>();
		for (int i = 0; i < mats.length; i++) {
			// 相似度,越小越相似
			System.out.println("mats[i].distance:" + mats[i].distance);
			// 原始点坐标
			System.out.println("smkp x:" + smkp[mats[i].queryIdx].pt.x);
			System.out.println("smkp y:" + smkp[mats[i].queryIdx].pt.y);

			// 目标点坐标
			System.out.println("dmkp x:" + dmkp[mats[i].trainIdx].pt.x);
			System.out.println("dmkp y:" + dmkp[mats[i].trainIdx].pt.y);
			//对相似性最高的坐标过滤
			if ((mats[i].distance >= minDist) && (mats[i].distance < minDist + 100f)) {
				goodMatch.add(mats[i]);
				list.add(dmkp[mats[i].trainIdx].pt.y - smkp[mats[i].queryIdx].pt.y);
			}
		}

		Matches.fromList(goodMatch);
		// Show result
		Mat OutImage = new Mat();
		Features2d.drawMatches(src, mkp, dst, mkp2, Matches, OutImage);

		double[] arr = convert2doubleArray(list.toArray(new Double[list.size()]));
		//获取Y轴偏差
		countMatches(arr);

		return OutImage;
	}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值