2013-03-07 167 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按引用傳遞的 「線」 對象中分配內存,...

如果您預留足夠的線的地方,那麼將不會成爲內存問題,因爲該函數不會僅使用保留位創建內存字段。