| OpenCV 3.4.1 Open Source Computer Vision

Thresholding Operations using inRange

## Goal

In this tutorial you will learn how to:

- Perform basic thresholding operations using OpenCV function cv::inRange
- Detect an object based on the range of pixel values it has

## Theory

- In the previous tutorial, we learnt how perform thresholding using cv::threshold function.
- In this tutorial, we will learn how to do it using cv::inRange function.
- The concept remains same, but now we add a range of pixel values we need.

## Code

The tutorial code's is shown lines below. You can also download it from here

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
#include <stdlib.h>
using namespace std;
using namespace cv;
void on_low_r_thresh_trackbar(int, void *);
void on_high_r_thresh_trackbar(int, void *);
void on_low_g_thresh_trackbar(int, void *);
void on_high_g_thresh_trackbar(int, void *);
void on_low_b_thresh_trackbar(int, void *);
void on_high_b_thresh_trackbar(int, void *);
int low_r=30, low_g=30, low_b=30;
int high_r=100, high_g=100, high_b=100;
int main()
{
Mat frame, frame_threshold;
VideoCapture cap(0);
namedWindow("Video Capture", WINDOW_NORMAL);
namedWindow("Object Detection", WINDOW_NORMAL);
//-- Trackbars to set thresholds for RGB values
createTrackbar("Low R","Object Detection", &low_r, 255, on_low_r_thresh_trackbar);
createTrackbar("High R","Object Detection", &high_r, 255, on_high_r_thresh_trackbar);
createTrackbar("Low G","Object Detection", &low_g, 255, on_low_g_thresh_trackbar);
createTrackbar("High G","Object Detection", &high_g, 255, on_high_g_thresh_trackbar);
createTrackbar("Low B","Object Detection", &low_b, 255, on_low_b_thresh_trackbar);
createTrackbar("High B","Object Detection", &high_b, 255, on_high_b_thresh_trackbar);
while((char)waitKey(1)!='q'){
cap>>frame;
if(frame.empty())
break;
//-- Detect the object based on RGB Range Values
inRange(frame,Scalar(low_b,low_g,low_r), Scalar(high_b,high_g,high_r),frame_threshold);
//-- Show the frames
imshow("Video Capture",frame);
imshow("Object Detection",frame_threshold);
}
return 0;
}
void on_low_r_thresh_trackbar(int, void *)
{
low_r = min(high_r-1, low_r);
setTrackbarPos("Low R","Object Detection", low_r);
}
void on_high_r_thresh_trackbar(int, void *)
{
high_r = max(high_r, low_r+1);
setTrackbarPos("High R", "Object Detection", high_r);
}
void on_low_g_thresh_trackbar(int, void *)
{
low_g = min(high_g-1, low_g);
setTrackbarPos("Low G","Object Detection", low_g);
}
void on_high_g_thresh_trackbar(int, void *)
{
high_g = max(high_g, low_g+1);
setTrackbarPos("High G", "Object Detection", high_g);
}
void on_low_b_thresh_trackbar(int, void *)
{
low_b= min(high_b-1, low_b);
setTrackbarPos("Low B","Object Detection", low_b);
}
void on_high_b_thresh_trackbar(int, void *)
{
high_b = max(high_b, low_b+1);
setTrackbarPos("High B", "Object Detection", high_b);
}

## Explanation

1. Let's check the general structure of the program:
   - Create two Matrix elements to store the frames
     Mat frame, frame_threshold;
   - Capture the video stream from default capturing device.
     VideoCapture cap(0);
   - Create a window to display the default frame and the threshold frame.
     namedWindow("Video Capture", WINDOW_NORMAL);
     namedWindow("Object Detection", WINDOW_NORMAL);
   - Create trackbars to set the range of RGB values
     //-- Trackbars to set thresholds for RGB values
     createTrackbar("Low R","Object Detection", &low_r, 255, on_low_r_thresh_trackbar);
     createTrackbar("High R","Object Detection", &high_r, 255, on_high_r_thresh_trackbar);
     createTrackbar("Low G","Object Detection", &low_g, 255, on_low_g_thresh_trackbar);
     createTrackbar("High G","Object Detection", &high_g, 255, on_high_g_thresh_trackbar);
     createTrackbar("Low B","Object Detection", &low_b, 255, on_low_b_thresh_trackbar);
     createTrackbar("High B","Object Detection", &high_b, 255, on_high_b_thresh_trackbar);
   - Until the user want the program to exit do the following
     cap>>frame;
     if(frame.empty())
     break;
     //-- Detect the object based on RGB Range Values
     inRange(frame,Scalar(low_b,low_g,low_r), Scalar(high_b,high_g,high_r),frame_threshold);
   - Show the images
     //-- Show the frames
     imshow("Video Capture",frame);
     imshow("Object Detection",frame_threshold);
   - For a trackbar which controls the lower range, say for example Red value:
     void on_low_r_thresh_trackbar(int, void *)
     {
     low_r = min(high_r-1, low_r);
     setTrackbarPos("Low R","Object Detection", low_r);
     }
   - For a trackbar which controls the upper range, say for example Red value:
     void on_high_r_thresh_trackbar(int, void *)
     {
     high_r = max(high_r, low_r+1);
     setTrackbarPos("High R", "Object Detection", high_r);
     }
   - It is necessary to find the maximum and minimum value to avoid discrepancies such as the high value of threshold becoming less the low value.

## Results

1. After compiling this program, run it. The program will open two windows

2. As you set the RGB range values from the trackbar, the resulting frame will be visible in the other window.