2011-04-17 74 views
2

我對opencv庫很陌生,但自從2.x以來仍然對C++ Mat類感到困惑。opencv Mat數據類型轉換和算術

的問題,我面對:

  1. 類墊的非模板版本運行時類型的,但目前還沒有的功能,可以顯示一個墊目標的符號名稱,只有一個cv::Mat::type(),這返回整數。

  2. 如果一個矩陣是CV_8U或無符號字符類型,那麼我做加法算術......它是否有可能導致溢出?或者opencv足夠聰明,可以轉換數據類型,並做所謂的「飽和算術」?例如的

    unsigned char a = 255; unsigned char b = a+a; // == 255

    操作+一:

    unsigned char b = (unsigned char) clipTo_0_255((float)a + (float)a));

  3. 如果我想避免的class Mat_<_Tp>微妙cv::Mat::at<_Tp>,大多數解決方案建議使用衍生模板版本。但_Tp必須C++原始類型,我不知道原始類型和CvMat類型系統之間的映射......(也許它是直截了當的...)

  4. 是opencv數據類型轉換等效於C/C++類型鑄造?例如

    float a = 1.5; int b = (int) a; // == 1

    int a = 2; float b = static_cast<int>(a); // == 2.0

+0

順便說一句...實驗顯示許多opencv函數將返回與CV_8U類型的墊... – Bossliaw 2011-04-17 15:27:59

回答

1

對於這兩個#2,#4,你應該閱讀OpenCV page on saturation arithmetic。特別是:

此「飽和」語義(不同 從通常的C語言「包裝」 語義,其中最低位是 採取,在每一個圖像 處理功能被實現,從簡單 cv::addcv::cvtColorcv::resizecv::filter2D等,這是不是OpenCV的版本2.x的新 功能,它在那裏 從一開始就在新 版本這個特殊的模板操作 引入簡化 執行這個語義的 你自己的功能。

我不幸沒有任何很好的解決方案來解決您的類型系統問題。由於所有OpenCV庫函數都使用非模板化的cv::Mat類,我個人已經放棄使用cv::Mat<T>類,直到API的其餘部分更新。

儘管類型系統相當笨拙,但隨着您習慣使用它,它變得更容易使用。

+0

感謝您的回答〜我會盡量習慣它 – Bossliaw 2011-04-25 08:52:19

+0

對不起,我沒有更多的幫助。如果您找到解決方案#3,我很樂意聽到:在編寫必須適用於多種數據類型的OpenCV代碼時,它永遠令人不快。我相信這是在內部完成一個'switch'聲明,所以我的希望不高... – 2011-04-25 15:20:00

+1

3年後,我們處於同一階段。我認爲OpenCV的「Mat」在這裏停留... – aledalgrande 2014-06-30 16:17:55

相關問題