OpenCV cvSet2d ..... что это делает - PullRequest
1 голос
/ 17 ноября 2010

Я просматривал какой-то код на странице OpenCV, когда дело дошло до доступа к пиксельным данным

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

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

Я привык к CVscalars и тому подобному, но я не понимаю этот формат? Что конкретно означает 111?

спасибо

Ответы [ 2 ]

5 голосов
/ 18 ноября 2010

Функция cvSet2D (img, i, j, s) не обеспечивает доступ к (i, j) -ому пикселю.Доступ к (j, i) -ому пикселю.Это потому, что изображения хранятся в виде матрицы - вам нужно сначала указать строку (координату Y), а затем столбец (координату X).

Вместо использования функций cvGet / Set, вы пытались использование указателей для доступа к данным в изображении ?

0 голосов
/ 19 ноября 2010

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

// 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...