Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将GdiPlus::位图转换为OpenCV IplImage_C++_Opencv_Bitmap_Gdi+ - Fatal编程技术网

C++ 将GdiPlus::位图转换为OpenCV IplImage

C++ 将GdiPlus::位图转换为OpenCV IplImage,c++,opencv,bitmap,gdi+,C++,Opencv,Bitmap,Gdi+,我有一个24bppGdiPlus::Bitmap,我需要将它转换成IplImage(opencv)。 有人知道如何做到这一点吗?以下是您可以做到的方法 1.)使用源图像(GdiPlus::位图)的尺寸创建新的目标IplImage对象 2.)使用锁定位获取源图像的像素数据句柄 3.)将源像素数据复制到目标图像数据 4.)解锁源图像的位这里是对您的问题的答案,唯一的区别是位图转换为Mat:困难在于Gdiplus::BitMap在理论上支持许多奇异的像素格式,因此在一般情况下,转换将是冗长的。但是,基

我有一个24bpp
GdiPlus::Bitmap
,我需要将它转换成
IplImage
(opencv)。
有人知道如何做到这一点吗?

以下是您可以做到的方法

1.)使用源图像(GdiPlus::位图)的尺寸创建新的目标IplImage对象

2.)使用锁定位获取源图像的像素数据句柄

3.)将源像素数据复制到目标图像数据


4.)解锁源图像的位

这里是对您的问题的答案,唯一的区别是位图转换为Mat:

困难在于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;
}
IplImage*GdiPlusBitmapToOpenCvImage(Gdiplus::Bitmap*bmp)
{
自动格式化=bmp->GetPixelFormat();
如果(格式!=像素格式24bpprgb)
返回空ptr;
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深度=8,通道=3;
IplImage*cvImage=cvCreateImage(CvSize(rcLock.Width,rcLock.Height)、深度、通道);
const unsigned char*src=static_cast(bmpData.Scan0);
std::copy(src,src+buffSz,cvImage->imageData);
bmp->解锁位(&bmpData);
返回图像;
}