图像特征提取--ORB算法

简介: 图像特征提取--ORB算法

实时性特征检测

可以分为两个部分:图像特征提取与匹配

ORB(Oriented FAST and Rotated BRIEF)该特征检测算法是在著名的FAST特征检测和BRIEF特征描述子的基础上提出来的,其运行时间远远优于SIFT和SURF,可应用于实时性特征检测。

遇到过这样一个问题,在双目视觉中,使用矫正的两张图片,计算视差时,需要找到匹配点。

自己写了一个基于灰度值的线特征匹配算法,但是效果会受到图像效果的影响,且二值化的阈值是不固定的。

于是就在网上查资料,发现ORB特征匹配算法,速度很快,实时性好,准确度高,非常有帮助。

话不多说:附上我的测试代码

自己配置一下opencv,我这里测试时用的opencv4.1,如果需要,可以联系我。

两张相似的照片,导入路径,即可使用。

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat img1, img2;
void ORB_demo(int, void*);
int main(int argc, char** argv)
{
   img1 = imread("D:/test/box.png");//替换你自己的路径
   img2 = imread("D:/test/box_in_scene.png");
  if (!img1.data|| !img2.data)
  {
    cout << "图片未找到!" << endl;
    return -1;
  }
  namedWindow("ORB_demo",CV_WINDOW_AUTOSIZE);
  ORB_demo(0,0);
  imshow("input image of box",img1);
  imshow("input image of box_in_scene", img2);
  waitKey(0);
  return 0;
}
/*---------------检测与匹配--------------*/
void ORB_demo(int, void *)
{
  int Hession = 400;
  double t1 = getTickCount();
  //特征点提取
  Ptr<ORB> detector = ORB::create(400);
  vector<KeyPoint> keypoints_obj;
  vector<KeyPoint> keypoints_scene;
  //定义描述子
  Mat descriptor_obj, descriptor_scene;
  //检测并计算成描述子
  detector->detectAndCompute(img1, Mat(), keypoints_obj, descriptor_obj);
  detector->detectAndCompute(img2, Mat(), keypoints_scene, descriptor_scene);
  double t2 = getTickCount();
  double t = (t2 - t1) * 1000 / getTickFrequency();
  //特征匹配
  FlannBasedMatcher fbmatcher(new flann::LshIndexParams(20, 10, 2));
  vector<DMatch> matches;
  //将找到的描述子进行匹配并存入matches中
  fbmatcher.match(descriptor_obj, descriptor_scene, matches);
  double minDist = 1000;
  double maxDist = 0;
  //找出最优描述子
  vector<DMatch> goodmatches;
  for (int i = 0; i < descriptor_obj.rows; i++)
  {
    double dist = matches[i].distance;
    if (dist < minDist)
    {
      minDist=dist ;
    }
    if (dist > maxDist)
    {
      maxDist=dist;
    }
  }
  for (int i = 0; i < descriptor_obj.rows; i++)
  {
    double dist = matches[i].distance;
    if (dist < max(2 * minDist, 0.02))
    {
      goodmatches.push_back(matches[i]);
    }
  }
  Mat orbImg;
  drawMatches(img1, keypoints_obj, img2, keypoints_scene, goodmatches, orbImg,
    Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
  //----------目标物体用矩形标识出来------------
  vector<Point2f> obj;
  vector<Point2f>scene;
  for (size_t i = 0; i < goodmatches.size(); i++)
  {
    obj.push_back(keypoints_obj[goodmatches[i].queryIdx].pt);
    scene.push_back(keypoints_scene[goodmatches[i].trainIdx].pt);
  }
  vector<Point2f> obj_corner(4);
  vector<Point2f> scene_corner(4);
  //生成透视矩阵
  Mat H = findHomography(obj, scene, RANSAC);
  obj_corner[0] = Point(0, 0);
  obj_corner[1] = Point(img1.cols, 0);
  obj_corner[2] = Point(img1.cols, img1.rows);
  obj_corner[3] = Point(0, img1.rows);
  //透视变换
  perspectiveTransform(obj_corner, scene_corner, H);
  Mat resultImg=orbImg.clone();
  for (int i = 0; i < 4; i++)
  {
    line(resultImg, scene_corner[i]+ Point2f(img1.cols, 0), scene_corner[(i + 1) % 4]+ Point2f(img1.cols, 0), Scalar(0, 0, 255), 2, 8, 0);
  }
  imshow("result image",resultImg);
  cout << "ORB执行时间为:" << t << "ms" << endl;
  cout << "最小距离为:" <<minDist<< endl;
  cout << "最大距离为:" << maxDist << endl;
  imshow("ORB_demo", orbImg);
}

关于具体的理论部分可以参考下面两篇文章:

参考文章:https://blog.csdn.net/gaotihong/article/details/78712017

参考文章:https://blog.csdn.net/guoyunfei20/article/details/78792770


目录
相关文章
|
7月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
648 0
|
9月前
|
编解码 算法
改进SIFT算法实现光学图像和SAR图像配准
改进SIFT算法实现光学图像和SAR图像配准
|
7月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
362 8
|
8月前
|
存储 监控 算法
基于文化优化算法图像量化(Matlab代码实现)
基于文化优化算法图像量化(Matlab代码实现)
406 1
|
8月前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
8月前
|
机器学习/深度学习 监控 并行计算
【图像增强】局部对比度增强的CLAHE算法直方图增强研究(Matlab代码实现)
【图像增强】局部对比度增强的CLAHE算法直方图增强研究(Matlab代码实现)
1014 0
|
10月前
|
机器学习/深度学习 监控 算法
基于单尺度Retinex和多尺度Retinex的图像增强算法实现
基于单尺度Retinex(SSR)和多尺度Retinex(MSR)的图像增强算法实现
1248 1
|
10月前
|
存储 算法 数据安全/隐私保护
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
本项目基于FPGA实现图像运动模糊算法,包含横向与纵向模糊处理流程。使用Vivado 2019.2与MATLAB 2022A,通过一维卷积模拟点扩散函数,完成图像退化处理,并可在MATLAB中预览效果。
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
11月前
|
存储 算法 数据安全/隐私保护
基于DNA算法的遥感图像加解密matlab仿真
本程序基于DNA算法实现遥感图像加密与解密,利用DNA分子双螺旋结构和碱基配对规则完成信息编码。主要步骤包括图像预处理、DNA编码、DNA操作(杂交、酶切、连接)及密钥生成管理。通过直方图、相关性、熵和解密后图像质量分析验证效果。程序在MATLAB2022A版本运行,具有高效性和安全性,但需解决操作准确性与密钥管理复杂性等挑战。

热门文章

最新文章