OpenCV 2.2 VS2010 - 以非常简单的代码获取“访问冲突读取”

时间:2011-11-25 17:55:16

标签: c++ visual-studio-2010 opencv

我刚刚安装了OpenCV 2.2和Visual C ++ 2010并对其进行了配置。 我没有得到编译错误,但运行此代码我得到此错误

Unhandled exception at 0x6c2f22f2 (msvcr100.dll) in Es_CornerDetector.exe: 0xC0000005: access violation reading location 0x002a1000.

代码:

#include "opencv/highgui.h"
#include "opencv2/features2d/features2d.hpp"

int main(int argc, char** argv)
{
    cv::SurfFeatureDetector detector;
    detector.create("SURF");
}

我真的不明白哪个可能是原因..

更新

使用“detector.create()”可能是错误的,所以我尝试了不同的东西,但我得到了另一个错误(总是在我尝试访问“探测器”时):

First-chance exception at 0x67608ef4 in Es_CornerDetector.exe: 0xC0000005: Access violation writing location 0x02655008.
Unhandled exception at 0x67608ef4 in Es_CornerDetector.exe: 0xC0000005: Access violation writing location 0x02655008.

替代代码:

#include "opencv\cv.h"
#include "opencv\highgui.h"
#include "opencv2\features2d\features2d.hpp"
#include <vector>
#include <iostream>

int main()
{
    IplImage* img_temp = cvLoadImage("img.jpg");
    cv::Mat img(img_temp);
    if(img.empty()==1)
    {
            std::cout << "Can't load the image.." << endl;
        getchar();
        return -1;
    }

    cv::SurfFeatureDetector detector;
    vector<cv::KeyPoint> keypoints;
    detector.detect(img,keypoints);
    return 0;
}

更新2

我在VS2010和VS2008的2个不同系统中得到了相同的错误,如果我尝试运行可以在.. \ OpenCV2.2 \ samples \ cpp \ descriptor_extractor_matcher.cpp中找到的示例代码descriptor_extractor_matcher.cpp。 / p>

OpenCV 2.3.1尝试(二进制文件和已编译):

哇,新奇特的错误:

Run-Time Check Failure #2 - Stack around the variable 'keypoints' was corrupted.

我即将放弃......

9 个答案:

答案 0 :(得分:4)

我遇到了同样的问题并且发现我的系统路径中包含opencv二进制文件的目录错误地导致了包含vc10或vc9 opencv二进制文件的错误目录。看看你的问题是否是这样的。希望这会有所帮助。

答案 1 :(得分:3)

您需要确保Properties-&gt; Linker-&gt;输入下的“附加依赖项”指的是具有调试器支持的正确OpenCV库。

C:\OpenCV2.2\lib\opencv_calib3d220d.lib
C:\OpenCV2.2\lib\opencv_core220d.lib
C:\OpenCV2.2\lib\opencv_features2d220d.lib
C:\OpenCV2.2\lib\opencv_highgui220d.lib
C:\OpenCV2.2\lib\opencv_imgproc220d.lib

而不是

C:\OpenCV2.2\lib\opencv_calib3d220.lib
C:\OpenCV2.2\lib\opencv_core220.lib
C:\OpenCV2.2\lib\opencv_features2d220.lib
C:\OpenCV2.2\lib\opencv_highgui220.lib
C:\OpenCV2.2\lib\opencv_imgproc220.lib

答案 2 :(得分:1)

尝试获取OpenCV 2.3.1 superpack here。如果这仍然给你带来麻烦,我会尝试使用CMake从源代码编译OpenCV。按照this guide从源代码构建OpenCV。

除了DLL与可执行文件不在同一目录中的明显问题之外,这看起来可能是编译后的二进制架构(即32位/ VS2005与64位/ VS2010)之间的不匹配和你正在运行的那个。

希望有帮助!

编辑: 您可以尝试编译并运行此代码(这在我的系统上完美运行)吗?请确保使用2.3.1版本。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat image = imread("yourimage.jpg", 0);

    Ptr<FeatureDetector> detector = FeatureDetector::create("FAST");

    vector<KeyPoint> points;
    detector->detect(image, points);

    Mat imageColor;
    cvtColor(image, imageColor, CV_GRAY2BGR);
    drawKeypoints(imageColor, points, imageColor, Scalar(255, 0, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("imageColor", imageColor);
    waitKey();

    return 0;
}

您是否还可以发布指向您尝试运行特征检测的图像的链接?另外,您如何在Visual Studio中创建项目?

答案 3 :(得分:1)

解决方案是使用带有'd'后缀的库(如“opencv_core244d.lib”)进行调试,并使用普通库(如“opencv_core244.lib”)进行发布。它只是工作。 祝你好运

答案 4 :(得分:1)

确保包含opencv_nonfreeXXXX.lib,在项目依赖项设置中包含其他库(例如opencv_coreXXXXd)。然后你必须明确声明这行代码:

  

initModule_nonfree();

在使用SURF或SIFT进行任何操作之前,在源代码中

。他们不再自由了!浪费了大约一天来搞清楚这一点。

抛出的错误消息让您不知道这可能是问题所在。

答案 5 :(得分:0)

在VS中查看是否正在加载opencv的dll。确保dll是您期望的那个。

此外,您可以使用作为SysInternals套件一部分的ProcMon来查看正在加载的内容。

答案 6 :(得分:0)

我将MFC的使用改为“共享DLL中的MFC”,它解决了我的问题。

答案 7 :(得分:0)

可能您将OpenCV库链接到默认的Visual Studio配置(所有配置),而不是分别将调试发布配置。

要更改配置,请选择:

  1. 项目的属性 - &gt;配置(左上角) - &gt;选择调试
  2. 项目的属性 - &gt;链接器 - &gt;输入 - &gt;附加依赖
  3. 确保链接OpenCV调试库(请参阅最终 d ,例如opencv_calib3d220 d .lib):

    C:\OpenCV_Path\lib\opencv_calib3d220d.lib
    C:\OpenCV_Path\lib\opencv_core220d.lib
    C:\OpenCV_Path\lib\opencv_features2d220d.lib
    C:\OpenCV_Path\lib\opencv_highgui220d.lib
    C:\OpenCV_Path\lib\opencv_imgproc220d.lib
    
    1. 项目的属性 - &gt;配置(左上角) - &gt;选择发布
      1. 项目的属性 - &gt;链接器 - &gt;输入 - &gt;附加依赖
    2. 确保您链接OpenCV发布库(没有最终 d ):

      C:\OpenCV_Path\lib\opencv_calib3d220.lib
      C:\OpenCV_Path\lib\opencv_core220.lib
      C:\OpenCV_Path\lib\opencv_features2d220.lib
      C:\OpenCV_Path\lib\opencv_highgui220.lib
      C:\OpenCV_Path\lib\opencv_imgproc220.lib
      

      希望对你有所帮助。

答案 8 :(得分:0)

检查您包含的.dll和d.dll是否与opencv forlder中的“d.dll”和“.dll”完全相同(对于Release和Debug模式)。有时我们会遵循教程,不要检查他们提供的名称是否与我们的档案名称相符。 (他们可以使用其他Opencv版本,名称也会改变。)

相关问题