Преобразование GdiPlus :: Bitmap в OpenCV IplImage - PullRequest
3 голосов
/ 21 января 2011

У меня 24bpp GdiPlus::Bitmap, который мне нужно конвертировать в IplImage (opencv) Кто-нибудь знает, как это можно сделать?

Ответы [ 3 ]

1 голос
/ 27 января 2011

Вот как вы можете это сделать.

1.) Создайте новый целевой объект IplImage с размерами исходного изображения (GdiPlus :: Bitmap)

2.) Получите дескриптор пиксельных данных исходного изображения, используя lockbits

3.) Скопируйте исходные пиксельные данные в целевые изображения

4.) UnlockBits исходного изображения

0 голосов
/ 21 апреля 2016

Сложность в том, что Gdiplus :: Bitmap теоретически поддерживает множество экзотических пиксельных форматов, поэтому в общем случае преобразование будет многословным.Тем не менее, основной случай выглядит следующим образом:

IplImage* GdiPlusBitmapToOpenCvImage(Gdiplus::Bitmap* bmp)
{
    auto format = bmp->GetPixelFormat();
    if (format != PixelFormat24bppRGB)
        return nullptr;

    Gdiplus::Rect rcLock(0, 0, bmp->GetWidth(), bmp->GetHeight());
    Gdiplus::BitmapData bmpData;

    bmp->LockBits(&rcLock, Gdiplus::ImageLockModeRead, format, &bmpData);

    int buffSz = bmpData.Stride * bmpData.Height;
    int depth = 8, channel = 3;
    IplImage* cvImage = cvCreateImage(CvSize(rcLock.Width, rcLock.Height), depth, channel);
    const unsigned char* src = static_cast<unsigned char*>(bmpData.Scan0);
    std::copy(src, src + buffSz, cvImage->imageData);

    bmp->UnlockBits(&bmpData);
    return cvImage;
}
0 голосов
/ 17 сентября 2014

Вот ответ на ваш вопрос с той лишь разницей, что BitMap преобразует в Mat: Преобразовать растровое изображение в Mat

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