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
用一张图来说明过程.
第二行的意思是, 由于求的是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
相关文章推荐
- Linux学习之进度条设计progressBar
- linux下支持伪静态和rewrite的实例
- This file is already open in an editor问题的解决方法
- shell编程入门
- 前端菜鸟------自适应网站与响应式网站傻傻分不清
- OpenCV通过cvFindContours与cvDrawCountours函数查找轮廓
- 1. 从系统架构到Hello World
- hadoop 2.4编译、安装
- Opengl笔记之函数汇总
- Opengl教程之 读取obj并绘制在picturecontrol控件内
- linux 配置 Samba 服务器实现文件共享
- Tomcat --> Cannot create a server using the selected type
- Apache James使用的方法及相关心得(转)
- opengl VS环境配置
- linux命令(二)free命令
- 图计算,使用BP反向传播算法Calculus on Computational Graphs: Backpropagation
- nutch+tomcat安装详细教程
- 【U3D】AssetBundle.CreateFromFile()加载资源失败
- Linux——makefile
- windows系统bat方式启动tomcat出现java.lang.OutOfmemoryError:PermGen Space 错误