Доступ к отрицательным значениям пикселей OpenCV - PullRequest
2 голосов
/ 20 июля 2010

Я пытаюсь выполнить определение края пересечения нуля на изображении в OpenCV.Я размываю и использую cvLaplace (), затем масштабирую его от (0, max).Мой вопрос: как я могу получить доступ к значениям пикселей в этом изображении таким образом, чтобы правильно идентифицировать отрицательные значения?Использование функции, предоставляемой OpenCV (cvPtr2D), возвращает символы без знака.Есть идеи или комментарии?

Спасибо

1 Ответ

7 голосов
/ 21 июля 2010

Пиксели хранятся внутри как IPL_DEPTH_8U, что означает 8-разрядный символ без знака, в диапазоне от 0 до 255. Но вы также можете упаковать их как IPL_DEPTH_16S (целое число со знаком) и даже IPL_DEPTH_32F (число с плавающей запятой одинарной точности).

cvConvertScale (), вероятно, сделает эту работу! Но если вы хотите конвертировать его вручную: OpenCV необходимо преобразовать IPL_DEPTH_32S в IPL_DEPTH_32F

Основная идея - создать новое изображение с помощью cvCreateImage () и того формата, который вам нужен, а затем использовать cvConvertScale (), чтобы скопировать исходные данные в новый формат. В конце ваш код может выглядеть примерно так:

IplImage* img = cvLoadImage("file.png", CV_LOAD_IMAGE_ UNCHANGED);
// then retrieve size of loaded image to create the new one

IplImage* new_img = cvCreateImage(img_size, IPL_DEPTH_16S, 1);

cvConvertScale(img, new_img, 1/255.0, -128);

Я думаю, что это отвечает на вопрос темы.

Отвечая на ваш комментарий, вы можете получить доступ к информации о пикселях следующим образом:

IplImage* pRGBImg = cvLoadImage(input_file.c_str(), CV_LOAD_IMAGE_UNCHANGED); 
int width = pRGBImg->width; 
int height = pRGBImg->height;
int bpp = pRGBImg->nChannels; 
for (int i=0; i < width*height*bpp; i+=bpp) 
{
  if (!(i % (width*bpp))) // print empty line for better readability
      std::cout << std::endl;

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

Не забудьте проголосовать и пометить этот ответ как принятый, если он был.

...