我有一个二元蒙版,我想永久应用于彩色图像,我该怎么做? 二进制掩码最好是永久性的 - 因为我不希望每次调用函数时都将掩码重新应用到图像中。
基本代码示例将不胜感激。如果您使用代码,请解释代码而不是发布代码。
谢谢
答案 0 :(得分:59)
虽然@perrejba的回答是正确的,但它使用了传统的C风格函数。由于问题标记为C ++,您可能希望使用方法:
inputMat.copyTo(outputMat, maskMat);
所有对象都是cv::Mat
类型。
请注意,屏蔽是二进制的。掩码中的任何非零值都被解释为“do copy”。即使蒙版是灰度图像。
还要注意.copyTo()函数在复制之前不会清除输出。
如果要永久更改原始图像,则必须执行其他复制/克隆/分配。未为重叠输入/输出图像定义copyTo()函数。所以你不能使用相同的图像作为输入和输出。
答案 1 :(得分:10)
您不会将二进制遮罩应用于图像。您(可选)在处理函数调用中使用二进制掩码来告诉函数您要处理的图像像素。如果我完全误解了你的问题,你应该添加更多细节来澄清。
答案 2 :(得分:5)
您可以使用蒙版仅将原始图像的感兴趣区域复制到目标区域:
cvCopy(origImage,destImage,mask);
其中mask
应该是一个8位单通道数组。
答案 3 :(得分:2)
嗯,这个问题出现在搜索结果的顶部,所以我相信我们需要代码示例。这是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);
答案 4 :(得分:0)
以下是在从网络摄像头获取的视频帧序列上应用二进制掩码的一些代码。 注释并取消注释“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");
}
答案 5 :(得分:-1)