HoughLinesP和opencv内存管理

时间:2013-03-07 23:04:04

标签: c++ memory-management opencv

我目前正在研究计算机视觉,并尝试使用Hough-Transform找到一些线条。它自己的操作正在运行,但即使是最小的示例代码也会产生释放错误。

#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 64bit-Version编译并运行它,可执行文件也是64位。操作系统是Windows 7,64位

3 个答案:

答案 0 :(得分:1)

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

我遇到了this个问题,您可能会觉得这个问题很有用。

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

答案 1 :(得分:1)

这个问题可以通过以下两个选项之一解决:

  • 将您的应用程序与您的OpenCV库链接到相同的CRT 版本,

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

这是因为HoughLinesP在引用传递的“lines”对象中分配内存,但在调用HoughLinesP的函数结束时,应用程序将取消分配内存。因此,对于不同的CRT,这会产生问题。

答案 2 :(得分:0)

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

Doodlo:

  

这是因为HoughLinesP在&#34;行中分配内存&#34;通过引用传递的对象,...

如果您预留了足够的行,那么就不会出现内存问题,因为该函数不会仅使用保留的位置创建内存字段。