0

私は現在コンピュータビジョンを調べており、ハフ変換を使用していくつかの行を見つけようとしています。それ自体が機能している操作ですが、最小限のサンプルコードでも割り当て解除エラーが発生します。

#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++

これをVS201264ビットバージョンからコンパイルして実行します。実行可能ファイルも64ビットです。OSはWindows7、64ビットです

4

3 に答える 3

1

Your application might be running in Release mode, try running it in Debug.
(I'm suggesting this because its using the debug DLL, msvcr110d.dll).

I came across this question, which you might find useful as well.

Hope that helps, let me know how it goes!

于 2013-03-07T23:15:36.937 に答える
1

この問題は、次の2つのオプションのいずれかによって解決されます。

  • OpenCVライブラリのバージョンと同じCRTに対してアプリケーションをリンクすると、

  • OpenCVを再コンパイルし、静的CRTリンクを無効にします。

これは、HoughLinesPが参照によって渡された「lines」オブジェクト内にメモリを割り当てるためですが、HoughLinesPを呼び出す関数の最後に、アプリケーションはメモリの割り当てを解除します。したがって、CRTが異なると、これは問題になります。

于 2014-01-18T16:29:25.000 に答える
0
vector<Vec4i> lines; 
line.reserve(1000); //create enough place for lines

Doodlo:

これは、HoughLinesPが参照によって渡された「lines」オブジェクト内にメモリを割り当てるためです。

十分な数の行の場所を予約すると、関数は予約された場所のみを使用してメモリフィールドを作成しないため、メモリの問題は発生しません。

于 2015-07-10T14:29:33.933 に答える