2017-07-05 71 views
1

当使用FAST特征检测器我用初学OpenCV的,并使用在OpenCV中的FAST特征检测器简单地得到一个图像的关键点阅读位置0xFFFFFFFFFFFFFFFF。访问冲突的OpenCV

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/features2d.hpp" 

std::vector<cv::KeyPoint> kp; 

int main() 
{ 
    cv::Mat img = cv::imread("im.jpg", 0); 
    cv::FAST(img, kp, 100, true); 

    cv::Mat img2; 
    cv::drawKeypoints(img, kp, img2 , CV_RGB(255, 0, 0)); 
    cv::imshow("Display", img2); 
    cv::waitKey(0); 
    cv::destroyWindow("Display"); 

    return 0; 
} 

但调试代码(调试模式)时: 我发现的矢量KP中(作为关键点矢量传递)到FAST()具有大尺寸(KP = {大小= 658812287755660302})这是不可能的。但是生成表示正确关键点的图像。上面提到的访问冲突错误信息出现在调试结束时。

在释放模式: 代码运行正常首先示出图像中的关键点。当图像窗口关闭时,程序崩溃。调试时,kp具有合理的大小(kp = {size = 427})。

当代码在调试模式下无需调试运行,应用程序错误弹出,说明内存在的0xffffffff无法读取。

调用堆栈是如图所示here,这没有任何意义,我。

我在做什么错?它与我初始化矢量或其他东西的方式有关吗?

+0

哪里我们发现您使用的是测试,'im.jpg'的形象呢? – Xirema

+0

我无法使用[此示例图像](http://imgur.com/a/2iV3q)与您的代码重现此问题。 [结果](http://imgur.com/a/MWkIw)。 – Xirema

+1

检查您的链接器属性。您可以在发布中链接OpenCV调试库,反之亦然。或者你正在使用与不同的编译器/体系结构编译的OpenCV版本 – Miki

回答

0

我无法使用自己的图像或使用您提供的图像来重现此问题。因此,我必须得出结论,您的构建环境存在问题。

  • 确保您已正确设置项目包含和库,包括OpenCV默认使用的共享库。
  • 确保您使用的是Visual Studio 2015(或与二进制兼容的VS2017)来编译您的代码。
+0

我得到了同样的错误甚至设置你的图像..但使用VS 2013有什么问题?其他opencv项目工作得很好.. – Heshan

+1

@鹤山您正在为您的项目使用OpenCV 3.20。运行的OpenCV 3.20二进制文件是针对Visual Studio SDK 14.x.yyyy编译的,该文件对应于VS2015(14.0.yyyy)或VS2017(14.1.yyyy),它们相互二进制兼容,但不适用于其他版本的视觉工作室。如果您使用Visual Studio 2013自己编译和构建OpenCV对象文件,那么您需要检查编译过程并确保您没有犯任何错误。 – Xirema

+0

我使用的是opencv 2.4.11(vc12)。现在释放模式不会产生任何错误。但调试模式在调用drawkeypoints()时会导致opencv错误。我使用了'kp.release(1000)',它在某种程度上包含了kp向量的增长,但是大于在释放模式下运行时的向量对象(或FAST())的异常行为之间的链接。和执行模式?现在VS和OpenCV版本不可能是这个问题,他们可以吗? – Heshan