J'essaye de convertir un GDIPlus :: Bitmap en un objet openCV Mat, mais je rencontre des problèmes avec les violations d'accès, ce qui signifie que je '' Je ne fais pas quelque chose de bien, mais j'ai regardé le code encore et encore, et je pense que ça devrait marcher.Conversion de GDIPlus :: Bitmap en cv :: Mat (interface OpenCV C++)
Est-ce que quelqu'un voit un problème évident?
cv::Mat ConvertToOpenCV(Gdiplus::Bitmap &image) {
cv::Mat *retval = new cv::Mat(
image.GetWidth(), image.GetHeight(), CV_8UC3
);
Gdiplus::BitmapData source;
Gdiplus::Rect rect(0, 0, image.GetWidth(), image.GetHeight());
Gdiplus::Status status =
image.LockBits(&rect, Gdiplus::ImageLockModeRead, PixelFormat24bppRGB, &source);
if (status != Gdiplus::Ok) {
// Some error condition
return retval; // No image copied
}
BYTE *destination = (BYTE *)retval->data;
for (int y = 0; y != source.Height; ++y) {
BYTE *src = (BYTE *) source.Scan0 + y * source.Stride;
BYTE *dst = (BYTE *)(destination + y * retval->step);
memcpy(dst, src, 3 * source.Width); // Access Violation happens here
}
image.UnlockBits(&source);
return retval;
}
Doh! Merci beaucoup d'avoir attrapé ça, je n'ai même pas pensé à regarder ça! Et c'est un bon cas de test que je dois ajouter à mes tests unitaires. Je crois que toutes mes images de test sont carrées, et cela cacherait ce comportement! La couleur ne compte pas vraiment pour moi, parce que je convertis en niveaux de gris et en différant les images, donc je n'ai pas pris la peine de le faire. Merci beaucoup d'avoir attrapé ma stupide erreur! – RussTheAerialist
Je dois l'avoir trouvé parce que je suis tellement habitué à trouver des trucs comme ça dans mon propre code! Je ne peux pas vous dire combien de fois j'ai utilisé MIN() alors que j'aurais dû utiliser MAX(). :-) – SSteve