我是OpenCV的先驱。我的编程环境是VC ++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。
我在VC ++和Path中使用纯粹的32位配置。
我输入以下代码:
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\core\core.hpp"
using namespace cv;
int main(int argc, char** argv) {
char* imgPath = "logo.png";
Mat img = imread(imgPath);
namedWindow( "Example1", WINDOW_AUTOSIZE);
imshow("Example1", img);
waitKey(0);
return 0;
}
然后我编译并运行。它确实提出了一个窗口(但没有图片),但后来给了我这个(运行时错误?)
Unhandled exception at 0x770515de in Helloworld2.exe: Microsoft C++ exception: cv::Exception at memory location 0x001ef038..
然后我将imread更改为cvLoadImage,它没有任何错误。
有人可以告诉我出了什么问题吗?
答案 0 :(得分:2)
我已尝试过您提供的代码。我安装OpenCV时效果非常好。
但是我收到警告:
char* imgPath = "logo.png";
main.cpp:6:21: warning: deprecated conversion from string constant to 'char*' [-
Wwrite串]
我认为使代码崩溃并不严重,但是在您的情况下可能是问题,因为我没有使用VC ++进行编译。
你可以尝试检查这是否是问题是直接用字符串替换imgPath
,所以代码现在就像
Mat img = imread("logo.png");
答案 1 :(得分:1)
我也遇到了这个问题,但我修复了以下内容。关键是使用相对路径以外的绝对路径,并在文件路径中将“\”更改为“/”。
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
int main() {
cv::Mat image = cv::imread("D:/projects/test/Debug/1.jpg");
if (image.empty()) {
return 0;
}
cv::namedWindow("my image");
cv::imshow("my image", image);
cv::waitKey(5000);
return 1;
}
答案 2 :(得分:0)
在opencv文档中可以看到cvLoadImage
和imread
之间的差异:
C ++:Mat imread( const string&amp; filename ,int flags = 1)
和
C:CvMat * cvLoadImageM( const char * filename ,int iscolor = CV_LOAD_IMAGE_COLOR)
但是从const char *
到string
的隐式转换。正如masad所说,这种转换已被弃用,因此它非常依赖于编译器。
由于cvLoadImage
适合您,您似乎应该将代码更改为以下内容:
#include "opencv2\highgui\highgui.hpp"
#include "opencv2\core\core.hpp"
#include <string>
using namespace cv;
int main(int argc, char** argv) {
std::string imgPath("logo.png");
Mat img = imread(imgPath);
namedWindow( "Example1", WINDOW_AUTOSIZE);
imshow("Example1", img);
waitKey(0);
return 0;
}
Visual Studio中有一些problems带有C ++接口,但您可能会尝试查看它是否适合您。
答案 3 :(得分:0)
我遇到了同样的问题,我遇到了Installing OpenCV 2.4.3 in Visual C++ 2010 Express,它提到在为链接器添加依赖项时使用更新的库集* d.lib。我试了一下,C ++界面也运行了。不确定这是否是一般的情况。我在64位Windows机器上使用OpenCV 2.4和Visual Studio 2010。
答案 4 :(得分:0)
我遇到了类似的问题。当我使用imread函数时,程序崩溃并显示系统错误消息: opencv_debug.exe中的0x0036299f处未处理的异常:0xC0000005:读取位置0xcccccccc时发生访问冲突
然后我将imread更改为cvLoadImage,它没有任何错误。
最后,我解决了这个问题,因为我使用VS2008编译了dll的VS2008项目。
这是我的故事。
环境: VS2008 + opencv2.4.7
首先,我只需点击链接http://docs.opencv.org/doc/tutorials/introduction/windows_visual_studio_Opencv/windows_visual_studio_Opencv.html,然后编译我的测试项目。
但是,当我运行我的测试项目时,系统错误对话框告诉我,我丢失了 MSVCP100D.dll MSVCR100D.dll 。所以我下载了两个dll,dll丢失问题解决了,但问题是运行时崩溃。
注意前面的链接,它说:
这意味着,在opencv2.4.7中,它们只提供在vs2010或vs2012中编译的dll,而不是vs2008。
当我使用vs2010编译的dll编译vs2008项目时,我遇到了有线问题。
如何解决此问题?
使用较旧的opencv版本,如opencv2.3,此版本包含vs2008编译的dll。
自己编译opencv。
我注意到您的环境是:VC ++ Express 2010 + OpenCV 2.4.2 + Win 7 64位。 确保OPENCV_DIR设置正确。
setx -m OPENCV_DIR D:\ OpenCV \ Build \ x64 \ vc10