2015-05-04 293 views
3

我正在寫一個函數,它接受任意類型的cv :: Mat,將其轉換爲浮動圖像,對其進行處理並將其轉換回原始類型。問題在於,我沒有想到這些簡單的方法。這是我試過到目前爲止: 如何使用cv :: Mat :: convertTo

cv::Mat process(const cv::Mat& input)// input might be float 
{ 
    cv::Mat_<float> result(input.size()); 

    // Generate result based on input. 
    result = ...; 

    // Now convert result back to the type of input: 
#if 1 
    // Version 1: Converting in place crashes with: 
    // OpenCV Error: Assertion failed (!fixedType() || ((Mat*)obj)->type() == mtype) in cv::_OutputArray::create, 
    // file ...\OpenCV\modules\core\src\matrix.cpp, line 1365 
    if (result.type() != input.type()) 
     result.convertTo(result, input.type()); 

#else 
    // Version 2: Not what you'd expect 
    if (result.type() != input.type()) 
    { 
     cv::Mat tmp; 
     result.convertTo(tmp, input.type()); 
     result = tmp;// This line doesn't replace result, but converts tmp back to float. 
    } 
#endif 
    return result; 
} 

調用函數:

int main(int argc, char* argv[]) 
{ 
    cv::Mat_<float> a = cv::Mat_<float>::zeros(256, 256); 
    cv::Mat a1 = process(a); 

    cv::Mat_<uint16_t> b = cv::Mat_<uint16_t>::zeros(256, 256); 
    cv::Mat b1 = process(b); 
    assert(b1.type()==CV_16UC1); 
    return 0; 
} 

那麼,什麼會是這樣的標準呢? 我在Windows上使用OpenCV 2.4.10。

+0

難道你不能'只返回tmp;'而不是'result = tmp'嗎? 'tmp'已經有了正確的類型和表示。 –

+0

你可以添加'std :: cout << a1.type()<<「和」<< b1.type()<< std :: endl'並告訴我們嗎? – Micka

+2

啊......問題可能是,你使用這些模板墊子而不是openCV類型!你可以嘗試'cv :: Mat b = cv :: Mat :: zeros(256,256,16UC1);'而不是? – Micka

回答

0

問題是模板cv::Mat_<float>。顯然cv::Mat::convertTo()不能以Mat_<>作爲輸出。此外,cv::Mat_<float>::operator=()的工作方式與cv::Mat:operator=()不同。它隱含地將圖像轉換爲適當的格式。

一旦你想到它,這是有道理的。