From db8585701d1f42b48b84743f86e26d6df72eb733 Mon Sep 17 00:00:00 2001 From: Suleyman TURKMEN Date: Sun, 22 Jul 2018 13:32:43 +0300 Subject: [PATCH] Update create_mask.cpp --- samples/cpp/create_mask.cpp | 126 ++++++++++++------------------------ 1 file changed, 42 insertions(+), 84 deletions(-) diff --git a/samples/cpp/create_mask.cpp b/samples/cpp/create_mask.cpp index b925cacba7..b90a7b70f2 100644 --- a/samples/cpp/create_mask.cpp +++ b/samples/cpp/create_mask.cpp @@ -12,26 +12,18 @@ #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" -#include "opencv2/core.hpp" #include -#include using namespace std; using namespace cv; -Mat img0, img1, res1, final; +Mat src, img1, mask, final; Point point; +vector pts; int drag = 0; - -int numpts = 100; -Point* pts = new Point[100]; - int var = 0; int flag = 0; -int flag1 = 0; - -int minx,miny,maxx,maxy,lenx,leny; void mouseHandler(int, int, int, int, void*); @@ -40,16 +32,17 @@ void mouseHandler(int event, int x, int y, int, void*) if (event == EVENT_LBUTTONDOWN && !drag) { - if(flag1 == 0) + if (flag == 0) { - if(var==0) - img1 = img0.clone(); + if (var == 0) + img1 = src.clone(); point = Point(x, y); - circle(img1,point,2,Scalar(0, 0, 255),-1, 8, 0); - pts[var] = point; + circle(img1, point, 2, Scalar(0, 0, 255), -1, 8, 0); + pts.push_back(point); var++; drag = 1; - if(var>1) + + if (var > 1) line(img1,pts[var-2], point, Scalar(0, 0, 255), 2, 8, 0); imshow("Source", img1); @@ -59,103 +52,68 @@ void mouseHandler(int event, int x, int y, int, void*) if (event == EVENT_LBUTTONUP && drag) { imshow("Source", img1); - drag = 0; } + if (event == EVENT_RBUTTONDOWN) { - flag1 = 1; - img1 = img0.clone(); - for(int i = var; i < numpts ; i++) - pts[i] = point; + flag = 1; + img1 = src.clone(); - if(var!=0) + if (var != 0) { - const Point* pts3[1] = {&pts[0]}; - polylines( img1, pts3, &numpts,1, 1, Scalar(0,0,0), 2, 8, 0); + polylines( img1, pts, 1, Scalar(0,0,0), 2, 8, 0); } - for(int i=0;i > vpts; + vpts.push_back(pts); + fillPoly(mask, vpts, Scalar(255, 255, 255), 8, 0); + bitwise_and(src, src, final, mask); + imshow("Mask", mask); + imshow("Result", final); imshow("Source", img1); - } + if (event == EVENT_MBUTTONDOWN) { - for(int i = 0; i < numpts ; i++) - { - pts[i].x=0; - pts[i].y=0; - } + pts.clear(); var = 0; - flag1 = 0; - minx = INT_MAX; miny = INT_MAX; maxx = INT_MIN; maxy = INT_MIN; - imshow("Source", img0); drag = 0; + flag = 0; + imshow("Source", src); } } -static void help() -{ - cout << "\nThis program demonstrates using mouse events" - "\nCall:\n" - "./create_mask \n" - "\n" - "\tleft mouse button - set a point to create mask shape" - "\n" - "\tright mouse button - create mask from points\n" - "\tmiddle mouse button - reset\n" << endl; -} - int main(int argc, char **argv) { - cv::CommandLineParser parser(argc, argv, "{@input | ../data/lena.jpg | input image}"); - help(); - string input_image = parser.get("@input"); - if (input_image.empty()) - { - parser.printMessage(); - parser.printErrors(); - return 0; - } - - Mat src = imread(input_image); - - minx = INT_MAX; miny = INT_MAX; maxx = INT_MIN; maxy = INT_MIN; + CommandLineParser parser(argc, argv, "{@input | ../data/lena.jpg | input image}"); + parser.about("This program demonstrates using mouse events\n"); + parser.printMessage(); + cout << "\n\tleft mouse button - set a point to create mask shape\n" + "\tright mouse button - create mask from points\n" + "\tmiddle mouse button - reset\n"; + String input_image = parser.get("@input"); - img0 = src; + src = imread(input_image); - res1 = Mat::zeros(img0.size(),CV_8UC1); - final = Mat::zeros(img0.size(),CV_8UC3); - //////////// source image /////////////////// + if (src.empty()) + { + printf("Error opening image: %s\n", input_image.c_str()); + return 0; + } - namedWindow("Source", 1); + namedWindow("Source", WINDOW_AUTOSIZE); setMouseCallback("Source", mouseHandler, NULL); - imshow("Source", img0); + imshow("Source", src); waitKey(0); return 0;