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。
難道你不能'只返回tmp;'而不是'result = tmp'嗎? 'tmp'已經有了正確的類型和表示。 –
你可以添加'std :: cout << a1.type()<<「和」<< b1.type()<< std :: endl'並告訴我們嗎? – Micka
啊......問題可能是,你使用這些模板墊子而不是openCV類型!你可以嘗試'cv :: Mat b = cv :: Mat :: zeros(256,256,16UC1);'而不是? – Micka