5

最新版本的 OpenCV 中的许多功能都需要使用 STL 容器。尝试在 Matlab MEX 文件中使用它们时遇到问题。我正在从 Matlab 中编译 MEX 文件。OpenCV 和 Matlab 都使用“/MD”标志,即“多线程 DLL”来生成代码。

编译器:MSVC++ 9.0 Matlab 2010a OpenCV 最新来自 SVN,我认为是 2.11。

我使用的代码非常简单:

vector<KeyPoint> keypoints_vec;
SurfFeatureDetector surf;
surf.detect(cvImg,keypoints_vec);

这会编译,但在 Matlab MEX 文件中运行时会崩溃。崩溃发生在 OpenCV 的 vector::resize 中。旧接口(没有 STL 容器)工作正常,但已弃用。如何在 Matlab 和 OpenCV 之间使用 STL 容器?

4

4 回答 4

2

在过去的两天里,我一直在与这个问题作斗争。问题是这样的:
libmex.dll(和整个 Matlab)使用 Microsoft.VC80.CRT(版本=8.0.50727.4053)
但是您的 OpenCV 使用 Microsoft.VC90.CRT(版本=9.0.21022.8)

因此,您可以使用以前版本的 VC(据我所知,VS 2005 和 SP1),或者作为一种解决方法,您可以使用 gcc(MINGW)(在这种情况下,它们使用完全不同的 stl,因此它们不会干扰) .
我做了后者并且它有效,并且它将与Matlab的下一个版本一起使用(希望如此)。

于 2011-03-09T11:13:25.130 回答
1

很久以前,我遇到了 Matlab <-> VS interop 的问题。这可能是一些 microsoft visual c++ 运行时库差异。检查 matlab 需要什么运行时库以及您的 Visual Studio 有什么版本。我记得使用 Depends 来获取我的程序的 dll 依赖项。崩溃后检查你的调用堆栈(通过附加你的 msdev 调试器)它可能会给你一些提示。

那是很久以前的事了,所以我只是给出我记得的提示。

于 2010-07-29T15:28:18.530 回答
1

在过去的几天里,我遇到了类似的问题,并且在 MathWorks 友好人员的帮助下解决了这个问题。

来自http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error的原始帖子:

您可能会看到预编译的 dll 使用的 stl 库和/或编译器选项与 MATLAB 和 MEX 命令使用的选项不兼容。MATLAB 2009b 是使用 MSVC 2005 构建的。

您可以通过更改 mex 使用的选项或直接使用 MSVC 构建 mex 文件来解决问题。可能影响事物的选项的一个示例是 SECURE_SCL=0。我将首先使用 MATLAB 用来查找有问题的选项的选项构建您的测试程序,然后在构建 mex 文件时尝试删除该选项。

由于这种不兼容,在第三方编译库的 api 中使用 stl 对象通常是一个坏主意。

按照他的建议,我从 mex 选项文件中删除了 SECURE_SCL=0 选项

C:\Users\ThePit\AppData\Roaming\MathWorks\MATLAB\R2009b\mexopts.bat

然后重新编译了 mex 文件,现在一切都像魅力一样 - 该函数正在返回正确的数据并且不再发生分段错误。

于 2011-06-13T20:55:54.787 回答
0

向量中的数据仍应存储为单个连续块

std::vector<int> data;
int *array = &data[0]; 
int *array = &data.front(); 

应该给你'c'风格的数据指针,尝试将这些传递给matlab

另请参阅:C++ STL 矢量模板如何将其对象存储在 Visual Studio 编译器实现中?

于 2010-07-29T15:32:37.720 回答