㈠ 图像匹配算法surf 的c#版(Matlab版也一样)和opencv版中,参数形式不同,求对应关系啊
参考这个:http://kb.cnblogs.com/page/42226/
㈡ 如何使用opencv实现图像匹配
在VSLAM中得常见方法是提取特征点(SIFT ORB什么的都可以),计算BoW,通过比较BoW来比较图像的相似度。我们测试过用GoogleNet深度网络来提取特征,再进行图像相似度比较,效果比BoW要好一些。
㈢ opencv 图像匹配问题
变形是随机的吗?可将模板也变形后在搜索?
㈣ opencv 中自带的模板匹配算法出处
方法如下:
使用OPENCV下SIFT库做图像匹配的例程
// opencv_empty_proj.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//从文件中读入图像
Mat img = imread(imagename);
Mat img2=imread("img2.jpg");
//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
if(img2.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//显示图像
imshow("image before", img);
imshow("image2 before",img2);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
㈤ 图像匹配 Opencv 谁能跟我讲解一下 CalcEMD2()函数,我看书上写得比较专业,术语多,俺又看得不是很明。
这个函数没用过,你最好还是看看示例程序吧。
两个加权点集之间计算最小工作距离
float cvCalcEMD2( const CvArr* signature1, const CvArr* signature2, int distance_type,
CvDistanceFunction distance_func=NULL, const CvArr* cost_matrix=NULL,
CvArr* flow=NULL, float* lower_bound=NULL, void* userdata=NULL );
typedef float (*CvDistanceFunction)(const float* f1, const float* f2, void* userdata);
signature1
第一个签名,大小为 size1×(dims+1) 的浮点数矩阵,每一行依次存储点的权重和点的坐标。矩阵允许只有一列(即仅有权重),如果使用用户自定义的代价矩阵。
signature2
第二个签名,与 signature1 的格式一样size2×(dims+1),尽管行数可以不同(列数要相同)。当一个额外的虚拟点加入 signature1 或 signature2 中的时候,权重也可不同。
distance_type
使用的准则, CV_DIST_L1, CV_DIST_L2, 和 CV_DIST_C 分别为标准的准则。 CV_DIST_USER 意味着使用用户自定义函数 distance_func 或预先计算好的代价矩阵 cost_matrix 。
distance_func
用户自定义的距离函数。用两个点的坐标计算两点之间的距离。
cost_matrix
自定义大小为 size1×size2 的代价矩阵。 cost_matrix 和 distance_func 两者至少有一个必须为 NULL. 而且,如果使用代价函数,下边界无法计算,因为它需要准则函数。
flow
产生的大小为 size1×size2 流矩阵(flow matrix): flowij 是从 signature1 的第 i 个点到 signature2 的第 j 个点的流(flow)。
lower_bound
可选的输入/输出参数:两个签名之间的距离下边界,是两个质心之间的距离。如果使用自定义代价矩阵,点集的所有权重不等,或者有签名只包含权重(即该签名矩阵只有单独一列),则下边界也许不会计算。用户必须初始化 *lower_bound. 如果质心之间的距离大于获等于 *lower_bound (这意味着签名之间足够远), 函数则不计算 EMD. 任何情况下,函数返回时 *lower_bound 都被设置为计算出来的质心距离。因此如果用户想同时计算质心距离和T EMD, *lower_bound 应该被设置为 0.
userdata
传输到自定义距离函数的可选数据指针
函数 cvCalcEMD2 计算两个加权点集之间的移动距离或距离下界。在 [RubnerSept98] 中所描述的其中一个应用就是图像提取得多维直方图比较。 EMD 是一个使用某种单纯形算法(simplex algorithm)来解决的交通问题。其计算复杂度在最坏情况下是指数形式的,但是平均而言它的速度相当快。对实的准则,下边界的计算可以更快(使用线性时间算法),且它可用来粗略确定两个点集是否足够远以至无法联系到同一个目标上
㈥ opencv关于像素点的图像匹配算法
首先,建议你将图像中感兴趣区域(比如上图中的字母)取出来进行归一化,然后在进行匹配率计算。这是因为周围环境会对匹配率产生影响。
其次,建议你将匹配率算法改成Hausdorff距离https://en.wikipedia.org/wiki/Hausdorff,这样对图像有些平移什么的都不怎么敏感了。
㈦ 如何使用opencv实现图像匹配
如果仅有一张图片的样本的话,很难实现。
识别图片的过程大概是:
提取特征
训练样本,得到模型
使用模型判断
如果题主想速成的话,还是去下现成代码吧。。。
回答不容易,希望能帮到您,满意请帮忙采纳一下,谢谢 !
㈧ 使用OpenCV进行模板匹配(原图-模板图)
匹配算法有很多,比如最简单的对比原图和模板图的像素值。
但是这种方法稍微有一点旋转和光照变化结果就会很差。
为了改进这个,有了SAD算法。
然后SAD相似的SSD。
再然后是计算区域互相关性的NCC算法。
以上三种算法中,SAD算法最简单,因此当模板大小确定后,SAD算法的速度最快。NCC算法与SAD算法相比要复杂得多。
至于算法的过程,这三个算法都是很好理解的算法,我觉得还是自学比较好。
㈨ 如何使用opencv实现图像匹配
OpenCV中有一些已经实现的匹配库。一般是先寻找特征点,然后匹配特征点。
寻找特征点一般有Harris(opencv中函数:cornerHarris),FAST(opencv中函数:FastFeatureDetector)等,匹配主要有SURF,SIFT等。可查阅OpenCV使用手册学习调用,同时Opencv也有一些例子,可参考一下。
㈩ opencv 图像旋转后的匹配怎么做
如果是基于特征点对图像进行匹配的话,建议选用带有方向信息的特征提取算法,这样每一个特征点在提取特征的时候都会计算出一个主方向,这个主方向与图像的旋转无关,而是与特征点周围像素的梯度相关,这样在处理旋转图像时就不必再考虑图像的旋转方向了。