Simple passage de Matrices ie. cv::Mat pour les fonctions en OpenCV2.4
Je suis nouveau sur opencv et j'ai un doute avec l'un des plus simples opérations de codage: la transmission de valeurs de fonctions.
Heres ce que je veux faire,
- Initialiser un
cv:Mat
dans la fonction principale à dire que les valeurs de 0 à 50. - Passer cette matrice sous la forme d'un argument à une fonction
foo()
qui à leur tour tout simplement imprime les valeurs de chaque élément de la matrice. Thats it.
Maintenant que j'ai lu à plusieurs endroits que, lorsque ces matrices sont écoulés, il est seulement l'en-tête qui passe, mais pas les données. Alors, comment suis-je encore capable de lire les valeurs de cette matrice dans la fonction appelée, comme si l'ensemble de la matrice a été adoptée?
- Où sont ces endroits? Pouvez-vous partager des références?
- opencv.willowgarage.com/documentation/cpp/...
Vous devez vous connecter pour publier un commentaire.
De comprendre ce que vous avez besoin de prendre un coup d'oeil à C++ constructeurs, plus précisément la constructeur de copie.
Lorsque vous créez un
cv::Mat
à partir d'un autrecv::Mat
, comme dans:la constructeur de copie (qui est une fonction) de
cv::Mat
est appelé à effectuer la copie de l'objet. Avant de parler de ce qui se passe dans la procédure de copie, vous devez réaliser que commecv::Mat
est utilisé pour stocker des images, des images plus grandes pourraient occuper des centaines de méga-octets en mémoire. Donc, ce que le constructeur de copie decv::Mat
dans l'exemple ci-dessus est de copier l'intégralité de l'en-tête (hauteur, largeur, profondeur d'infos et d'autres) dea
enb
, mais au lieu de copier l'ensemble des données/pixels dea
(qui peuvent être des centaines de MO), c'est juste des points (à l'aide d'un pointeur) pour les données d'origine dea
.En d'autres termes, pas la copie de l'ensemble de données d'image est une optimisation de la performance/décision.
Maintenant, considérons ce code qui appelle la fonction et passe
cv::Mat
en tant que paramètre:Si vous avez étudié comment passer des paramètres à des fonctions, vous savez que l'appel
do_something(a);
sera passez le paramètre par valeur. Cela signifie qu'il va essayer de copier le contenu deorig
ensrc
, cependant, cette procédure active le constructeur de copie decv::Mat
qui ne sera pas de faire une copie papier des données comme je l'ai expliqué.Solution à ce problème? Si vous écrivez
do_something()
et que vous voulez juste faire une copie réelle deorig
, il suffit de créer un nouveaucv::Mat
et appeler la méthodecopyTo()
:Mais rappelez-vous, si
src
est de ~100 MO d'appelcopyTo()
pour faire de la copie réelle va occuper une autre ~100 MO de mémoire, ce qui signifie que dans un seul appel de fonction de votre programme juste passé de 100 mo à 200 MO. Gardez cela à l'esprit lors de la conception de votre système. Bonne chance.