int main(int argc, char** argv) {
   //if neither one or two parameters are input in command line, output the instruction of the usage of the program
   std::cout<<"argc"<<argc<<std::endl;
   if (argc < 2 || argc > 5) {
      std::cerr << "Usage: " << argv[0] << " [filename][writename][option] " << std::endl;
      exit(1);
   }
   //if second parameter is specified, store the file name to write the image
   else if (argc == 3)
   {
     std::string arg = argv[2];
     if (arg == "-pv"){ pvtag = 1; std::cout << "pvtag set." << std::endl; }
     else if (arg == "-ss"){ sstag = 1; std::cout << "sstag set." << std::endl;}
     else
     {
       writename = argv[2];
       std::cout << "writename is " << writename << std::endl;
     }
   }
   
   else if (argc == 4)
   {
     std::string arg = argv[3];
     std::string arg2 = argv[2];
     if (arg == "-pv" && arg2 != "-ss")
     { 
	pvtag = 1;        
	writename = argv[2];
        std::cout << "writename is " << writename << std::endl;
        std::cout << "pvtag is set." << std::endl;
     }	
     else if (arg == "-ss" && arg2 != "-pv")
     { 
	sstag = 1;       
	writename = argv[2]; 
        std::cout << "writename is " << writename << std::endl;
	std::cout << "sstag is set." << std::endl;
     }
     else if ((arg == "-ss" && arg2 == "-pv") || (arg == "-pv" && arg2 == "-ss")) 
     { 
	sstag = 1;
	pvtag = 1;       
	std::cout << "sstag is set." << std::endl;
	std::cout << "pvtag is set." << std::endl;
     }
     else
     {
        std::cerr << "Usage: " << argv[0] << " [filename][writename][option] " << std::endl;
        exit(1);
     }
   }
   else //argc == 5
   {
     std::string arg1 = argv[3], arg2 = argv[4];
     if (((arg1 == "-pv") && (arg2 == "-ss"))||((arg1 == "-ss") && (arg2 == "-pv")))
     {
	pvtag = 1;
	sstag = 1;
	writename = argv[2]; 
        std::cout << "writename is " << writename << std::endl;
	std::cout << "sstag and pvtag are set." << std::endl;
     }
   }

   //get the filename of the image, set the filename and read the image to get basic information of it
   filename = argv[1];
   std::cout << filename << std::endl;
   Image.SetFilename(filename);
   Image.ImageRead();
   Image.SetOriginalData();
   int h = Image.GetHeight();
   int w = Image.GetWidth();
   int c = Image.GetChannel();
   mask();
   //start up the glut utilities
   glutInit(&argc, argv);
   
   //create the graphics window, giving width, height and title text
   glutInitDisplayMode(GLUT_SINGLE | GLUT_DEPTH | GLUT_RGBA);
   glutInitWindowSize((Image.GetWidth()),Image.GetHeight());
   glutCreateWindow("Image");

   //glut keyboard function, display function and mouse function
   glutKeyboardFunc(handleKey);
   glutDisplayFunc(RenderScene);
   glutSpecialFunc(kfunc);
   //use glblend to display the alpha range 0~255 only in this program
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
   glBlendEquation(GL_FUNC_ADD);
   //define the drawing coordinate system on the viewport
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0, w, 0, h);
     
  // specify window clear (background) color to be opaque white
   glClearColor(1, 1, 1, 1);

//glut loops
   glutMainLoop();
   return 0;
}