- #include<opencv2/core/core.hpp>
- #include<opencv2/highgui/highgui.hpp>
- #include<opencv2/video/background_segm.hpp>
- #include<opencv2/opencv.hpp>
- #include<stdio.h>
- #include<iostream>
- #include<sstream>
- using namespace cv;
- using namespace std;
- //全局变量区域
- cv::Point point1,point2;
- int drag = 0;
- cv::Rect rect;
- cv::Mat srcImage, roiImg;
- bool select_flag = true;
- cv::Mat rectImg;
- vector<Point>Pf,Pb;
- //鼠标响应回调
- void mouseHandler(int event, int x, int y, int flags, void* param)
- {
- //左键按下
- if (event == CV_EVENT_LBUTTONDOWN && !drag)
- {
- point1 = Point(x,y);
- drag = 1;
- }
- //鼠标移动
- else if (event == CV_EVENT_LBUTTONDOWN && drag)
- {
- Mat imgl = srcImage.clone();
- point2 = Point(x,y);
- //绘制图形上矩形区域
- rectangle(imgl, point1, point2,
- CV_RGB(255, 0, 0), 3, 8, 0);
- imshow("image",imgl);
- }
- //左键抬起与摇曳标志
- else if(event == CV_EVENT_LBUTTONDOWN && drag)
- {
- point2 = Point(x,y);
- rect = Rect(point1.x,point1.y,x-point1.x,y-point1.y);
- drag = 0;
- roiImg = srcImage(rect);
- }
- //右键按下
- else if (event == CV_EVENT_LBUTTONDOWN)
- {
- select_flag = false;
- drag = 0;
- imshow("ROI",roiImg);
- }
- }
- int main()
- {
- cv::Mat srcImage =
- cv::imread("E:\\OpenCV\\Workplace\\testOpencv\\testOpencv\\line.jpg");
- if(srcImage.empty())
- return -1;
- //定义前景与输出图形
- cv::Mat srcImage2 = srcImage.clone();
- cv::Mat foreground(srcImage.size(),
- CV_8UC3,cv::Scalar(255,255,255));
- cv::Mat result(srcImage.size(),CV_8UC1);
- //Grabcut分割前景与背景
- cv::Mat fgMat,bgMat;
- namedWindow("srcImage",1);
- imshow("srcImage",srcImage);
- //迭代次数
- int i = 20;
- std::cout<<"20 iters"<<std::endl;
- //鼠标响应
- setMouseCallback("srcImage",mouseHandler,NULL);
- //选择区域有效,按下ESC键退出
- while ((select_flag == true)&&(waitKey(0) !=27))
- {
- //实现图割操作
- grabCut(srcImage,result,rect,bgMat,
- fgMat, i, GC_INIT_WITH_RECT);
- //图像匹配
- cv::compare(result,cv::GC_PR_FGD,
- result,cv::CMP_EQ);
- //生成前景图像
- srcImage.copyTo(foreground, result);
- imshow("foreground",foreground);
- }
- cv::waitKey(0);
- return 0;
- }
复制代码 |