Comment puis-je obtenir et définir les valeurs des pixels d'une EmguCV Tapis d'image?
Je suis en utilisant le EmguCV 3.0.0 wrapper pour la OpenCV 3.0 bibliothèque. Je suis à l'aide de la Mat
classe dans quelques endroits. Voici un exemple d'un canal unique, 8x8 image de double
valeurs:
Mat image = new Mat(8, 8, DepthType.Cv64F, 1);
La Image<>
classe fournit moyens raisonnables pour l'obtention et définition des valeurs de pixel, et la méthode est identique pour les de la Matrice<>
classe, mais il ne semble pas aussi évident pour le Mat
classe. Le seul moyen que j'ai compris comment le jeu pixel est à l'aide d'un masque:
//set two pixel values, (0,0) to 9.0, (2, 3) to 42.0
Matrix<byte> mask = new Matrix<byte>(8,8);
mask.Data[0, 0] = 1;
image.SetTo(new MCvScalar(9.0), mask);
mask = new Matrix<byte>(8,8);
mask.Data[2, 3] = 1;
image.SetTo(new MCvScalar(42.0), mask);
C'est se sent comme il devrait être de deux lignes, pas six, alors que j'ai l'impression de manquer quelque chose. Les choses deviennent encore plus compliquées lorsque l' Mat
est plus qu'un seul canal, parce que Matrix<>
est seulement en 2D, de sorte que le masque doit être utilisé pour définir le pixel sur chaque canal.
Je ne peut pas se permettre de mémoire et de temps pour définir les pixels de cette façon. Comment puis-je définir des pixels avec un seul appel de méthode?
C'est ce que j'attendais. Mais ça ne fonctionne pas. Voici l'erreur: "Ne peut pas appliquer l'indexation [] à une expression du type" Emgu.CV.Mat'"
OriginalL'auteur kdbanman | 2015-08-27
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir des éléments de Mat par la copie de la mémoire non gérée à l'aide de blocs de DataPointer et la conversion géré non géré types. Les valeurs de réglage est de regroupement dans la direction opposée.
Pour un exemple, vous pouvez utiliser une extension de la classe
Puis l'obtention et la valeur de réglage est possible par un simple appel de méthode
Tests avec 200000000 opérations montre que le type dynamique de version peut être jusqu'à ~2,5 x plus lent que statique.
dynamic
, qui ressemble très agréable à utiliser! Mon seul problème est quedynamic
peut être ~10 ~100 fois plus lent que le typage statique des solutions de rechange. (voir ici et ici.) Vos méthodes d'extension devrait être rapidement extrémité de cette échelle, parce que ledynamic
réception de type changent rarement.De même, optimisé
Get/SetValue()
méthodes en toute sécurité de retour/réception dedouble
devrait être possible, car il y a un sûr de conversion automatique de toute Emgu pris en chargeDepthType
àdouble
.Merci!!!! Je ne m'attendais pas à ça. Si le EmguCV responsable de ne pas se déplacer à l'appui de cette mieux, je vais inclure une méthode d'extension comme la vôtre bientôt.
OriginalL'auteur Bartosz Rachwal
Basé sur la Bartosz Rachwal de la grande réponse, j'ai essayé de l'écrire pour OpenCvSharp:
Les deux sont OpenCV wrapper, pas très différent comme vous le voyez. Quand j'ai besoin d'une connaissance à propos de quelque chose que je ne pas seulement regarder pour OpenCvSharp threads. EMGU, Rpc même Phton exemples me donner beaucoup d'aide. Une nouvelle question serait perte de temps je pense. C'est le même problème, et presque le même code. Recherche toute personne comme moi pourrait en faire usage. Aussi vos discussions à propos de la dynamique est une bonne lecture, quelqu'un qui serait d'utiliser cela devrait également lire. Merci.
OriginalL'auteur Koray