Начните с исследования , как структурирована PGM :
Each PGM image consists of the following:
1. A "magic number" for identifying the file type.
A pgm image's magic number is the two characters "P5".
2. Whitespace (blanks, TABs, CRs, LFs).
3. A width, formatted as ASCII characters in decimal.
4. Whitespace.
5. A height, again in ASCII decimal.
6. Whitespace.
7. The maximum gray value (Maxval), again in ASCII decimal.
Must be less than 65536, and more than zero.
8. A single whitespace character (usually a newline).
9. A raster of Height rows, in order from top to bottom.
Each row consists of Width gray values, in order from left to right.
Each gray value is a number from 0 through Maxval, with 0 being black
and Maxval being white. Each gray value is represented in pure binary
by either 1 or 2 bytes. If the Maxval is less than 256, it is 1 byte.
Otherwise, it is 2 bytes. The most significant byte is first.
Для PGM типа P2 пиксели читаются (ASCII) в файле, но для P5 они не будут, потому чтоони будут храниться в двоичном формате.
Одна важная вещь Вы должны знать, что этот формат занимает всего 1 канал на пиксель.Это означает, что PGM может хранить только СЕРЫЙ масштабированный изображения .Запомните это!
Теперь, если вы используете OpenCV для загрузки изображений из файла, вы должны загрузить их, используя CV_LOAD_IMAGE_GRAYSCALE :
IplImage* cv_img = cvLoadImage("chairs.png", CV_LOAD_IMAGE_GRAYSCALE);
if(!cv_img)
{
std::cout << "ERROR: cvLoadImage failed" << std::endl;
return -1;
}
Но если вы используетелюбой другой флаг этой функции, или если вы создаете изображение с cvCreateImage()
, или если вы снимаете кадры с камеры или что-то в этом роде, вам нужно преобразовать каждый кадр в его представление в оттенках серого используя cvCvtColor()
.
Я скачал lsd-1.5 и заметил, что там есть пример, который показывает, как использовать библиотеку.Один из файлов исходного кода с именем lsd_cmd.c вручную читает файл PGM и собирает с ним image_double
.Функция, которая делает этот трюк, - read_pgm_image_double()
, и она считывает пиксели из файла PGM и сохраняет их внутри image->data
.Это важно, потому что если следующее не работает, вам придется перебирать пиксели IplImage
и делать это самостоятельно.
После успешной загрузки серого масштабированного изображения в IplImage* cv_img
, вы можете попробоватьчтобы создать нужную структуру с помощью:
image_double image = new_image_double(cv_img->width, cv_img->height);
image->data = (double) cv_img->imageData;
В случае, если это не сработает, вам нужно проверить файл, который я предложил выше, перебрать пиксели cv_img->imageData
и скопировать их по одномуодин (делает правильное преобразование типов) в image->data
.
В конце не забудьте освободить этот ресурс, когда вы закончите, используя его:
free_image_double(image);