【发布时间】:2011-06-12 23:02:18
【问题描述】:
我有一个 24bpp GdiPlus::Bitmap 需要转换为 IplImage (opencv)。
有谁知道如何做到这一点?
【问题讨论】:
我有一个 24bpp GdiPlus::Bitmap 需要转换为 IplImage (opencv)。
有谁知道如何做到这一点?
【问题讨论】:
困难在于 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;
}
【讨论】:
这是您的问题的答案,唯一的区别是 BitMap 转换为 Mat:Convert Bitmap to Mat
【讨论】:
你可以这样做。
1.) 创建一个新的目标 IplImage 对象,其尺寸为 Source image (GdiPlus::Bitmap)
2.) 使用lockbits获取Source image的pixeldata句柄
3.) 将源像素数据复制到目标图像数据
4.) 源图像的 UnlockBits
【讨论】: