OpenCV2.1, функция карты?доступ к каждому пикселю? - PullRequest
0 голосов
/ 06 сентября 2010

У меня есть функция, которую я хотел бы применить к каждому пикселю в изображении YUN (назовите его src). Я хотел бы, чтобы вывод был сохранен в отдельном изображении, назовите его (dst).

Я знаю, что могу добиться этого с помощью арифметики указателей и доступа к базовой матрице изображения. Мне было интересно, есть ли более простой способ, скажем, предопределенная функция «map», которая позволяет мне отображать функцию на все пиксели?

Спасибо

1 Ответ

0 голосов
/ 08 сентября 2010

Поскольку я не знаю, что такое изображение в формате YUN, я предполагаю, что вы знаете, как преобразовать RGB в этот формат.

Мне неизвестен простой способ сделать упомянутую вами функцию map . В любом случае, OpenCV имеет несколько предопределенных функций для преобразования изображений, включая

cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);

который вы, возможно, захотите поближе.

Если вы хотите сделать свой собственный, вам необходимо получить доступ к каждому пикселю изображения по отдельности, и этот код показывает вам, как это сделать (код ниже пропускает все виды ошибок и проверок возврата для простоты ):

// Loading src image 
IplImage* src_img = cvLoadImage("input.png", CV_LOAD_IMAGE_UNCHANGED); 
int width = src_img->width; 
int height = src_img->height;
int bpp = src_img->nChannels; 

// Temporary buffer to save the modified image
char* buff = new char[width * height * bpp];

// Loop to iterate over each pixel of the original img
for (int i=0; i < width*height*bpp; i+=bpp) 
{
  /* Perform pixel operation inside this loop */

  if (!(i % (width*bpp))) // printing empty line for better readability
      std::cout << std::endl;

   std::cout << std::dec << "R:" << (int) src_img->imageData[i] <<  
                            " G:" << (int) src_img->imageData[i+1] <<  
                            " B:" << (int) src_img->imageData[i+2] << " "; 

  /* Let's say you wanted to do a lazy grayscale conversion */
  char gray = (src_img->imageData[i] + src_img->imageData[i+1] + src_img->imageData[i+2]) / 3;
  buff[i] = gray;
  buff[i+1] = gray;
  buff[i+2] = gray;
}

IplImage* dst_img = cvCreateImage(cvSize(width, height), src_img->depth, bpp);  
dst_img->imageData = buff;

if (!cvSaveImage("output.png", dst_img))
{
  std::cout << "ERROR: Failed cvSaveImage" << std::endl;
}

В основном код загружает изображение RGB с жесткого диска и выполняет преобразование в оттенках серого для каждого пикселя изображения, сохраняя его во временном буфере. Позже он создаст еще один IplImage с данными в градациях серого, а затем сохранит его в файл на диске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...