0

起初,我在 WinXp 上使用 OpenCV 2.4.2 和 Visual 2008。这是问题所在:

我正在使用该imwrite函数编写具有以下原型的灰度图像:

bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>());

图像类型预先检查和设置(8 位,1 通道)。但是,在我的情况下,我仅在发布模式下遇到异常(错误 -2,找不到指定扩展名的编写器)来编写 bmp 图像.\Images\Debug\calibration_ref.bmp。我不明白这个文件名有什么问题。

线索

在深入查看 dll 源文件(opencv_highgui242d.dll、loadsave.cpp、l.298)后,我意识到参数const std::string & filename(至少是这个……)由于<Bad Ptr>. 为了得到这个结果,我在发布模式下使用了 highgui 调试版本的 dll,否则,使用 highgui 发布版本,我得到了垃圾字符串。我怀疑所有的论点都被破坏了。

线索2

我完全不知道这种腐败是从哪里来的!我到处搜索,但我能找到的所有内容都与在发布模式下禁用优化然后修复错误以及有关线程安全的字符串类的这篇文章有关,但我不确定这是问题所在。

我要补充一点,我使用的 OpenCV 版本不是一个包。我特别用 TBB (ver 4.0 6005) 构建了它。随时提出更多问题。

4

2 回答 2

0

问题来自静态初始化顺序。

因为文件名被声明为依赖于其他静态的静态(我在这个项目中有很多静态变量),所以我有未初始化的变量作为参数。这就是为什么它以错误的论点引发异常的原因。

由于变量初始化和函数执行处的断点,我可以跟踪这种现象。OutputDebugString执行首先发生......但是,在进入函数之前跟踪参数(而不是强制显示,因为跟踪在释放模式下不起作用)可能是一个好主意。

于 2013-12-11T18:51:42.427 回答
0

您正在查看发布版本,因此调试器将无法显示所有值,因为优化将删除一些对象。我认为您因“腐败”而陷入困境。

你说错误是error -2, could not find a writer for the specified extension所以你有没有找到原因?在调试模式下使用什么编写器,为什么在发布模式下不可用。它可能只是您的工作目录中缺少的 DLL。

我建议您也更改输出文件名,这样您就不会对每个构建的输出感到困惑。.\Images\Debug\calibration_ref.bmp例如,可能会更好.\Images\Release\calibration_ref.bmp

于 2013-08-02T11:00:42.053 回答