Creating an application for AOI
To create our new application, we require a few input parameters. When a user executes the application, all of them are optional, excluding the input image to process. The input parameters are as follows:
- Input image to process
- Light image pattern
- Light operation, where a user can choose between difference or divide operations
- If the user sets 0 as a value, the difference operation is applied
- If the user set 1 as a value, the division operation is applied
- Segmentation, where the user can choose between connected components with or without statistics and find contour methods
- If the user sets 1 as the input value, the connected components method for segment is applied
- If the user sets 2 as the input value, the connected components method with the statistics area is applied
- If the user sets 3 as the input value, the find contours method is applied for Segmentation
To enable this user selection, we are going to use the command line parser class with the following keys:
// OpenCV command line parser functions // Keys accepted by command line parser const char* keys = { "{help h usage ? | | print this message}" "{@image || Image to process}" "{@lightPattern || Image light pattern to apply to image input}" "{lightMethod | 1 | Method to remove background light, 0 difference, 1 div }" "{segMethod | 1 | Method to segment: 1 connected Components, 2 connected components with stats, 3 find Contours }" };
We are going to use the command line parser class in the main function by checking the parameters. The CommandLineParser is explained in Chapter 2, An Introduction to the Basics of OpenCV, in the Reading videos and cameras section:
int main(int argc, const char** argv) { CommandLineParser parser(argc, argv, keys); parser.about("Chapter 5. PhotoTool v1.0.0"); //If requires help show if (parser.has("help")) { parser.printMessage(); return 0; } String img_file= parser.get<String>(0); String light_pattern_file= parser.get<String>(1); auto method_light= parser.get<int>("lightMethod"); auto method_seg= parser.get<int>("segMethod"); // Check if params are correctly parsed in his variables if (!parser.check()) { parser.printErrors(); return 0; }
After parsing our command-line user data, we need to check the input image has been loaded correctly. We then load the image and check it has data:
// Load image to process Mat img= imread(img_file, 0); if(img.data==NULL){ cout << "Error loading image "<< img_file << endl; return 0; }
Now, we are ready to create our AOI process of segmentation. We are going to start with the preprocessing task.