我刚刚安装了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;
}
我在VS2010和VS2008的2个不同系统中得到了相同的错误,如果我尝试运行可以在.. \ OpenCV2.2 \ samples \ cpp \ descriptor_extractor_matcher.cpp中找到的示例代码descriptor_extractor_matcher.cpp。 / p>
Run-Time Check Failure #2 - Stack around the variable 'keypoints' was corrupted.
我即将放弃......
答案 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)。然后你必须明确声明这行代码:
在使用SURF或SIFT进行任何操作之前,在源代码中initModule_nonfree();
。他们不再自由了!浪费了大约一天来搞清楚这一点。
抛出的错误消息让您不知道这可能是问题所在。
答案 5 :(得分:0)
在VS中查看是否正在加载opencv的dll。确保dll是您期望的那个。
此外,您可以使用作为SysInternals套件一部分的ProcMon来查看正在加载的内容。
答案 6 :(得分:0)
我将MFC的使用改为“共享DLL中的MFC”,它解决了我的问题。
答案 7 :(得分:0)
可能您将OpenCV库链接到默认的Visual Studio配置(所有配置),而不是分别将调试和发布配置。
要更改配置,请选择:
确保链接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
确保您链接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版本,名称也会改变。)