Mon arrière-plan est C++ et j'ai essayé de traduire une de mes applications qui utilise OpenCV à une application C# qui utilise EmguCV. J'ai lu la documentation d'EmguCV et Wiki ainsi que StackOverflow Q/As aussi profondément que possible humainement sans la chance de résoudre certains des problèmes de base. À ce stade, je me demande si la façon dont je pense à EmguCV est fondamentalement erronée.Manière correcte de gestion de la mémoire en utilisant Emgu CV 3.1
J'avais l'impression que lorsque EmguCV a fourni une interface à la bibliothèque C++, disons FloodFill
en utilisant CvInvoke.FloodFill(IInputOutputArray, IInputOutputArray, ...)
, en dessous prend soin de sa propre gestion de la mémoire au point que les retournant IInputOutputArray
s (dans mon cas, un Mat
) est tout pris en charge. En pratique cependant, un appel à CvInvoke.FloodFill
échoue avec une exception de la DLL.
C'est ce que j'ai:
int i = ...
int j = ...
int intensity = ...
int height = img.Rows;
int width = img.Cols;
Mat outputMask = new Mat(height + 2, width + 2, DepthType.Cv8U, 1);
Rectangle dummy = new Rectangle();
CvInvoke.FloodFill(img, outputMask, new Point(i, j), new MCvScalar(255), out dummy, new MCvScalar(intensity), new MCvScalar(intensity), Connectivity.EightConnected, FloodFillType.MaskOnly);
Mais l'appel échoue avec une description d'exception qui n'est pas utile. J'ai utilisé GCHandle
allocation et épinglage pour d'autres méthodes pour être en mesure d'accéder aux données brutes ci-dessous, mais je crois que CvInvoke.FloodFill
devrait être sûr lorsqu'il est appelé sur certains Mat
s locaux.
Ma question est de savoir si je suis complètement hors de propos de la façon dont EmguCV est censé être utilisé compte tenu de mes antécédents avec C++ et OpenCV. Si oui, quelle est la bonne façon d'appeler une telle fonction?