web-dev-qa-db-fra.com

Appliquer le masque à l'image dans OpenCV?

J'ai un masque binaire que je souhaite appliquer en permanence à une image couleur. Comment procéder? ... Le masque binaire doit être de préférence permanent, car je ne veux pas réappliquer le masque à l'image à chaque fois appeler une fonction.

Des exemples de code de base seraient appréciés. Si vous utilisez du code, veuillez l'expliquer au lieu de le poster.

Je vous remercie

16
fdh

Vous n'appliquez pas de masque binaire à une image. Vous utilisez (éventuellement) un masque binaire dans un appel de fonction de traitement pour indiquer à la fonction les pixels de l'image que vous souhaitez traiter. Si je comprends mal votre question, vous devriez ajouter plus de détails pour clarifier.

8
SSteve

Bien que la réponse de @perrejba soit correcte, elle utilise les fonctions héritées du style C. Comme la question est étiquetée C++, vous pouvez utiliser une méthode à la place:

inputMat.copyTo(outputMat, maskMat);

Tous les objets sont de type cv::Mat.

S'il vous plaît être conscient que le masquage est binaire. Toute valeur différente de zéro dans le masque est interprétée comme une copie à copier. Même si le masque est une image en niveaux de gris.

Sachez également que la fonction .copyTo () n’efface pas la sortie avant la copie.

Si vous souhaitez modifier définitivement l'image d'origine, vous devez effectuer une copie/clone/affectation supplémentaire. La fonction copyTo () n'est pas définie pour le chevauchement des images d'entrée/sortie. Vous ne pouvez donc pas utiliser la même image en entrée et en sortie.

54
Chaos_99

Vous pouvez utiliser le masque pour copier uniquement la région d’intérêt d’une image originale vers une image de destination:

cvCopy(origImage,destImage,mask);

mask devrait être un tableau monocanal de 8 bits.

En savoir plus sur le Documents OpenCV

5
volpato

Eh bien, cette question apparaît en haut des résultats de recherche, alors je pense que nous avons besoin d'un exemple de code ici. Voici le code Python:

import cv2

def apply_mask(frame, mask):
    """Apply binary mask to frame, return masked image.
    """
    return cv2.bitwise_and(frame, frame, mask=mask)

Le masque et le cadre doivent avoir la même taille, de sorte que les pixels restent tels quels où masque est 1 et sont mis à zéro, où masque pixel est 0.

Et pour C++ c'est un peu différent:

cv::Mat inFrame; // Original (non-empty) image
cv::Mat mask; // Original (non-empty) mask

// ...

cv::Mat outFrame;  // Result output
inFrame.copyTo(outFrame, mask);
2
rudyryk

Voici un code pour appliquer un masque binaire sur une séquence d'images vidéo acquise à partir d'une webcam . Commenter et décommenter la ligne "bitwise_not (Mon_mask, Mon_mask);" et voir l'effet.

meilleurs, Ahmed.

#include "cv.h"      // include it to used Main OpenCV functions.
#include "highgui.h" //include it to use GUI functions.

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    int c;

int radius=100;
      CvPoint2D32f center;
    //IplImage* color_img;
      Mat image, image0,image1; 
        IplImage *tmp;
    CvCapture* cv_cap = cvCaptureFromCAM(0);

    while(1)  {
        tmp = cvQueryFrame(cv_cap); // get frame
          // IplImage to Mat
            Mat imgMat(tmp);
            image =tmp; 



    center.x = tmp->width/2;
    center.y = tmp->height/2;

         Mat Mon_mask(image.size(), CV_8UC1, Scalar(0,0,0));


        circle(Mon_mask, center, radius, Scalar(255,255,255), -1, 8, 0 ); //-1 means filled

        bitwise_not(Mon_mask,Mon_mask);// commenté ou pas = RP ou DMLA 





        if(tmp != 0)

           imshow("Glaucom", image); // show frame

     c = cvWaitKey(10); // wait 10 ms or for key stroke
    if(c == 27)
        break; // if ESC, break and quit
    }
    /* clean up */
    cvReleaseCapture( &cv_cap );
    cvDestroyWindow("Glaucom");

}
0
Ahmed