wake-up-neo.com

Maske in OpenCV auf das Bild anwenden?

Ich habe eine binäre Maske, die ich dauerhaft auf ein Farbbild anwenden möchte, wie dies geschehen soll. Die binäre Maske sollte vorzugsweise permanent sein, da ich die Maske nicht jedes Mal erneut auf das Bild anwenden möchte eine Funktion aufrufen.

Grundlegende Code-Beispiele wären willkommen. Wenn Sie Code verwenden, erklären Sie ihn bitte, anstatt ihn nur zu veröffentlichen.

Danke dir

16
fdh

Sie wenden keine binäre Maske auf ein Bild an. Sie verwenden (optional) eine binäre Maske in einem Verarbeitungsfunktionsaufruf, um der Funktion mitzuteilen, welche Pixel des Bildes Sie verarbeiten möchten. Wenn ich Ihre Frage völlig falsch interpretiere, sollten Sie zur Klarstellung weitere Details hinzufügen.

8
SSteve

Die Antwort von @perrejba ist zwar korrekt, verwendet jedoch die älteren C-Style-Funktionen. Da die Frage mit C++ markiert ist, möchten Sie möglicherweise stattdessen eine Methode verwenden:

inputMat.copyTo(outputMat, maskMat);

Alle Objekte sind vom Typ cv::Mat.

Bitte beachten Sie, dass die Maskierung binär ist. Jeder Wert ungleich Null in der Maske wird als "Kopieren" interpretiert. Auch wenn die Maske ein Graustufenbild ist.

Beachten Sie auch, dass die Funktion .copyTo () die Ausgabe vor dem Kopieren nicht löscht.

Wenn Sie das Original-Image dauerhaft ändern möchten, müssen Sie eine zusätzliche Kopie/Klon/Zuordnung vornehmen. Die Funktion copyTo () ist nicht für überlappende Eingabe-/Ausgabebilder definiert. Sie können also nicht dasselbe Bild als Eingabe und Ausgabe verwenden.

54
Chaos_99

Sie können die Maske verwenden, um nur den gewünschten Bereich eines Originalbilds in ein Zielbild zu kopieren:

cvCopy(origImage,destImage,mask);

dabei sollte mask ein 8-Bit-Einkanal-Array sein.

Mehr dazu unter OpenCV docs

5
volpato

Nun, diese Frage erscheint über den Suchergebnissen. Ich glaube, wir brauchen hier ein Codebeispiel. Hier ist der Python-Code:

import cv2

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

Maske und Rahmen müssen dieselbe Größe haben, Pixel bleiben also unverändert, wobei Maske 1 ist, und werden auf Null gesetzt, wobei Maskenpixel 0 ist.

Und für C++ ist es ein bisschen anders:

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

Hier ist etwas Code zum Anwenden einer binären Maske auf eine Video-Frame-Sequenz, die von einer Webcam abgerufen wird. Kommentieren Sie die Zeile "bitwise_not (Mon_mask, Mon_mask);" und kommentieren Sie den Effekt.

bests.... 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