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