我有一些代碼正在執行,我懷疑這是因爲我正在操作錯誤的數據類型或在它們之間轉換的很差。CV_8U和CV_32F之間有什麼區別,我在轉換它們時應該擔心什麼?
它混合的類型CV_8U
cv::Mat
對象(其是被創建什麼讀取時一個jpg爲灰度與cv::imread
)CV_32F
,並CV_32S
。
這些數據類型之間有什麼區別,在轉換它們時需要確保什麼?
我有一些代碼正在執行,我懷疑這是因爲我正在操作錯誤的數據類型或在它們之間轉換的很差。CV_8U和CV_32F之間有什麼區別,我在轉換它們時應該擔心什麼?
它混合的類型CV_8U
cv::Mat
對象(其是被創建什麼讀取時一個jpg爲灰度與cv::imread
)CV_32F
,並CV_32S
。
這些數據類型之間有什麼區別,在轉換它們時需要確保什麼?
CV_8U是無符號8位/像素 - 即像素可以具有值0-255,這是大多數圖像和視頻格式的正常範圍。
CV_32F是float - 像素可以具有0-1.0之間的任何值,這對於數據的一些計算集合是有用的 - 但它必須被轉換爲8位以通過將每個像素乘以255來保存或顯示。
CV_32S是每個像素的有符號32位整數值 - 同樣有用的是對像素進行整數數學運算,但又需要轉換爲8位才能保存或顯示。這是棘手的,因爲你需要決定如何在更大範圍的可能值(+/- 20億!)轉換爲0-255
他們基本上只是描述一下各個組成部分是:
CV_8U
:1字節無符號整數(unsigned char
)。
CV_32S
:4字節有符號整數(int
)。
CV_32F
:4字節浮點數(float
)。
什麼,你總是要記住的是,你不能只投他們從一個到另一個(或者它可能是你想要的東西不會做),尤其是不同大小的類型之間。
因此,請務必確保您使用真正的轉換功能在它們之間進行轉換,如cv::convert
或cv::Mat::convertTo
。不要試圖訪問例如使用例如CV_8U
類型的cv::Mat
。 cv::Mat::at<float>
或cv::Mat_<float>
。
或者,如果你只是想單獨元素轉換,並且不希望創建其他類型的新矩陣,訪問使用適當的函數(在本例cv::Mat::at<unsigned char>
)的元素,並將結果轉換爲float
。
同樣是有也部件的數量和cv::Mat
CV_8UC3
的類型之間的差是從CV_8UC1
類型的圖像不同,且應(通常)不能被cv::Mat::at<unsigned char>
訪問,但是通過cv::Mat::at<cv::Vec3b>
。
編輯:看到馬丁的回答,它可能是你知道這一切,他的解釋更多的是你一直在尋找。
謝謝!我也會給你一個贊成票,因爲你的答案都是有幫助的,但我還沒有名聲。 – mic
非常感謝您的評論,這是我訪問圖像像素的最佳選擇之一! –
此回覆中的數據範圍特別有用,無法在文檔中找到它! – koda
浮點像素的0-1範圍更具約定性,但opencv在其所有函數中都假設它 –