Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用opencv提取图像的透明背景_Opencv_Background_Foreground - Fatal编程技术网

用opencv提取图像的透明背景

用opencv提取图像的透明背景,opencv,background,foreground,Opencv,Background,Foreground,我得到了一个用grab_cut(计算前景)计算的蒙版。我只想提取背景,使前景保持透明。为了提取前景(背景透明),我使用了以下代码。怎么可能做相反的事情呢 int border = 20; int border2 = border + border; cv::Rect rectangle(border,border,image.cols-border2,image.rows-border2); cv::Mat result; // segmentation result (4 possible

我得到了一个用grab_cut(计算前景)计算的蒙版。我只想提取背景,使前景保持透明。为了提取前景(背景透明),我使用了以下代码。怎么可能做相反的事情呢

int border = 20;
int border2 = border + border;
cv::Rect rectangle(border,border,image.cols-border2,image.rows-border2);

cv::Mat result; // segmentation result (4 possible values)
cv::Mat bgModel,fgModel; /
cv::grabCut(image,    // input image
    result,   // segmentation result
    rectangle,// rectangle containing foreground 
    bgModel,fgModel, // models
    1,        // number of iterations
    cv::GC_INIT_WITH_RECT); // use rectangle
cv::compare(result,cv::GC_PR_FGD,result,cv::CMP_EQ);
cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(foreground,result); // bg pixels not copied
cv::rectangle(image, rectangle, cv::Scalar(255,255,255),1);
cv::imwrite(argv[2], foreground);
cv::imwrite(argv[3], image);

Mat dst;//(src.rows,src.cols,CV_8UC4);
Mat tmp,alpha;

cvtColor(foreground,tmp,CV_BGR2GRAY);
threshold(tmp,alpha,100,255,THRESH_BINARY);
Mat rgb[3];
split(foreground,rgb);
Mat rgba[4]={rgb[0],rgb[1],rgb[2],alpha};
merge(rgba,4,dst);
imwrite("dst.png",dst);
基本上,我认为我必须改变这些观点:

cv::Mat foreground(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(foreground,result); // bg pixels not copied

如何才能选择与结果相反的图像的其余部分?

只需反转遮罩,如所示:

cv::Mat background(image.size(),CV_8UC3,cv::Scalar(255,255,255));
image.copyTo(background, ~result); // fg pixels not copied