2016-12-23 6 views
0

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?

Répondre

0

Ceci est pour ceux qui peuvent avoir le même problème avec EmguCV 3.1 FloodFill. Après débogage de mon code pendant assez longtemps, je suis convaincu que l'implémentation de EmguCV 3.1 de CvInvoke.FloodFill est buggée. Il n'y avait aucun moyen d'obtenir un masque de cette méthode en utilisant le drapeau FloodFillType.MaskOnly. Au lieu de cela, j'ai fini par éditer mon image originale pour avoir des valeurs entre 0 et 254, puis j'ai fait un FloodFill normal en utilisant la valeur de remplissage 255. Puis utilisé Image.InRange() méthode pour séparer tous les 255 pixels (remplis) de l'image originale. Je signalerai le bug à l'équipe d'EmguCV et verrai ce qui se passe.