2013-05-12 162 views
2

我想加載BGR圖像,並將一些像素證明一些條件複製到我使用加載的圖像寬度,高度和類型創建的新圖像。類型是CV_8UC3。Opencv Mat創建圖像

Mat initial_Image = imread("image.jpg"); 
Mat image(img.rows,img.cols, CV_8UC3); 

cout<<initial_Image.type()<<endl; 

for(int i = 0;i < img.cols ;i++) 
{ 
for(int j = 0;j < img.rows ;j++) 
{ 
Vec3b intensity = initial_Image.at<Vec3b>(j,i); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 


image.at<uchar>(j,i) = blue; 
image.at<uchar>(j+1,i+1) = green; 
image.at<uchar>(j+2,i+2) = red ; 

    } 
} 
out.close(); 

imshow("im", image); 

我還沒有放置條件,但我只是試圖從讀取的圖像複製所有像素到新的創建圖像。

我的問題是讀取圖像3 channle RGB但是當我通過複製像素到新創建的圖像繪製圖像它給了我一個黑白圖像,其通過3.爲什麼鴻溝?由於我必須改變像素值,一旦我得到這個基於一些條件的工作,我不能使用copyto功能,因爲有些人可能會建議。我沒有條件的原因是爲了緩解糾正工作。謝謝你。

回答

4

您索引的方式image是不正確的。當你到達下一列藍色像素將被寫入到j+1,i+1有效覆蓋綠色值你索引image目前的方式將寫blue索引j,i,然後。相反,您應該使用.at<Vec3b>索引image

最簡單的方法是做這樣的:

image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i); 

如果你想改變redblue和​​你也可以這樣來做:

Vec3b intensity = initial_Image.at<Vec3b>(j,i); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 

//Do stuff with blue, green, and red 

image.at<Vec3b>(j,i) = Vec3b(blue,green,red);