OpenCV、Matlab和STL容器

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容器?


无论输入什么,它是否会崩溃? - Guillaume Lebourgeois
是的,似乎无论输入什么都会崩溃。 - Petter
4个回答

2
在过去的两天里,我一直在解决这个问题。问题是:
libmex.dll(以及整个Matlab)使用Microsoft.VC80.CRT(version=8.0.50727.4053),
但是你的OpenCV使用Microsoft.VC90.CRT(version=9.0.21022.8)。
因此,你可以使用先前版本的VC(据我所知,是带SP1的VS 2005),或者作为解决方法,你可以使用gcc(MINGW)(在这种情况下,它们使用完全不同的stl,因此它们不能干扰彼此)。
我选择了后者,它能够正常工作,并且将来的Matlab版本中也会正常工作(希望如此)。

1

最近几天我遇到了类似的问题,但是在MathWorks友好的帮助下,我成功地解决了这个问题。

以下是原始帖子链接:http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error

你可能会发现你预编译的dll库和MATLAB以及MEX命令使用的stl库或编译器选项不兼容。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文件,现在一切都像魔法般地运行 - 函数返回正确的数据,不再出现分段错误。


1
很久以前,我在 Matlab 和 VS 互操作方面遇到了一些问题。可能是一些 Microsoft Visual C++ 运行时库的不匹配。检查一下 Matlab 需要哪个运行时库以及你的 Visual Studio 有哪个版本。我记得使用 Depends 来获取程序的 dll 依赖项。在崩溃后检查你的调用堆栈(通过附加你的 msdev 调试器),这可能会给你一些提示。

那是很久以前的事情了,我只是回忆起了一些提示。


我还没有使用过Spy++。我只是确保使用了相同的编译器,并传递了相同的开关(/MD),我认为这足以让它们使用相同的版本。 - Petter
抱歉,我说错了,应该是Depends(依赖项查看器),请看这个链接: http://msdn.microsoft.com/en-us/library/ms235265(VS.80).aspx - code-gijoe
2
通过附加调试器,检查Matlab dll或MS运行时dll是否崩溃。 - code-gijoe
当OpenCV尝试调用vector::resize时,它会在opencv_features2d211.dll内崩溃。 - Petter
我的最佳建议是以调试模式编译OpenCV,这样您就可以检查它为什么会崩溃。您是否尝试给向量一个初始大小?一些大的值。 - code-gijoe

0

你误解了我的问题。问题不在于向Matlab传递数据,而是上述代码崩溃的事实。 - Petter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接