-1

プログラムがクラッシュすると、Visual Studioは、ソースに記述されたコードIvまたは行番号への参照が1つもない、以下のコールスタックを表示します。これは、OpenCVライブラリにバグがあることを示していますか?

通常の場合のように、クラッシュをトリガーしたソース操作/関数をプログラムで見つけることはまだ可能だと思います。

    opencv_imgproc243d.dll!cv::RGB2RGB<unsigned char>::operator()(const unsigned char * src=0x00000000, unsigned char * dst=0x0f010050, int n=1920)  Line 208 + 0x6 bytes   C++
>   opencv_imgproc243d.dll!cv::CvtColorLoop_Invoker<cv::RGB2RGB<unsigned char> >::operator()(const cv::Range & range={...})  Line 176 + 0x1d bytes  C++
    opencv_core243d.dll!`anonymous namespace'::ParallelLoopBodyWrapper::operator()(const cv::Range & sr={...})  Line 134 + 0x17 bytes   C++
    opencv_core243d.dll!`anonymous namespace'::ProxyLoopBody::operator()(int i=0)  Line 177 C++
    opencv_core243d.dll!Concurrency::_Parallel_chunk_helper_invoke<int,unsigned int,`anonymous namespace'::ProxyLoopBody,0>::_Invoke(const int & _First=0, unsigned int & _Index=0, const `anonymous-namespace'::ProxyLoopBody & _Func={...})  Line 1445    C++
    opencv_core243d.dll!Concurrency::_Parallel_chunk_helper<int,unsigned int,`anonymous namespace'::ProxyLoopBody,0>::operator()()  Line 1833 + 0x16 bytes  C++
    opencv_core243d.dll!Concurrency::task_handle<Concurrency::_Parallel_chunk_helper<int,unsigned int,`anonymous namespace'::ProxyLoopBody,0> >::operator()()  Line 116 C++
    opencv_core243d.dll!Concurrency::details::_UnrealizedChore::_InvokeBridge<Concurrency::task_handle<Concurrency::_Parallel_chunk_helper<int,unsigned int,`anonymous namespace'::ProxyLoopBody,0> > >(Concurrency::task_handle<Concurrency::_Parallel_chunk_helper<int,unsigned int,`anonymous namespace'::ProxyLoopBody,0> > * _PChore=0x036fb148 {_M_first=0 _M_step=1 _M_function={...} ...})  Line 3495   C++
    msvcr100d.dll!Concurrency::details::_UnrealizedChore::_StructuredChoreWrapper(Concurrency::details::_UnrealizedChore * pChore=0x036fb148 {_M_first=0 _M_step=1 _M_function={...} ...})  Line 99 + 0xc bytes C++
    msvcr100d.dll!Concurrency::details::_UnrealizedChore::_Invoke()  Line 3454 + 0xc bytes  C++
    msvcr100d.dll!Concurrency::details::WorkItem::Invoke()  Line 75 C++
    msvcr100d.dll!Concurrency::details::InternalContextBase::ExecuteChoreInline(Concurrency::details::WorkItem * pWork=0x0fb8f7dc)  Line 1385   C++
    msvcr100d.dll!Concurrency::details::InternalContextBase::Dispatch(Concurrency::DispatchState * pDispatchState=0x0fb8f7fc)  Line 1478    C++
    msvcr100d.dll!Concurrency::details::FreeThreadProxy::Dispatch()  Line 157   C++
    msvcr100d.dll!Concurrency::details::ThreadProxy::ThreadProxyMain(void * lpParameter=0x029c2160)  Line 162   C++
    kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
    ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes   
    ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes    

クラッシュ時にコンソールに出力された破損したマットを関数が受信した結果、アサーションが失敗したようです。 ここに画像の説明を入力してください

4

1 に答える 1

2

コードでメソッドcvtColor()が呼び出されると、opencvがこれを独自のスレッドで実行すると推測するのは危険です。

このメソッドがColor.cppファイルで呼び出されていることを示すopencvソースをここで確認できます。

RGB2RGB形式は、ある色空間から別の色空間への変換で使用される形式と似ています。これはおそらくコピーを作成していると思います。

そのため、原因として次のコマンドをコードで探す可能性があります。

cvtColor(src, dst, CV_RGB2RGB);
or 
Mat A = Mat(...);
Mat B = A.clone();

I don't think this will cause it as this just copies header information.
Mat B(A);

or

A.copyTo(B);

それらをBGRまたはGRAYに変換したMatを除外できます。実際、私が理解しているように、opencvはBGR色空間で機能することを考えると、おそらくどこかでマットをRGBに変換している可能性があります。これは、検索の開始点として適している可能性があります。

編集

このアサーションは、空のマットを別のマットにclone()しようとしていることも示唆しています。

Asset(   y==0   )

これがたまにしか発生しない場合は、if()ステートメント、またはクローン作成または変換が発生している条件付きの状況を探します。

于 2013-02-27T11:39:11.110 に答える