2017-05-09 11 views
0

私はこのような関数を使用しています。Findcontours()実行時エラー

Mat large = imread(path+name); 
Mat rgb; 
if (large.rows > 2500 || large.cols > 1250) 
{ 
    pyrDown(large, rgb); 
} 
else 
{ 
    rgb = large.clone(); 
} 
cv::Mat smallx; 
cvtColor(rgb, smallx, CV_BGR2GRAY); 
Mat grad,connected,bw; 

Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
cv::morphologyEx(smallx, grad, MORPH_GRADIENT, morphKernel); 
cv::threshold(grad, bw, 100, 255, THRESH_BINARY + THRESH_OTSU); 
morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1)); 
cv::morphologyEx(bw, connected, MORPH_CLOSE, morphKernel); 

Mat mask = Mat::zeros(bw.size(), CV_8UC1); 
vector<vector<Point>> contours; 
vector<Vec4i> hierarchy; 

cv::findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

いくつかの入力画像プロンプト例外関数が戻る、それは私を投げる "_Mybase :: DEALLOCATE(_ptr、_count);" xmemory0クラスのコードブロック。私はこの種のエラーをキャッチし、予期しない停止からこのプロセスを防ぐ必要があります

--------------エラー詳細--------------

私はそのコードブロックを30種類の入力で試しましたが、いくつかの画像でエラーが発生しました。 findcontoursの後、例外が発生し、このメッセージが表示されます。 0xC0000409:0xc0000409 ImageRecognizer.exeで0x74477fb2(ucrtbase.dll)で

未処理の例外。

その時、「ベクトル」クラスは私のVisual Studioでこれらの行で開きます。

~vector() _NOEXCEPT 
    { // destroy the object 
    _Tidy(); 
    } 

"xmemory"クラスはこれらの行で開きます。

void deallocate(pointer _Ptr, size_type _Count) 
    { // deallocate object at _Ptr, ignore size 
    _Mybase::deallocate(_Ptr, _Count); 
    } 

答えて

1

あなたの方法が見つかったカウンターの数は50000 はマジックナンバーを使用しないようにしてくださいを超えているようです。それは常に悪い習慣です。

+0

まあ、私は50000なしベクトルを初期化しようとしましたが、その時間に私はより多くの入力に対して同じエラーが発生します。とにかく私はそれが有用な解決策ではないことを知っているが、私はこのエラーを完全に解決しなければならない。 (0,0)ポイントなしで実行しようとすると、このオーバーロードされたメソッド のボイド品種を試してみてください –

+0

:: findContours(InputOutputArray \t画像、OutputArrayOfArrays \t輪郭、int型モード、int型の方法、ポイントは、オフセット=ポイント())私はせずに試すことができます – hagor

+0

私は階層が必要です。私はすでにこの方法のオプションを知っていますが、私の場合は役に立ちません。しかし、私はPoint(0,0)なしでテストするつもりです。 –

0

私はOpenCV 2.4.12の代わりにOpenCV 2.4.13を試してみました。問題はそれだけで解決しました。これはアルゴリズムまたは論理エラーではありませんでした。それは図書館のバグだった。