2011-11-30 140 views
0

我剛剛從Ubuntu 10.04遷移到11.10,我使用的是OpenCV 2.3.1。 對於一些原因,現在當我做這樣的事情:OpenCV - Mat :: convertTo()聲明錯誤。

Mat_<unsigned> a = Mat_<unsigned>(10,2); 
Mat_<float> b; 

a.convertTo(b,CV_32F); 

我得到以下錯誤:

OpenCV Error: Assertion failed (func != 0) in convertTo, file /home/memecs/Desktop/OpenCV-2.3.1/modules/core/src/convert.cpp, line 937 
terminate called after throwing an instance of 'cv::Exception' 
    what(): /home/memecs/Desktop/OpenCV-2.3.1/modules/core/src/convert.cpp:937: error: (-215) func != 0 in function convertTo 

Aborted 

和功能斷言是:

Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta) const 
{ 
    bool noScale = fabs(alpha-1) < DBL_EPSILON && fabs(beta) < DBL_EPSILON; 

    if(_type < 0) 
     _type = _dst.fixedType() ? _dst.type() : type(); 
    else 
     _type = CV_MAKETYPE(CV_MAT_DEPTH(_type), channels()); 

    int sdepth = depth(), ddepth = CV_MAT_DEPTH(_type); 
    if(sdepth == ddepth && noScale) 
    { 
     copyTo(_dst); 
     return; 
    } 

    Mat src = *this; 

    BinaryFunc func = noScale ? getConvertFunc(sdepth, ddepth) : getConvertScaleFunc(sdepth, ddepth); 
    double scale[] = {alpha, beta}; 
    int cn = channels(); 

    ################### THIS IS THROWING THE ASSERTION ERROR ############### 
    CV_Assert(func != 0); 


    if(dims <= 2) 
    { 
     _dst.create(size(), _type); 
     Mat dst = _dst.getMat(); 
     Size sz = getContinuousSize(src, dst, cn); 
     func(src.data, src.step, 0, 0, dst.data, dst.step, sz, scale); 
    } 
    else 
    { 
     _dst.create(dims, size, _type); 
     Mat dst = _dst.getMat(); 
     const Mat* arrays[] = {&src, &dst, 0}; 
     uchar* ptrs[2]; 
     NAryMatIterator it(arrays, ptrs); 
     Size sz((int)(it.size*cn), 1); 

     for(size_t i = 0; i < it.nplanes; i++, ++it) 
      func(ptrs[0], 0, 0, 0, ptrs[1], 0, sz, scale); 
    } 
} 

任何幫助嗎?我真的不知道如何解決這個問題。

+0

OpenCV的持有在版本表withing表爲每次可以參考看看功能,每次每種細胞類型可能的(你見過斷言只是檢查是否OpenCV的是能夠找到一個函數擬合所需類型 - 顯然他不能)。大多數函數都可以處理所有定義的OpenCV類型,有些不能(例如 - 重映射無法處理雙精度 - CV_64F)。非可以處理類型「無符號」,堅持char,short,int,float,double和OpenCV矢量類型 – Boaz

+0

解決了這個問題。謝謝! – memecs

回答

3

Mat_<unsigned>對OpenCV沒用。 OpenCV功能都不支持unsigned int數據類型。嘗試使用signed intunsigned short代替。它們受OpenCV支持。

+0

太棒了!謝謝你解決了這個問題! – memecs

1

請嘗試此操作。

Mat a = Mat_<unsigned char>(10,2); 
Mat b ; 
a.convertTo(b,CV_32F); 
cout<<"a type"<<endl<<a.depth()<<endl<<endl<<"b type"<<endl<<b.depth()<<endl; 
+1

你可能想解釋你的答案,爲OP的利益 – Luca