图像分割——交互式GrabCut算法(c++)纯代码

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-29 23:39   121   0

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace std;
using namespace cv;

string filename;
Mat image;
string winName = "show";
enum{NOT_SET = 0, IN_PROCESS = 1, SET = 2};
uchar rectState;
Rect rect;
Mat mask;
const Scalar GREEN = Scalar(0,255,0);
Mat bgdModel, fgdModel;

void setRectInMask(){
rect.x = max(0, rect.x);
rect.y = max(0, rect.y);
rect.width = min(rect.width, image.cols-rect.x);
rect.height = min(rect.height, image.rows-rect.y);

}

static void getBinMask( const Mat& comMask, Mat& binMask ){
binMask.create( comMask.size(), CV_8UC1 );
binMask = comMask & 1;
}

void on_mouse( int event, int x, int y, int flags, void* )
{
Mat res;
Mat binMask;

switch( event ){
case CV_EVENT_LBUTTONDOWN:
if( rectState == NOT_SET){
rectState = IN_PROCESS;
rect = Rect( x, y, 1, 1 );
}
break;
case CV_EVENT_LBUTTONUP:
if( rectState == IN_PROCESS ){
rect = Rect( Point(rect.x, rect.y), Point(x,y) );
rectState = SET;
(mask(rect)).setTo( Scalar(GC_PR_FGD));
image = imread( filename, 1 );
grabCut(image, mask, rect, bgdModel, fgdModel, 1, GC_INIT_WITH_RECT);
getBinMask( mask, binMask );
image.copyTo(res, binMask );
imshow("11", res);
}
break;
case CV_EVENT_MOUSEMOVE:
if( rectState == IN_PROCESS ){
rect = Rect( Point(rect.x, rect.y), Point(x,y) );
image = imread( filename, 1 );
rectangle(image, Point( rect.x, rect.y ), Point(rect.x + rect.width, rect.y + rect.height ), GREEN, 2);
imshow(winName, image);
}
break;
}
}

int main(int argc, char* argv[]){
filename = "cup.jpg";
image = imread( filename, 1 );
imshow(winName, image);
mask.create(image.size(), CV_8UC1);
rectState = NOT_SET;
mask.setTo(GC_BGD);

setMouseCallback(winName, on_mouse, 0);
waitKey(0);

return 0;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP