0

我目前正在研究计算机视觉并尝试使用 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 64 位版本编译并运行它,可执行文件也是 64 位的。操作系统是 Windows 7、64 位

4

3 回答 3

1

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

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

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

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

于 2014-01-18T16:29:25.000 回答
1

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

我遇到了这个问题,您可能会发现它也很有用。

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

于 2013-03-07T23:15:36.937 回答
0
vector<Vec4i> lines; 
line.reserve(1000); //create enough place for lines

涂鸦:

这是因为 HoughLinesP 在通过引用传递的“行”对象内分配内存,...

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

于 2015-07-10T14:29:33.933 回答