2013-03-04 137 views
0

我在下面的代碼和我的信道的數目是3如何打印R,G和B矩陣

IplImage* img_crop_mat = cvLoadImage("....", 1); 
... 
int b = 0; 
uchar* rgb = (uchar*) img_crop_mat->imageData; 

我想有在循環中RGB基質,撇取整個圖像:

for (int y = b; y < height - b; y++) 
{  
    ??? 
    for (int x = b; x < width - b; x++) 
    { 
     ???? 
    } 
} 

以前的論壇關於我的問題處理CvMat但沒有指針作爲我的代碼。

我必須考慮哪些指標?

+0

你能描述你想如何格式化輸出嗎?對我來說,這將是一個'printf(「r =%d,g =%d,b =%d」...)'或'cout <<「r =」<< ...'的簡單情況。 – 2013-03-04 16:50:33

+0

看看cvSplit()和cvMerge() – berak 2013-03-04 17:05:01

回答

1

可以使用下面的宏來訪問一個3信道,8U圖像的任意像素:

CV_IMAGE_ELEM(myImage, unsigned char, y, x*3 + ChannelOfInterest) 

這是一個左值,以便可以採取,並使用其值,也可以改變像素的值。

默認情況下,

ChannelOfInterest = 0, blue 
ChannelOfInterest = 1, green 
ChannelOfInterest = 2, red 

實際的數據結構非常簡單,查找CV_IMAGE_ELEM的定義。

+0

我會認爲這是非常低效的,因爲它會一次獲取一個字節,有一些值得注意的開銷? – 2013-03-04 16:51:34

+0

以我的經驗,這個操作所需的CPU時間一直是一個非因素。我所遇到的最常見的算法問題來自與此操作有關的操作的複雜性和不必要的重複。 – 2013-03-04 16:58:09

+0

@ Mats: 實際上,我將在界面中設置LineEdit的文本,逐個顯示這些矩陣的不同值(R,G和B)。 總的來說,我將有3個LineEdits來顯示三個矩陣。而我將不會使用Cout和印刷品。 – 2013-03-04 17:02:42