Avec OpenCV, essayez d'extraire une région d'une image décrite par ArrayOfArrays
Je suis le développement de certains outils de traitement d'image dans iOS. Actuellement, j'ai un contour des caractéristiques calculées, qui est de type InputArrayOfArrays.
Déclaré:
std::vector<std::vector<cv::Point> > contours_final( temp_contours.size() );
Maintenant, j'aimerais extraire les domaines de l'original RVB de l'image encerclé par des contours et peuvent, en outre, magasin de sous-image de cv::Mat format. Comment puis-je le faire?
Merci d'avance!
source d'informationauteur feng63600
Vous devez vous connecter pour publier un commentaire.
Je devine ce que vous voulez faire est d'extraire les régions dans le à la détection de contours. Voici une solution possible:
Vous pouvez également envisager de sauver l'individu masques pour éventuellement l'utiliser comme un canal alpha dans le cas où vous souhaitez enregistrer les sous-régions dans un format qui prend en charge la transparence (par exemple, png).
NOTE: je ne suis PAS en extrayant TOUS les pixels dans la zone de sélection pour chaque contour, seulement ceux à l'intérieur du contour. Les Pixels qui ne sont pas à l'intérieur du contour, mais dans la boîte englobante sont mis à 0. La raison en est que votre Tapis objet est un tableau et qui fait qu'il est de forme rectangulaire.
Enfin, je ne vois aucune raison pour vous de simplement enregistrer les pixels du contour dans un spécialement créé structure de données, car vous auriez alors besoin de stocker la position de chaque pixel afin de recréer l'image. Si votre préoccupation est de gagner de l'espace, qui ne serait pas vous sauver beaucoup d'espace. Économiser de l'étanchéité de la boîte englobante suffirait. Si au contraire vous souhaitez simplement analyser les pixels du contour de la région, puis enregistrer une copie du masque, pour chaque contour de sorte que vous pouvez l'utiliser pour vérifier des pixels à l'intérieur du contour.
Vous êtes à la recherche pour le
cv::approxPolyDP()
fonction de relier les points.J'ai partagé une utilisation similaire de la procédure dans son ensemble en ce post. De vérifier la
for
boucle après lafindContours()
appel.Je pense que vous êtes à la recherche pour les cv::boundingRect().
Quelque chose comme ceci:
cv::boundingRect() prend un vecteur de Points et renvoie un cv::Rect. L'initialisation d'un Tapis de myRoi = img(myRect) vous donne un pointeur sur la partie de l'image (donc la modification de myRoi va ÉGALEMENT modifier img).
Voir plus ici.