Как отмечает SSteve, конструкторы Mat переходят в строки, затем в столбцы, поэтому используйте height, а затем width.Однако нет необходимости делать фактическую копию самостоятельно.Вы можете использовать один из конструкторов Mat, который обернет существующие данные без копирования, а затем заставит их копировать, вызвав функцию-клон.
Единственная другая проблема заключается в том, что Gdiplus :: Bitmap в теории поддерживает множество пикселеймакеты;однако большинство из них довольно экзотические.Вы можете обрабатывать простой случай следующим образом:
cv::Mat GdiPlusBitmapToOpenCvMat(Gdiplus::Bitmap* bmp)
{
auto format = bmp->GetPixelFormat();
if (format != PixelFormat24bppRGB)
return cv::Mat();
int wd = bmp->GetWidth();
int hgt = bmp->GetHeight();
Gdiplus::Rect rcLock(0, 0, wd, hgt);
Gdiplus::BitmapData bmpData;
if (!bmp->LockBits(&rcLock, Gdiplus::ImageLockModeRead, format, &bmpData) == Gdiplus::Ok)
return cv::Mat();
cv::Mat mat = cv::Mat(hgt, wd, CV_8UC3, static_cast<unsigned char*>(bmpData.Scan0), bmpData.Stride).clone();
bmp->UnlockBits(&bmpData);
return mat;
}