Cycle par le biais de pixels avec opencv
Comment pourrais-je être en mesure de passer à travers une image à l'aide d'opencv comme si c'était un tableau 2d pour obtenir les valeurs rvb de chaque pixel? Aussi, serait un mat être préférable par rapport à un iplimage pour cette opération?
- Double Possible: stackoverflow.com/questions/998429/...
- Je vais juste utiliser cette petite fonction que j'ai trouvé. flotteur pixval32f( IplImage* img, int r, int c ) { return ( (float*)(img->données images + img->widthStep*r) )[c]; }
- stackoverflow.com/questions/3859222/...
- stackoverflow.com/questions/3851604/...
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez C++, utilisez l'interface C++ de opencv et puis vous pouvez accéder aux membres via http://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-efficient-way ou à l'aide de cv::Mat::at(), par exemple.
cv::Mat
est préféré auIplImage
, car elle simplifie votre codeCela suppose que vous devez utiliser les valeurs RVB ensemble. Si vous ne le faites pas, vous pouvez utilise cv::split pour chaque canal séparément. Voir etarion de réponse pour le lien avec exemple.
Aussi, dans mon cas, vous avez besoin simplement de l'image en échelle de gris. Ensuite, vous pouvez charger l'image en niveaux de gris et d'y accéder comme un tableau de char.
Mise à JOUR: à l'Aide de split pour obtenir les 3 canaux
Mise à JOUR: Grâce à entarion pour repérer l'erreur que j'ai présenté lors de la copie et le collage à partir du cv::Vec3b exemple.
img.at<uchar>(i,j)[0]
- ce n'est pas le travail 🙂 le[0]
a aller+ > H
. Connaissez-vous une raison pour cela?Depuis OpenCV 3.0, il y a des officiels et de la façon la plus rapide pour exécuter la fonction de tous les coins du pixel en cv::Mat.
void cv::Mat::forEach (const Foncteur& opération)
Si vous utilisez cette fonction, l'exploitation s'exécute sur multi core automatiquement.
Divulgation : je suis contributeur de cette fonctionnalité.
Les docs montrent bien écrit comparaison de différentes façons pour effectuer une itération sur un Tapis d'image ici.
Le moyen le plus rapide est d'utiliser le C style des pointeurs. Voici le code copié à partir de la documentation:
Accès aux éléments avec l'at est assez lent.
Notez que si votre opération peut être effectuée à l'aide d'une table de recherche, le construit en fonction de LUT est de loin la manière la plus rapide (également décrits dans les docs).
Depuis OpenCV 3.3 (voir le changelog) il est également possible d'utiliser le C++11 de style de boucles:
Si vous souhaitez modifier RVB des pixels un par un, l'exemple ci-dessous va vous aider!
C'est une vieille question, mais a besoin d'obtenir des mises à jour depuis opencv est activement développée. Récemment, OpenCV a introduire parallel_for_ qui est conforme avec le c++11 lambda fonctions. Voici l'exemple
Cette mention est digne que cette méthode utilise les cœurs du PROCESSEUR de l'ordinateur moderne architectures.