您的位置:首页 > 运维架构

opencv特征匹配之SSD

2016-04-02 20:10 435 查看
SSD全称Sum of Squared Differences,

用一张图来说明过程.

第二行的意思是, 由于求的是SSD最小值, 可以吧非负数去掉.变号后求其最大值

这样就化为了求correlation最大值的问题



视频截图来源http://crcv.ucf.edu/videos/lectures/2012.php

这是opencv 2 cookbook那本书里的一个内容,
其中用了FastFeatureDetector

过程就是先从第一个图像找特征点, 用个矩形框出来当作模板,
然后与 第二个图像中 所有以特征点为中心的矩形框内的 图像比较是否能匹配.

我用书上的程序出了很多错误, 这里都调试好了, 结果在下面

我不知道是不是版本原因, 书上下面这一条始终是使用不了

cv::FastFeatureDetector fastDet(80);

----------------------------

QT提示 error: no matching function for call to 'cv::FastFeatureDetector::FastFeatureDetector(int)'

cv::FastFeatureDetector fastDet(80);

^

----------------------------

我们看看这个类的定义

class FastFeatureDetector : public FeatureDetector

Wrapping class for feature detection using the FAST() method.

class FastFeatureDetector : public FeatureDetector

{

public:

FastFeatureDetector( int threshold=1, bool nonmaxSuppression=true, type=FastFeatureDetector::TYPE_9_16 );

virtual void read( const FileNode& fn );

virtual void write( FileStorage& fs ) const;

protected:

...

};

------------------------------------------------------------

c++水平有限, 但是看了这个类的定义, 并没有看出这样的使用方法. 我不太自信,

又定义了指针 (为什么用setThreshold(80)呢?

我能找到成员和成员函数呢? 因为qt会自动补齐按下. 或者->都会对应去找)

cv::Ptr<cv::FastFeatureDetector> fastDet;

fastDet->setThreshold(80); ....

编译通过, 但是运行错误.没办法, 不死心又把它定义成了FeatureDector 变量 以及指针, 一样的结果.

上面说了, 封装在 FAST()里, 那就看看FAST(), 一看果然有可以自选type, 就用了FAST()

------------

实际上现在我对"没有这个用法"还是有点怀疑的, 如果哪天解决了再回来修改.

---------------------------------------------------------------

出现

OpenCV Error: Assertion failed (i1 >= 0 && i1 < static_cast<int>(keypoints1.size())) in drawMatches, file /home/tau/opencv/opencv-3.1.0/modules/features2d/src/draw.cpp, line 209

这个没有记录更改的地方, 就不说了, 照着逻辑一条一条往下扒就行了.

----------------------------------------------------------------

还有一个地方, 就是他用了matches.erase(matches.begin()+25,matches.end());

我用这条时编译通过, 但是运行提示Segmentation fault (core dumped)

这个错误叫我好找阿, 一开始以为又是opencv函数内的问题, 应该是指针越界了,begin()+25这个地方

作者可能是只想找前25个特征点来匹配

--------------------------------

上效果

原图已删, 和下图相近

可以看到效果并不是太好, 我对这些参数没有研究, 最近也没什么时间来一点点试验

完整代码 我的github 传送门

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------



如果 是一样的图片那效果必须很好阿

上一样的图



难道是patch选太小了吗



patch调大后虽然有些改变, 误匹配还是太多了, 不能接受

这两天用sift, surf ,ORB 之类的试下,

opencv虽然都有相应的函数, 但是现在都已经移到opencv_contrib 额外包上去了

光调用函数也不是个办法, 先学学算法再说吧

---------------------2016.04.13 21: 30

看到有说归一化的, 归一化了一下



结果是全部误匹配.

什么原因呢?

看了归一化后的patch, 全部是黑色的!! 归一化最大值是1! SSD 方法相差的并不多

换种方式呢? correlation 还是不怎么好



所以这些方法(SSD,cross correlation等) 效果哪个好还真不好说

感觉都不太好. 当然了, 这两个图片还是不一样的, 无论是光照,角度,尺度

--------------2016.4.13 22:27
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: