web-dev-qa-db-ja.com

OpenCVの画像にマスクを適用しますか?

カラー画像に永続的に適用したいバイナリマスクがあります。これを行うにはどうすればよいですか。関数を呼び出すたびにマスクを画像に再適用したくないので、バイナリマスクは永続的であることが望ましいです。

基本的なコード例をいただければ幸いです。コードを使用する場合は、コードを投稿するだけでなく、説明してください。

ありがとうございました

18
fdh

バイナリマスクを画像に適用しません。 (オプション)処理関数呼び出しでバイナリマスクを使用して、処理する画像のピクセルを関数に通知します。あなたの質問を完全に誤解している場合は、詳細を追加して明確にする必要があります。

10
SSteve

@perrejbaの答えは正しいものの、従来のCスタイルの関数を使用しています。質問にはC++というタグが付けられているため、代わりにメソッドを使用できます。

inputMat.copyTo(outputMat, maskMat);

すべてのオブジェクトのタイプはcv::Mat

マスキングはバイナリであることに注意してください。マスク内のゼロ以外の値はすべて「コピーを行う」と解釈されます。マスクがグレースケール画像であっても。

.copyTo()関数は、コピーする前に出力をクリアしないことにも注意してください。

元のイメージを永続的に変更する場合は、追加のコピー/クローン/割り当てを行う必要があります。 copyTo()関数は、重複する入力/出力画像に対して定義されていません。そのため、入力と出力の両方に同じ画像を使用することはできません。

59
Chaos_99

マスクを使用して、元の画像の関心領域のみをコピー先にコピーできます。

cvCopy(origImage,destImage,mask);

ここで、maskは8ビットの単一チャネル配列でなければなりません。

詳しくは OpenCV docs をご覧ください

5
volpato

さて、この質問は検索結果の上に表示されるので、ここにコード例が必要だと思います。 Pythonコード:

import cv2

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

マスクとフレームは同じサイズである必要があるため、マスクが1の場合、ピクセルはそのままで、マスクピクセルが0の場合、ゼロに設定されます。

C++の場合は少し異なります:

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

Webカメラから取得したビデオフレームシーケンスにバイナリマスクを適用するコードを次に示します。 「bitwise_not(Mon_mask、Mon_mask);」行をコメント化してコメントを外し、効果を確認します。

ベスト、アーメド。

#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");

}
1
Ahmed