OpenCV截取图像的任意形状区域,规则的图形(圆、椭圆、矩形),不规则鼠标自己选择

来源:互联网 发布:数据核查计划 编辑:程序博客网 时间:2024/05/16 07:46

主要代码:

typedef enum _tagType{
IMAGE_RECT=0,
IMAGE_CIRCLE,
IMAGE_ELLIPSE,
IMAGE_ANY_REGION
}REGIONTYPE;
Mat srcImg;
Mat maskImg;
Mat dstImg;
Point pt_origin = Point(-1,-1);
Point pt_prev = Point(-1,-1);
Point pt_Cur = Point(-1,-1);
REGIONTYPE RegionType;
vector< vector<Point> >  co_ordinates; 


void on_mouse(int event,int x,int y,int flags,void *param)
{
if( event == CV_EVENT_LBUTTONDOWN )
{
pt_origin = Point(x,y);
co_ordinates.clear();
co_ordinates.push_back(vector<Point>());
co_ordinates[0].push_back(pt_origin);
}
else if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))
{
pt_Cur = Point(x,y);
pt_prev = pt_Cur;
}
else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
{
pt_Cur = Point(x,y);
dstImg = srcImg.clone();
maskImg = Mat::zeros(srcImg.rows,srcImg.cols, CV_8UC1);
switch(RegionType)
{
case IMAGE_RECT:
{
rectangle(dstImg,pt_origin,pt_Cur,Scalar(0),1,8,0);
rectangle(maskImg,pt_origin,pt_Cur,Scalar(255),1,8,0);
}
break;
case IMAGE_CIRCLE:
{
int X =(pt_Cur.x+pt_origin.x)/2;
int Y = (pt_Cur.y+pt_origin.y)/2;
Point pt_o = Point(X,Y);
int r = abs(pt_Cur.x-pt_origin.x)<abs(pt_Cur.y-pt_origin.y)?(abs(pt_Cur.y-pt_origin.y))/2:(abs(pt_Cur.x-pt_origin.x))/2;


circle(dstImg,pt_o,r,Scalar(0),1,8,0);
circle(maskImg,pt_o,r,Scalar(255),1,8,0);
}
break;
case IMAGE_ELLIPSE:
{
int X =(pt_Cur.x+pt_origin.x)/2;
int Y = (pt_Cur.y+pt_origin.y)/2;
int wX = abs(pt_Cur.x-pt_origin.x);
int wY = abs(pt_Cur.y-pt_origin.y);
Point pt_o = Point(X,Y);


ellipse(dstImg,pt_o,Size(wX/2,wY/2),0,0,360,Scalar(0),1,8,0);
ellipse(maskImg,pt_o,Size(wX/2,wY/2),0,0,360,Scalar(255),1,8,0);
}
break;
case IMAGE_ANY_REGION:
{
co_ordinates[0].push_back(pt_Cur);
line(srcImg,pt_prev,pt_Cur,Scalar(0),1,8,0);
drawContours(maskImg,co_ordinates,0, Scalar(255),CV_FILLED, 8 );
}
break;
default:

break;
}
pt_prev = pt_Cur;

if(RegionType != IMAGE_ANY_REGION)
{
vector<vector<Point>> contours;
vector<Vec4i>hierarchy;
findContours(maskImg,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);
drawContours(maskImg,contours,0, Scalar(255),CV_FILLED, 8 );
}

Rect rectROI(0,0,dstImg.cols,dstImg.rows);
Mat srcROI=dstImg(rectROI);
Mat dst1;


srcROI.copyTo(dst1,maskImg);
imwrite("dst1.bmp",dst1);
imshow("test",dstImg);
}
else if( event == CV_EVENT_LBUTTONUP )
{
imwrite("test1.bmp",dstImg);
destroyAllWindows();
}
}


srcImg = imread("test.bmp");
Rect rectROI(0,0,srcImg.cols,srcImg.rows);
maskImg = Mat(srcImg.rows,srcImg.cols, CV_8UC1, Scalar(0));
UpdateData(TRUE);


switch(m_rdRect)
{
case 0:
//rect
RegionType = IMAGE_RECT;
break;
case 1:
//circle
RegionType = IMAGE_CIRCLE;
break;
case 2:
//ellipse
RegionType = IMAGE_ELLIPSE;
break;
case 3:
//any region
RegionType = IMAGE_ANY_REGION;
break;
default: 
break;
}
imshow("test",srcImg);
setMouseCallback("test",on_mouse,0);
waitKey(0);
destroyAllWindows();
Show_picture("dst1.bmp",(CStatic*)GetDlgItem(IDC_STATIC_PIC));

效果:




代码下载地址:

http://download.csdn.net/detail/zang141588761/9363167




1 1
原创粉丝点击