2011-12-04 37 views

回答

67

CV_8U是無符號8位/像素 - 即像素可以具有值0-255,這是大多數圖像和視頻格式的正常範圍。

CV_32F是float - 像素可以具有0-1.0之間的任何值,這對於數據的一些計算集合是有用的 - 但它必須被轉換爲8位以通過將每個像素乘以255來保存或顯示。

CV_32S是每個像素的有符號32位整數值 - 同樣有用的是對像素進行整數數學運算,但又需要轉換爲8位才能保存或顯示。這是棘手的,因爲你需要決定如何在更大範圍的可能值(+/- 20億!)轉換爲0-255

+3

此回覆中的數據範圍特別有用,無法在文檔中找到它! – koda

+3

浮點像素的0-1範圍更具約定性,但opencv在其所有函數中都假設它 –

61

他們基本上只是描述一下各個組成部分是:

  • CV_8U:1字節無符號整數(unsigned char)。

  • CV_32S:4字節有符號整數(int)。

  • CV_32F:4字節浮點數(float)。

什麼,你總是要記住的是,你不能只投他們從一個到另一個(或者它可能是你想要的東西不會做),尤其是不同大小的類型之間。

因此,請務必確保您使用真正的轉換功能在它們之間進行轉換,如cv::convertcv::Mat::convertTo。不要試圖訪問例如使用例如CV_8U類型的cv::Matcv::Mat::at<float>cv::Mat_<float>

或者,如果你只是想單獨元素轉換,並且不希望創建其他類型的新矩陣,訪問使用適當的函數(在本例cv::Mat::at<unsigned char>)的元素,並將結果轉換爲float

同樣是有也部件的數量和cv::MatCV_8UC3的類型之間的差是從CV_8UC1類型的圖像不同,且應(通常)不能被cv::Mat::at<unsigned char>訪問,但是通過cv::Mat::at<cv::Vec3b>

編輯:看到馬丁的回答,它可能是你知道這一切,他的解釋更多的是你一直在尋找。

+1

謝謝!我也會給你一個贊成票,因爲你的答案都是有幫助的,但我還沒有名聲。 – mic

+0

非常感謝您的評論,這是我訪問圖像像素的最佳選擇之一! –

相關問題