2013-03-07 54 views
0

我目前正在查看计算机视觉并尝试使用Hough变换来查找某些行。它自己的操作正在工作,但即使最小的示例代码也会产生释放错误。HoughLinesP和opencv内存管理

#include <iostream> 

#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 

using namespace std; 
using namespace cv; 

int main(int argc, char* argv[]) 
{ 
    int size[] = {100, 100}; 
    Mat img(1, size, CV_8U); 
    img = cv::Scalar(255); 
    vector<Vec4i> lines; 
    HoughLinesP(img, lines, 1, CV_PI/180, 100, 30, 5); 

    cout << lines.size() << endl; 
} 

请注意,如果我将行转换为*行,在堆上创建矢量并且不删除它,一切工作正常。我看不出有关代码的任何问题,它直接来自OpenCV示例。在

msvcr110d.dll!_CrtIsValidHeapPointer(const void * pUserData) Line 2036 C++ 

我编译和VS 2012 64-版本上运行这一点,可执行也出现64位

的异常。操作系统是Windows 7,64位

+0

完全相同的问题。我已经在OpenCV代码库中找到了一个回归单元测试,它给HoughLinesP一个cv :: Mat,而不是一个向量为int的向量。也许这是一个线索? http://code.opencv.org/projects/opencv/repository/revisions/9908ff33dec00402a3793b87ce4c4087080141b6/entry/modules/imgproc/test/test_houghLines.cpp我现在正在自己的代码中探索。任何帮助赞赏。 – Doodloo 2014-01-14 17:45:15

+0

我到目前为止还没有进一步调查过它,只是住在一起。但是,它似乎与32位的2.4.8一起工作。我没有为我目前的项目建立一个64位的环境,但是在我的日程安排中,一旦有“应该拥有”的空间,我可以提议。我会让你知道发生了什么。 – Mene 2014-01-16 22:15:56

回答

1

此问题是由这两个选项任何一个解决:

  • 将您对相同的CRT应用程序作为OpenCV库 版本呢,

  • 重新编译的OpenCV和禁用静态CRT链接。

这是因为HoughLinesP分配按引用传递的“线”对象中的记忆,但在你的函数调用HoughLinesP结束后,您的申请将解除分配内存。所以对于不同的CRT,这会产生问题。

1

您的应用程序可能以发行模式运行,请尝试在Debug中运行它。
(我建议这是因为它使用调试DLL,msvcr110d.dll)。

我遇到了this问题,您可能也会发现这个问题。

希望有帮助,让我知道它是怎么回事!

+0

我已经检查过,但事实并非如此。它以调试模式运行并链接到所有* d.lib文件。根据Dependency Walker,我的可执行文件使用OPENCV_CORE244D.DLL,它们都使用MSVCP110D.DLL和MSVCR110D.DLL – Mene 2013-03-07 23:34:09

0
vector<Vec4i> lines; 
line.reserve(1000); //create enough place for lines 

Doodlo:

这是因为HoughLinesP按引用传递的 “线” 对象中分配内存,...

如果您预留足够的线的地方,那么将不会成为内存问题,因为该函数不会仅使用保留位创建内存字段。