Updated grabcut example to show the background in a transparant way

This commit is contained in:
Roland Meertens 2021-06-03 20:59:22 +02:00
parent c34445a496
commit 2113af9c52

View File

@ -107,12 +107,14 @@ void GCApplication::showImage() const
Mat res; Mat res;
Mat binMask; Mat binMask;
if( !isInitialized ) image->copyTo( res );
image->copyTo( res ); if( isInitialized ){
else getBinMask( mask, binMask);
{
getBinMask( mask, binMask ); Mat black (binMask.rows, binMask.cols, CV_8UC3, cv::Scalar(0,0,0));
image->copyTo( res, binMask ); black.setTo(Scalar::all(255), binMask);
addWeighted(black, 0.5, res, 0.5, 0.0, res);
} }
vector<Point>::const_iterator it; vector<Point>::const_iterator it;
@ -201,24 +203,39 @@ void GCApplication::mouseClick( int event, int x, int y, int flags, void* )
case EVENT_LBUTTONUP: case EVENT_LBUTTONUP:
if( rectState == IN_PROCESS ) if( rectState == IN_PROCESS )
{ {
rect = Rect( Point(rect.x, rect.y), Point(x,y) ); if(rect.x == x || rect.y == y){
rectState = SET; rectState = NOT_SET;
setRectInMask(); }
CV_Assert( bgdPxls.empty() && fgdPxls.empty() && prBgdPxls.empty() && prFgdPxls.empty() ); else{
rect = Rect( Point(rect.x, rect.y), Point(x,y) );
rectState = SET;
setRectInMask();
CV_Assert( bgdPxls.empty() && fgdPxls.empty() && prBgdPxls.empty() && prFgdPxls.empty() );
}
showImage(); showImage();
} }
if( lblsState == IN_PROCESS ) if( lblsState == IN_PROCESS )
{ {
setLblsInMask(flags, Point(x,y), false); setLblsInMask(flags, Point(x,y), false);
lblsState = SET; lblsState = SET;
nextIter();
showImage(); showImage();
} }
else{
if(rectState == SET){
nextIter();
showImage();
}
}
break; break;
case EVENT_RBUTTONUP: case EVENT_RBUTTONUP:
if( prLblsState == IN_PROCESS ) if( prLblsState == IN_PROCESS )
{ {
setLblsInMask(flags, Point(x,y), true); setLblsInMask(flags, Point(x,y), true);
prLblsState = SET; prLblsState = SET;
}
if(rectState == SET){
nextIter();
showImage(); showImage();
} }
break; break;