opencv提取surf特征点出现的错误
opencv实现surf特征的提取。本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程。
首先,我把提取surf特征的过程整合成了一个函数,我单独建立一个project读取两张图片,然后调用这个surf提取的函数时时不管是debug还是release模式下都是没有问题的。当我把这个函数加入到我如今已有的project代码里面的时候出现了各种奇葩错误。以下是我surf特征提取的函数
void surfdetect(IplImage *image1,IplImage *image2)
{
using namespace std;
//IplImage *image1,*image2;
//image1 = cvLoadImage("lena1.jpg");
//image2= cvLoadImage("lena2.jpg"); cv::SurfFeatureDetector detector;
cv::SurfDescriptorExtractor descriptor_extractor;
cv::BruteForceMatcher<cv::L2<float> > descriptor_matcher; //提取特征点
std::vector<cv::KeyPoint> keypoints1,keypoints2;
detector.detect( image1, keypoints1 );//检測img1中的Surf特征点。存储到keypoints1中
detector.detect( image2, keypoints2 );
cout<<"图像1特征点个数:"<<keypoints1.size()<<endl;
cout<<"图像2特征点个数:"<<keypoints2.size()<<endl; //依据特征点计算特征描写叙述子矩阵。即特征向量矩阵
cv::Mat descriptors1,descriptors2;
descriptor_extractor.compute( image1, keypoints1, descriptors1 );
descriptor_extractor.compute( image2, keypoints2, descriptors2 ); cv::Mat img_keypoints1,img_keypoints2;
drawKeypoints(image1,keypoints1,img_keypoints1);
drawKeypoints(image2,keypoints2,img_keypoints2);
//imshow("Src1",img_keypoints1);
//cv::waitKey(6000);
//imshow("Src2",img_keypoints2);
//cv::waitKey(6000); std::vector<cv::DMatch> matches;//匹配结果
descriptor_matcher.match( descriptors1, descriptors2, matches );//匹配两个图像的特征矩阵
cout<<"Match个数:"<<matches.size()<<endl;
cv::Mat img_matches1,img_matches2;
cv::drawMatches(image1,keypoints1,image2,keypoints2,matches,img_matches1);
imshow("粗匹配",img_matches1);
cv::waitKey(0); double max_dist = 0;
double min_dist = 100;
for(int i=0; i<matches.size(); i++)
{
double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
cout<<"最大距离:"<<max_dist<<endl;
cout<<"最小距离:"<<min_dist<<endl; //筛选出较好的匹配点
std::vector<cv::DMatch> goodMatches;
for(int i=0; i<matches.size(); i++)
{
if(matches[i].distance < 0.05 * max_dist)
{
goodMatches.push_back(matches[i]);
}
}
cout<<"goodMatch个数:"<<goodMatches.size()<<endl;
cv::drawMatches(image1,keypoints1,image2,keypoints2,goodMatches,img_matches2);
imshow("精匹配",img_matches2);
cv::waitKey(00); }
SURF特征提取的整个代码都在上面了。可当我把这个函数在我已有的project中调用的时候,出现了一下错误
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2dmXzkwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
经百度说出现这样的错误是内存问题,要么就是内存木有释放,要么就是两个指针指向同一个内存。一个指针把它释放掉了等等,于是我在代码里面找了非常久,改了很多遍 也没有解决,最后我发现我把代码中的vector
std::vector<cv::KeyPoint> keypoints1,keypoints2;
cv::Mat descriptors1,descriptors2;
std::vector<cv::DMatch> matches;//匹配结果
std::vector<cv::DMatch> goodMatches;
从函数中拿出来,作为全局变量,问题尽然攻克了,事实上我都没想明确这是什么原因。
vector里面的内存不是不须要手动释放的吗,话说当其在函数里面作为局部变量的时候我也尝试过释放它,先是clear。后来发现clear不能释放其内存。于是我依照网上说的用swap来手动释放,但是终于还是没用。最后误打误撞的,把它作为全局变量,问题才得以解决,只是攻克了就好。
在debug底下程序已经能够执行了,全都通过了。可接下来,我在release底下又遇到错误了。错误类型例如以下:
网上说这样的我是加入opencv库的时候加入错了,我细致看了我的additional dependencies的加入。在release底下我确实没带d啊。可怎么就是出现了这样的错误呢,要是是程序有问题,那怎么debug底下能够执行呢。我非常纳闷,尝试了非常多方法。最后抱着试试的态度,干脆把release和debug底下都加入了带d的库文件,奇葩的是问题尽然结局了。对于这我仅仅能表示相当无语啊。
opencv提取surf特征点出现的错误的更多相关文章
- 【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨) ...
- OpenCV图像Surf与flann特征点(转载)
Surf(Speed Up Robust Feature) Surf算法的原理 ...
- OpenCV特征点提取----Fast特征
1.FAST(featuresfrom accelerated segment test)算法 http://blog.csdn.net/yang_xian521/article/details/74 ...
- 【OpenCV新手教程之十七】OpenCV重映射 & SURF特征点检測合辑
本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/30974513 作者:毛星云(浅墨) ...
- Opencv中使用Surf特征实现图像配准及对透视变换矩阵H的平移修正
图像配准需要将一张测试图片按照第二张基准图片的尺寸.角度等形态信息进行透视(仿射)变换匹配,本例通过Surf特征的定位和匹配实现图像配准. 配准流程: 1. 提取两幅图像的Surf特征 2. 对Sur ...
- OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- opencv::SURF特征
SURF特征基本介绍 SURF(Speeded Up Robust Features)特征关键特性: -特征检测 -尺度空间 -选择不变性 -特征向量 工作原理 . 选择图像中POI(Points o ...
- 基于SURF特征的图像与视频拼接技术的研究和实现(一)
基于SURF特征的图像与视频拼接技术的研究和实现(一) 一直有计划研究实时图像拼接,但是直到最近拜读西电2013年张亚娟的<基于SURF特征的图像与视频拼接技术的研究和实现>,条 ...
- SURF特征
了解了SIFT特征后,来学习SURF特征. 虽说是SIFT的一个变种,可是跟SIFT还是有差别的 差别有例如以下: 1.尺度空间的构建(近似)不同. 2.同意尺度空间多层图像同一时候被处理 3.特征点 ...
随机推荐
- Storm中log4j日志打印不出来的解决办法
使用storm命令启动JAVA进程的时候,发现log4j日志打印不出来,咋办呢? 解决办法如下(亲测): 删除strom/lib目录下的log4j-over-slf4j-1.6.6.jar strom ...
- CSS中的HSLA颜色
CSS 中的颜色可以由RGB色彩空间和HSL色彩空间两种方式来表述.其中我们常用的是RGB色彩空间,RGB色彩空间的颜色表示方式有:十六进制颜色(如红色:#FF0000).RGB颜色(如红色:rgb( ...
- String、ANSIString、PChar及TBytes之间的转换 BytesOf move stringof
一.string转为ansistring 1.直接赋值 (有警告)2.ansistring()类型强制转换.(无警告) 二.ansistring 转为string 1.直接赋值 (有警告)2.stri ...
- hdu 1932(spfa)
XYZZY Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3694 Accepted: 1059 Description ...
- shipyard, swarm看到你,我才睡觉:)
windows下用boot2docker有点不爽,就是网卡识别不好. 还是用纯的virtualbox建centos7虚拟机来搞, 一下就OK. 但记得,要用Iptables来弄墙,去掉firewall ...
- (二)mysql忘记root密码
(1)mysql 5.7.6以前版本 修改配置文件vim /etc/my.cnf [mysqld] skip-grant-tables 重启mysql systemctl restart mysqld ...
- C++的Public.lib(Public.dll) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'
今天开始编译网游服务器,找前辈借来批处理文件,版本控制上拿下代码,库等一系列资源,尼玛啊,编译出错: Public.lib(Public.dll) : fatal error LNK1112: mod ...
- Web开发基础(读书笔记)
读书笔记:简单+基础 HTML(hyper Text Markup Language,超文本标记语言) URL(Uniform Resource Locator,统一资源定位器)构成3部分:协议/主机 ...
- Android Studio查找功能(搜索功能)
F3 向下查找关键字出现位置 Shift+F3 向上一个关键字出现位置 2.在当前工程内查找文本[Ctrl+Shift+F] 先会弹出一个对话框,直接点击[find],开始在整个工程内查找该字符串 ...
- HDU 2087 剪花布条【在字符串中不可重叠地寻找子串数量】
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和 ...