2014-10-06 2 views
0

전경을 계산하는 grab_cut에서 계산 된 마스크가 있습니다. 전경을 투명한 채로두고 배경 만 추출하고 싶습니다. 전경 (배경 투명)을 추출하기 위해 다음 코드를 사용하면됩니다. 그 반대는 어떻게 할 수 있습니까? opencv로 이미지의 투명한 배경 추출하기

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 

?

답변

1

그냥 같이 마스크를 반전 :

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