Как прочитать bmp в cv::Mat?

209
08 февраля 2018, 17:27

Очень хочу понять как преобразовать данный од чтобы он работал для открытия 1-битных bmp файлов. Вот нашёл такой код...

CFile File;
char *ReadBuffer; // Pointer to read buffer
char *OutputBuffer; // Pointer to output buffer
BITMAPFILEHEADER BmpFileHeader;
unsigned int BmpHeadSize;
char *BmpHeadPtr;
File.Open(FileName);
SrcFile.Read(&BmpFileHeader, sizeof(BmpFileHeader);
BmpHeadSize = BmpFileHeader.bfOffBits - sizeof(BmpFileHeader);
BmpHeadPtr = new char[BmpHeadSize];
File.Read(BmpHeadPtr, BmpHeadSize);
BmpInfoPtr = (BITMAPINFOHEADER*)BmpHeadPtr;
ReadBuffer = new char[BmpInfoPtr->biSizeImage];
SrcFile.Read(ReadBuffer, BmpInfoPtr->biSizeImage);
OutputBuffer = new char[BmpInfoPtr->biSizeImage];
for (i = 0; i < IMAGE_HEIGHT; i++)
{
    //Use this line if the bitmap is 24 bit
        memcpy(&OutputBuffer[(IMAGE_HEIGHT - i - 1) * IMAGE_WIDTH * 3],
            &ReadBuffer[i * IMAGE_WIDTH * 3], IMAGE_WIDTH * 3);
}
memcpy(m_Ipl->imageData, OutputBuffer, BmpInfoPtr->biSizeImage);

И всё как бы норм работает, однако если считывать однобитные bmp, то тогда падает. Кто нибудь может помочь разобраться как с моим вопросом?

Answer 1

Если стоит задача загрузить изображение из файла (не важно какое), и Вы работаете с OpenCV, то логично использовать средства загрузки изображений непосредственно OpenCV, например по схеме:

char *fileName = "MyFile.bmp";
cv::Mat image = cv::imread( fileName )
if (image.data == 0)
{
    //Ошибка чтения 
    cerr << "Incorret input file name:   " << fileName  << endl;
    return EXIT_FAILURE;
}
//Обработка изображения
.....

Соответственно, все обработку тоже лучше делать средствами OpenCV

READ ALSO
Как использовать CloseHandle

Как использовать CloseHandle

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

226
C++ проэкт, VS-2017, почему не находится хеадер

C++ проэкт, VS-2017, почему не находится хеадер

Знаю дуракций вопрос но может всё же поможетехеадер table

183
Внутренности сопрограмм с++

Внутренности сопрограмм с++

Пытаюсь понять работу сопрограмм в с++17Что это такое и по что оно нужно - более-менее понятно из ответа к вопросу Сопрограммы в С++

143
Реализовать функцию объединения двух wav mono файлов в один wav stereo файл

Реализовать функцию объединения двух wav mono файлов в один wav stereo файл

Задание:"Реализовать функцию объединения двух mono файлов в один stereo файл, где первый файл является левым каналом, а второй правым каналом выходного...

198