2010-11-17 2 views
1

я просматривал в течение некоторого кода на странице OpenCV, когда он пришел к доступу пиксельных данныхOpenCV cvSet2d ..... то, что делает это делать

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 
CvScalar s; 
s=cvGet2D(img,i,j); // get the (i,j) pixel value 
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); 
s.val[0]=111; 
s.val[1]=111; 
s.val[2]=111; 
cvSet2D(img,i,j,s); // set the (i,j) pixel value 

я сделал что-то подобное, но я использовал шаблон класса предоставленный для доступа к данным о пикселях ...... в любом случае Im не уверен, что я понимаю часть s.val [0] = 111 .... и т. д.? , если s.val [0] содержит значение B, что именно является s.val [0] = 111 делать? это установить его на черный? ........ Я не понимаю точно, что это должно быть?

Я использовал для CVscalars и таких, но я не понимаю этот формат? В частности, что означает 111?

благодарит

ответ

5

cvSet2D (IMG, I, J, S) функции, которые не получить доступ к (I, J) -го пикселя. Он обращается к (j, i) -му пикселю. Это потому, что изображения хранятся в виде матрицы - вам нужно сначала указать строку (координату Y), а затем столбец (координата X).

Вместо использования функций cvGet/Set вы попробовали using pointers to access data within an image?

+0

Хороший вопрос, но я бы утверждать, что я не обязательно определяется как стоя на оси Х в любом случае .. – ypnos

+0

Но что означает 111? – 2010-11-20 16:10:50

+0

Это значение, которое вы устанавливаете на этом пикселе - вы устанавливаете триплет (s.val [0], s.val [1], s.val [2]) в точке (j, i) –

0

Если вы хотите прямой доступ к пикселям, после загрузки изображения вы могли бы сделать что-то вроде:

// This example converts a colored image to its grayscale version. 
// Let's say that rgb_img is your previously loaded image. 
IplImage* gray_frame = 0; 
gray_frame = cvCreateImage(cvSize(rgb_img->width, rgb_img->height), rgb_img->depth, rgb_img->nChannels); 
if (!gray_frame) 
{ 
    fprintf(stderr, "!!! cvCreateImage failed!\n"); 
    return NULL; 
} 

for (int i = 0; i < rgb_img->width * rgb_img->height * rgb_img->nChannels; i += rgb_img->nChannels) 
{ 
    gray_frame->imageData[i] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //B 
    gray_frame->imageData[i+1] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //G 
    gray_frame->imageData[i+2] = (rgb_img->imageData[i] + rgb_img->imageData[i+1] + rgb_img->imageData[i+2])/3; //R 
} 
Смежные вопросы