局部二值模式lbp_二进制bep差异原因比例最高

局部二值模式lbp_二进制bep差异原因比例最高LDB简介局部差异二进制LDB(LocalDifferenceBinary)是一种高效,健壮且独特的二进制描述符

LDB简介

局部差异二进制 LDB(Local Difference Binary)是一种高效,健壮且独特的二进制描述符。
LDB的独特性和稳健性通过3个步骤实现:
第一,LDB通过一组二进制测试捕获每个图像块的内部模式,每个二进制测试比较图像块内图像网格的平均强度 Iavg I a v g 和一阶梯度 dx d x dy d y (图a和图b)。
第二,LDB采用多网格策略来捕获不同空间粒度的结构(图c)。粗级网格可以消除高频噪声,而精细级别的网格可以捕获详细的局部模式,从而增强独特性。这样不同的网格密度可以捕获不同的空间结构。
第三,LDB选择高变量和独特位的子集并将它们连接起来以形成紧凑且唯一的LDB描述符。
这里写图片描述

libLDB是 一个C ++库,用于从图像块中提取二进制特征 – LDB(局部差异二进制)。源代码可以从官网LDB – Local Difference Binary An Ultrafast and Distinctive Binary Feature Description上下载。
libLDB中LDB特征提取的工作流程:
这里写图片描述

libLDB配置

环境:Win7+VS2012+OpenCV2.4.10
从官网上下载可得到ldb_final文件夹下如下内容:
这里写图片描述
新建一个win32控制台程序,选择空项目;然后按照OpenCV配置步骤依次配置好当前的“包含目录”、“库目录”以及“连接器”下“输入”中的“附加依赖项”,如图:

这里写图片描述这里写图片描述
然后将ldb_final文件夹下的include、src文件夹复制到当前工程目录下。然后分别右键选择‘头文件’、‘源文件’分别添加include下的ldb.h和src下的ldb.cpp、main.cpp。
然后,打开‘项目属性’——>’配置属性’——>‘调试’——>‘命令参数’;根据当前example文件夹下两个图片的实际地址,添加命令参数(如 “E://example//paris1.jpg” “E://example//paris2.jpg” 1),如图:
这里写图片描述
运行,可看到结果如图:
这里写图片描述
这里写图片描述

源码查看

文件main.cpp:

#include<vector>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>

#include"ldb.h"
#include<opencv2/calib3d/calib3d.hpp>

using namespace std;
using namespace cv;


int main(int argc, char** argv)
{
  if(argc<3){
     printf("Usage: %s img_1 img_2 flag\nflag: 1 - dominant orientation is computed.\n 0 - dominant orientation is not computed.\n", argv[0]);
     return -1;
  }
  const char* imgName_1=argv[1];
  const char* imgName_2=argv[2];
  bool flag=atoi(argv[3]);

  // 加载图像
  Mat image_1, image_2, mat_show, descriptors_1, descriptors_2, out_img;
  vector<Point2f> obj, scene;  
  image_1 = imread(imgName_1, CV_LOAD_IMAGE_GRAYSCALE);
  image_2 = imread(imgName_2, CV_LOAD_IMAGE_GRAYSCALE);

  if(!image_1.data){
      cout << "fail to load " << argv[1] << endl;
      return -1;
  } 
  if(!image_2.data){
      cout << "fail to load " << argv[2] << endl;
      return -1;
  }

  //ORB关键点检测
  ORB orb;
  vector<KeyPoint> keypoints_1, keypoints_2;
  orb(image_1, Mat(), keypoints_1, descriptors_1);
  orb(image_2, Mat(), keypoints_2, descriptors_2);

  //计算LDB描述符
  LDB ldb(48);
  ldb.compute(image_1, keypoints_1, descriptors_1, flag);
  ldb.compute(image_2, keypoints_2, descriptors_2, flag);

  //关键点匹配
  DescriptorMatcher* pMatcher = new BFMatcher(NORM_HAMMING, false);
  vector< vector<DMatch> > matches;
  vector<DMatch> good_matches;
  pMatcher->knnMatch(descriptors_1, descriptors_2, matches, 2);
  delete pMatcher;

  for(unsigned int i=0; i<matches.size(); i++){
    if(matches[i][0].distance < 0.8*matches[i][1].distance){
       good_matches.push_back(matches[i][0]);
    }
  }
  drawMatches(image_1, keypoints_1, image_2, keypoints_2, good_matches, out_img);
  imshow("Match", out_img);
  imwrite("match.jpg", out_img);
  waitKey(0);

  //RANSAC几何验证
  if(good_matches.size() < 4){
       cout << "insufficient matches for RANSAC verification" << endl;
       return -1;
  } 
  for(unsigned int i = 0; i < good_matches.size(); i++)  
  {  
     obj.push_back( keypoints_1[ good_matches[i].queryIdx ].pt );  
     scene.push_back( keypoints_2[ good_matches[i].trainIdx ].pt );   
  }  
  //计算srcPoints到dstPoints最合适的透视转换映射 
  Mat H = findHomography( obj, scene, CV_RANSAC );

  vector<Point2f> obj_corners(4), scene_corners(4);
  obj_corners[0] = cvPoint(0,0); obj_corners[1] = cvPoint( image_1.cols, 0 );
  obj_corners[2] = cvPoint( image_1.cols, image_1.rows ); obj_corners[3] = cvPoint( 0, image_1.rows );
  //输入多通道矩阵,执行每个元素的透视变换
  perspectiveTransform(obj_corners, scene_corners, H);

  line( out_img, scene_corners[0] + Point2f( image_1.cols, 0), scene_corners[1] + Point2f( image_1.cols, 0), Scalar(0, 255, 0), 4 );
  line( out_img, scene_corners[1] + Point2f( image_1.cols, 0), scene_corners[2] + Point2f( image_1.cols, 0), Scalar(0, 255, 0), 4 );
  line( out_img, scene_corners[2] + Point2f( image_1.cols, 0), scene_corners[3] + Point2f( image_1.cols, 0), Scalar(0, 255, 0), 4 );
  line( out_img, scene_corners[3] + Point2f( image_1.cols, 0), scene_corners[0] + Point2f( image_1.cols, 0), Scalar(0, 255, 0), 4 );

  //显示匹配结果
  imshow( "Good Matches & Object detection", out_img );
  imwrite("goodmatch.jpg", out_img);
  waitKey(0);
  return 0;
}

  • Local Difference Binary for Ultrafast and Distinctive Feature Description

  • 官网:LDB – Local Difference Binary An Ultrafast and Distinctive Binary Feature Description

  • libLDB: A Library for Extracting Ultrafast and Distinctive Binary Feature Description

今天的文章局部二值模式lbp_二进制bep差异原因比例最高分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/83488.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注