-1

在我的程序崩溃时,Visual Studio 给了我下面的调用堆栈,它没有引用任何 Iv 编写的代码或我的源代码中的行号,这是否表明 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    

看起来断言失败是因为函数接收到损坏的 Mat,因为这是在崩溃时输出到控制台的。 在此处输入图像描述

4

1 回答 1

2

我会冒险猜测,当在您的代码中调用方法 cvtColor() 时,opencv 在它自己的线程中运行它。

您可以在此处查看 opencv 源代码,它表明该方法在 Color.cpp 文件中被调用。

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 或 GREY 的 Mat。事实上,据我了解,opencv 在 BGR 颜色空间中工作,您很可能已经在某处将 Mat 转换为 RGB,这可能是一个很好的搜索起点。

编辑

该断言还表明您试图将一个空的 Mat 克隆()到另一个。

Asset(   y==0   )

如果这种情况只是偶尔发生,那么我会寻找 if() 语句,或发生克隆或转换的条件情况。

于 2013-02-27T11:39:11.110 回答