opencv中獲取圖像像素的方法數組
方法一:指針
IplImage *img = cvLoadImage("Lena.jpg", 0);內存
CvScalar pixel;
for (int i = 0; i < img->height; ++i)
{
for (int j = 0; j < img->width; ++j)
{
//得到像素的RGB值並顯示 opencv
pixel = cvGet2D(img, i, j);
printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
//修改各點的值
pixel.val[0] = 0; // B份量
pixel.val[1] = 0; // G份量
pixel.val[2] = 0; // R份量
cvSet2D(img, i, j, pixel);
}
}float
注意內存中存儲順序是BGR方法
方法二:im
for (int i = 0; i < img->height; ++i)
{
for (int j = 0; j < img->width; ++j)
{數據
int b = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3);img
int g = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+1);類型轉換
int r= CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+2);
}
}
方法三:
對於單通道字節型圖像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
((uchar *)(img->imageData + i*img->widthStep))[j]=111;
對於多通道字節型圖像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
對於多通道浮點型圖像:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R
3 ((uchar*)(Img1->imageData + Img1->widthStep*pt.y))[pt.x]的具體含義:
(1)這裏img1->imagedata指的圖像第一行的首地址,pt.y是指圖像的height(圖像高像素數即行數),y乘以img->widthstep(排列的圖像行大小)即首地址加上行數乘以每行總數,獲得第y行的首地址。widthstep是指圖像每行所佔的字節數,主要要和width區別,width是指每行所含的像素個數,可是一個像素也可能佔一個字節,也可能佔三個字節或者四個。imagedata是指向存儲圖像像素值數組的指針,內容是這個數組的首地址,pt.y指的是像素點的行座標,因此Img->imageData + Img->widthStep*pt.y即是該像素點所在行的首地址,而後再加上該像素點所在的列,即pt.x,就獲得了該像素點的地址,因此那句代碼也能夠寫成
((uchar*)(Img1->imageData + Img1->widthStep*pt.y+pt.x)),
都是指該像素點的像素值,至於強制類型轉換,是由於會產生一些負值,而像素值是不能爲負的。
(2)widthStep表示存儲一行像素須要的字節數。widthStep必須是4的倍數,若是8U圖像寬度爲3,那麼widthStep是4,加一個字節補齊。這個圖像的一行須要4個字節,只使用前3個,最後一個空在那兒不用。也就是一個寬3高3的圖像的imageData數據大小爲4*3=12字節。若是32F的圖像,那麼widthStep=width*4。