Сложность в том, что 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;
}