图像特征提取--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


目录
相关文章
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
1月前
|
机器学习/深度学习 人工智能 算法
【MM2024】面向 StableDiffusion 的多目标图像编辑算法 VICTORIA
阿里云人工智能平台 PAI 团队与华南理工大学合作在国际多媒体顶级会议 ACM MM2024 上发表 VICTORIA 算法,这是一种面向 StableDiffusion 的多目标图像编辑算法。VICTORIA 通过文本依存关系来修正图像编辑过程中的交叉注意力图,从而确保关系对象的一致性,支持用户通过修改描述性提示一次性编辑多个目标。
|
5月前
|
算法 计算机视觉
图像处理之积分图应用四(基于局部均值的图像二值化算法)
图像处理之积分图应用四(基于局部均值的图像二值化算法)
536 0
|
1月前
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。
|
2月前
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
4月前
|
机器学习/深度学习 编解码 监控
算法金 | 深度学习图像增强方法总结
**图像增强技术概括** 图像增强聚焦于提升视觉效果和细节,广泛应用于医学、遥感等领域。空间域增强包括直方图均衡化(增强对比度)、对比度拉伸、灰度变换、平滑滤波(均值、中值)和锐化滤波(拉普拉斯、高通)。频率域增强利用傅里叶变换、小波变换,通过高频和低频滤波增强图像特征。现代方法涉及超分辨率重建、深度学习去噪(如CNN、Autoencoder)、图像修复(如GAN)和GANs驱动的多种图像处理任务。
143 14
算法金 | 深度学习图像增强方法总结
|
3月前
|
算法 前端开发 计算机视觉
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的优化实现
42 0
|
3月前
|
自然语言处理 并行计算 算法
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现
44 0
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理