200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > OpenCV截取图像的任意形状区域 规则的图形(圆 椭圆 矩形) 不规则鼠标自己选择

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

时间:2020-03-09 09:48:27

相关推荐

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

主要代码:

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));

效果:

代码下载地址:

/detail/zang141588761/9363167

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。