2014-03-01 126 views
2

我對openCV提到的here文檔感到困惑。OpenCV文檔說「uchar」是「無符號整數」數據類型。怎麼樣?

作爲每文檔,如果我與創建圖像「UCHAR」,該圖像的像素可以存儲無符號整數值,但如果我用下面的代碼創建一個圖像:

Mat image; 
image = imread("someImage.jpg" , 0); // Read an image in "UCHAR" form 

或做

image.create(10, 10, CV_8UC1); 
for(int i=0; i<image.rows; i++) 
{ 
    for(int j=o; j<image.cols; j++) 
    { 
     image.at<uchar>(i,j) = (uchar)255; 
    } 
} 

,然後,如果我嘗試使用

0123打印的值

然後我在終端得到一些奇怪的結果,但如果我使用以下語句,那麼我可以得到0-255之間的值。

cout<<" "<<(int)image.at<uchar>(i,j); // with TYPECAST 

問題:爲什麼我需要做類型轉換來獲得打印0-255之間的值,如果圖像本身可以存儲「無符號整數」的價值觀。

+0

根據標準,「char」,「unsigned char」和「signed char」都是*整數類型*有幫助嗎?也許OpenCV在這句話中使用了真正可憐的白話文? – WhozCraig

+0

這是一個整數,只需要8位,你不把這些位作爲ASCII碼 – Dabo

+0

正確。 「整數」與「32位整數」不同。這裏的所有都是它的。 –

回答

15

如果你試圖找到uchar定義(這是如果你正在使用Visual Studio按F12鍵),那麼你會在OpenCV中的核心落得/ types_c.h

#ifndef HAVE_IPL 
    typedef unsigned char uchar; 
    typedef unsigned short ushort; 
#endif 

哪個標準和定義無符號整數8位類型(即「8位無符號整數」)的合理方法,因爲標準確保char總是需要精確的1個字節的內存。這意味着:

cout << " " << image.at<uchar>(i,j); 

使用重載operator<<這需要unsigned charchar),其在打印的字符,而不是數字形式傳遞的值。

明確的轉換,然而,導致使用的<<另一個版本:

cout << " " << (int) image.at<uchar>(i,j); 

,因此它打印號碼。這個問題與您使用OpenCV的事實無關。


簡單的例子:

char   c = 56; // equivalent to c = '8' 
unsigned char uc = 56; 
int   i = 56; 
std::cout << c << " " << uc << " " << i; 

輸出:8 8 56

如果事實,即它是一個模板迷惑你,那麼這種行爲也等同於:

template<class T> 
T getValueAs(int i) { return static_cast<T>(i); } 

typedef unsigned char uchar; 

int main() { 
    int i = 56; 
    std::cout << getValueAs<uchar>(i) << " " << (int)getValueAs<uchar>(i); 
} 
+0

抱歉,但我無法理解他們是否也意味着「uchar」意味着「無符號字符」或不? – user2756695

+0

@ user2756695:是的,看我的編輯。 – LihO

+0

所以如果我做'float value = c;''uchar c = 255;'''如果我嘗試打印它,我能得到'value = 255.0'嗎? – user2756695

4

簡單地說,因爲儘管uchar是整數類型,但流操作打印它代表的字符,而不是數字序列。通過類型int,您會得到相同流操作的不同重載,該操作會打印一系列數字。

+0

+1基本上,這是我的原始答案,因此非常簡單。 – LihO

+0

@LihO:的確,我撇清了你的答案,並且正準備閱讀它,以確保它在投票之前沒有任何不準確之處,當時我認爲一個更短的版本可能也是有用的:-) –

相關問題