Home | History | Annotate | Download | only in cpp
      1 /*
      2 * create_mask.cpp
      3 *
      4 * Author:
      5 * Siddharth Kherada <siddharthkherada27[at]gmail[dot]com>
      6 *
      7 * This tutorial demonstrates how to make mask image (black and white).
      8 * The program takes as input a source image and ouputs its corresponding
      9 * mask image.
     10 */
     11 
     12 #include "opencv2/imgproc.hpp"
     13 #include "opencv2/imgcodecs.hpp"
     14 #include "opencv2/highgui.hpp"
     15 #include "opencv2/core.hpp"
     16 #include <iostream>
     17 #include <stdlib.h>
     18 
     19 using namespace std;
     20 using namespace cv;
     21 
     22 Mat img0, img1, res1, final;
     23 
     24 Point point;
     25 int drag = 0;
     26 
     27 int numpts = 100;
     28 Point* pts = new Point[100];
     29 
     30 int var = 0;
     31 int flag = 0;
     32 int flag1 = 0;
     33 
     34 int minx,miny,maxx,maxy,lenx,leny;
     35 
     36 int channel;
     37 
     38 void mouseHandler(int, int, int, int, void*);
     39 
     40 void mouseHandler(int event, int x, int y, int, void*)
     41 {
     42 
     43     if (event == EVENT_LBUTTONDOWN && !drag)
     44     {
     45         if(flag1 == 0)
     46         {
     47             if(var==0)
     48                 img1 = img0.clone();
     49             point = Point(x, y);
     50             circle(img1,point,2,Scalar(0, 0, 255),-1, 8, 0);
     51             pts[var] = point;
     52             var++;
     53             drag  = 1;
     54             if(var>1)
     55                 line(img1,pts[var-2], point, Scalar(0, 0, 255), 2, 8, 0);
     56 
     57             imshow("Source", img1);
     58         }
     59     }
     60 
     61     if (event == EVENT_LBUTTONUP && drag)
     62     {
     63         imshow("Source", img1);
     64 
     65         drag = 0;
     66     }
     67     if (event == EVENT_RBUTTONDOWN)
     68     {
     69         flag1 = 1;
     70         img1 = img0.clone();
     71         for(int i = var; i < numpts ; i++)
     72             pts[i] = point;
     73 
     74         if(var!=0)
     75         {
     76             const Point* pts3[1] = {&pts[0]};
     77             polylines( img1, pts3, &numpts,1, 1, Scalar(0,0,0), 2, 8, 0);
     78         }
     79 
     80         for(int i=0;i<var;i++)
     81         {
     82             minx = min(minx,pts[i].x);
     83             maxx = max(maxx,pts[i].x);
     84             miny = min(miny,pts[i].y);
     85             maxy = max(maxy,pts[i].y);
     86         }
     87         lenx = maxx - minx;
     88         leny = maxy - miny;
     89 
     90         imshow("Source", img1);
     91     }
     92 
     93     if (event == EVENT_RBUTTONUP)
     94     {
     95         flag = var;
     96 
     97         final = Mat::zeros(img0.size(),CV_8UC3);
     98         res1 = Mat::zeros(img0.size(),CV_8UC1);
     99         const Point* pts4[1] = {&pts[0]};
    100 
    101         fillPoly(res1, pts4,&numpts, 1, Scalar(255, 255, 255), 8, 0);
    102         bitwise_and(img0, img0, final,res1);
    103         imshow("mask",res1);
    104         imwrite("mask.png",res1);
    105 
    106         imshow("Source", img1);
    107 
    108     }
    109     if (event == EVENT_MBUTTONDOWN)
    110     {
    111         for(int i = 0; i < numpts ; i++)
    112         {
    113             pts[i].x=0;
    114             pts[i].y=0;
    115         }
    116         var = 0;
    117         flag1 = 0;
    118         minx = INT_MAX; miny = INT_MAX; maxx = INT_MIN; maxy = INT_MIN;
    119         imshow("Source", img0);
    120         drag = 0;
    121     }
    122 }
    123 
    124 int main(int argc, char **argv)
    125 {
    126 
    127     if(argc != 2)
    128     {
    129         cout << "usage: " << argv[0] << " <input_image>" << endl;
    130         exit(1);
    131     }
    132 
    133     Mat src = imread(argv[1]);
    134 
    135     minx = INT_MAX; miny = INT_MAX; maxx = INT_MIN; maxy = INT_MIN;
    136 
    137     img0 = src;
    138 
    139     channel = img0.channels();
    140 
    141     res1 = Mat::zeros(img0.size(),CV_8UC1);
    142     final = Mat::zeros(img0.size(),CV_8UC3);
    143     //////////// source image ///////////////////
    144 
    145     namedWindow("Source", 1);
    146     setMouseCallback("Source", mouseHandler, NULL);
    147     imshow("Source", img0);
    148     waitKey(0);
    149 
    150     img0.release();
    151     img1.release();
    152 }
    153