openCV:dll文件中的关键点分配问题

时间:2015-04-14 19:51:51

标签: c++ opencv dll visual-studio-2005

我在openCV中开发了一个简单的代码:

void extractSIFT(Mat img, Mat outFeature, int G = GRID_SPACING)
{
    vector<KeyPoint> keypoints;
    DenseFeatureDetector denseDetect = DenseFeatureDetector(PATCH_SIZE,1,0.1,G);
    denseDetect.detect(img,keypoints);

    SiftFeatureDetector siftDetector(SIFT_DIM,NUM_LAYER,CONTRAST,EDGE_THRESHOLD,SIFT_SIGMA);
    siftDetector.compute(img,keypoints,outFeature);
    outFeature.convertTo(outFeature, CV_32FC1); //Convert to float

}

在VS2010 c ++程序中运行良好。但是,当我把它变成一个dll文件,然后从VS2005程序调用它时,我在行上得到以下错误

denseDetect.detect(img,keypoints);

  

表达式:矢量迭代器不兼容

当我查看调试会话中的变量时,我无法在关键点变量中看到任何内容。没什么,甚至大小都不是0,不是一条线。当我查询keypoints.size()时,它说&#39; keypoints.size()不存在&#39;

an 'empty' vector of KeyPoints(您可以看到关键点下的小空白区域)

存储器地址存在于程序存储区中,但前4个字节是0x00,看起来很奇怪: enter image description here

我尝试使用不同的visual studio运行时(vc90,vc 80,vc100不能从vs2005调用),调试和发布配置以及其他许多我现在都记不住的东西,但最后它还没有用。

我怀疑来自KeyPoint类的分配器,但我找不到任何解决方法,除了&#39;它适用于Linux安装中的发布配置&#39;这不是一种选择。

我们在VS2005上运行了一个有效的Web服务,因此可以在这些平台上运行。

感谢任何帮助。

编辑:我们已使用.NET framework 4将项目迁移到VS2010 C#,问题已解决。

1 个答案:

答案 0 :(得分:0)

永远不要使用多个 VStudio C运行时库 msvcr ##(#)。dll )或他们的 C ++ 对应物( msvcp ##(#) .dll),在你的程序中(一个在主 .exe 中,另一个在 .dll 中由加载.exe )除非您非常熟悉其含义(在运行时可能会出现大量访问冲突)。

为了使其正常工作(因为无法更改可执行文件),您应该使用 VStudio 2005 构建 .dll (请注意,其可再发行组件是程序集,所以你应该使用与web服务使用完全相同的那个。)

或者,自然而然:迁移到较新的 VStudio 版本。