カラー画像に永続的に適用したいバイナリマスクがあります。これを行うにはどうすればよいですか。関数を呼び出すたびにマスクを画像に再適用したくないので、バイナリマスクは永続的であることが望ましいです。
基本的なコード例をいただければ幸いです。コードを使用する場合は、コードを投稿するだけでなく、説明してください。
ありがとうございました
バイナリマスクを画像に適用しません。 (オプション)処理関数呼び出しでバイナリマスクを使用して、処理する画像のピクセルを関数に通知します。あなたの質問を完全に誤解している場合は、詳細を追加して明確にする必要があります。
@perrejbaの答えは正しいものの、従来のCスタイルの関数を使用しています。質問にはC++というタグが付けられているため、代わりにメソッドを使用できます。
inputMat.copyTo(outputMat, maskMat);
すべてのオブジェクトのタイプはcv::Mat
。
マスキングはバイナリであることに注意してください。マスク内のゼロ以外の値はすべて「コピーを行う」と解釈されます。マスクがグレースケール画像であっても。
.copyTo()関数は、コピーする前に出力をクリアしないことにも注意してください。
元のイメージを永続的に変更する場合は、追加のコピー/クローン/割り当てを行う必要があります。 copyTo()関数は、重複する入力/出力画像に対して定義されていません。そのため、入力と出力の両方に同じ画像を使用することはできません。
マスクを使用して、元の画像の関心領域のみをコピー先にコピーできます。
cvCopy(origImage,destImage,mask);
ここで、mask
は8ビットの単一チャネル配列でなければなりません。
詳しくは OpenCV docs をご覧ください
さて、この質問は検索結果の上に表示されるので、ここにコード例が必要だと思います。 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);
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");
}