关于opencv3.4+VS2015运行SIFT特征匹配detectAndCompute()函数莫名中断问题

最近在学习关于图像匹配拼接部分内容,在学习SIFT特征匹配方法时,本来想着先尝试着用opencv整合后的features2d类来创建一个生成特征点的简单小程序,然而却是在关键函数detectAndCompute()处遇到了麻烦,无论怎么s调试,最后都会导致内存问题,导致程序中断。具体代码如下#include  

#include  
#include
#include"opencv2\core\core.hpp"
#include"opencv2\xfeatures2d.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread("3.jpg", IMREAD_GRAYSCALE);//加载灰度图像
if (src.data == NULL)
{
cout << "No exist" << endl;
return -1;
}
Ptr sift = xfeatures2d::SIFT::create(50);
vector keypointsa;
keypointsa.clear ();
Mat a;//特征点描述
sift->detectAndCompute(src,Mat(),keypointsa,a);//得到特征点和特征点描述
drawKeypoints(src, keypointsa, src);//画出特征点
imshow("output", src);
waitKey(0);

}

运行后会遇到如下类似的内存问题(有时也会显示this指针的指向为空的问题)

关于opencv3.4+VS2015运行SIFT特征匹配detectAndCompute()函数莫名中断问题_第1张图片

对于这个问题,我当然是从中断处调起,逐个调用堆栈里调用的函数排除

关于opencv3.4+VS2015运行SIFT特征匹配detectAndCompute()函数莫名中断问题_第2张图片

发现可能是对于调用到重复keypoints消除重复项的函数removeDuplicatedSorted()处释放多余内存的问题

可是进一步调试发现这个问题竟然最后涉及到了C++线程编程局部存储(TLS)这一块,不禁一头雾水。

调试了一天,最后搞到了C++11才涉及的线程编程方面,难免很是疑惑。可是,过了一顿晚饭的功夫,我才发现真正的问题所在,中断调用线程加载的是opencv_xfeatures2d340.dll 和opencv_core340.dll的动态库,然而我用的Debug x64进行编译的啊!!!这里面不应该调用的是opencv_xfeatures2d340d.dll 和opencv_core340d.dll动态库吗?后来我打开了工程属性,发现自己在附加依赖项加载的库是opencv3.4生成的全部库(包括*d.lib和*.lib),原来对于Debug编译的过程中,是不会区分加载的库是*d.lib还是*.lib的,而且不仅不区分,对于Debug编译的程序竟然还一律优先加载*.lib库!!!本来当初copy所有附加依赖项是为了图方便,然而最后却整整浪费了一天的时间调这个莫名的bug,顿时自己流下了悔恨的泪水。( ๑ŏ ﹏ ŏ๑ )

当然解决方案是,把附加依赖项里*.lib全部都删了,或者调成release方式编译就能够成功了,最后附一张调试了一天梦寐以求看到的图

关于opencv3.4+VS2015运行SIFT特征匹配detectAndCompute()函数莫名中断问题_第3张图片

作为程序小白,因为配置环境都能忙了一天,未来的修炼之路还很艰辛啊╮(╯﹏╰)╭

你可能感兴趣的:(sift,内存问题)