Rectangle area, Am i doing it all right?

asked 2018-02-09 03:19:32 -0600

rushix gravatar image

Hello again, Actually i am comparing two images, to find new object introduced into second image, which is not there in the first image. I have got the working code here, as an answer, when i posted my question; But clearing the concepts, then programming by own style, is what i believe.

#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(void)
{
    // Reading color images ( including alpha channel )into Mat 

    Mat first_rgb = imread("./road.jpg", IMREAD_UNCHANGED);
    Mat second_rgb = imread("./road_changed.jpg", IMREAD_UNCHANGED);

    // Check for invalid input

    if( (! first_rgb.data) || (! second_rgb.data) )                              
    {
        cout <<  "Could not open or find color image or images...\n";
        return -1;
    }

   // Resizing both images, so that number of pixels become same for finding negation / difference

   resize(second_rgb, second_rgb, first_rgb.size());

   // Converting both images to Gray and load them into new matrices

   Mat first_gray, second_gray;

   cvtColor(first_rgb, first_gray, COLOR_RGB2GRAY);
   cvtColor(second_rgb, second_gray, COLOR_RGB2GRAY);

  // Now Get absolute difference into matrix 

   Mat diff;

   absdiff(first_gray, second_gray, diff);

  // binarizing the difference, making all zero keeping non-zero / difference intact. 

   Mat bin = diff > 70;

  // Find non-black points

   vector<Point> points;

   findNonZero(bin, points);

   // Get bounding rect

   Rect box = boundingRect(points);
   float area = box.width * box.height;

   cout<<"area in pixels = "<<area<<"\n";

   // rectangle the new object in second colorful image 

   rectangle(second_rgb, box, Scalar(0,255,0), 3);

   // Show images 

     imshow("Result", second_rgb);
     imshow("ABS-DIFF", diff);
     imshow("BIN", bin);

     waitKey(0);
     destroyAllWindows();
     return 0;
}

It is giving me new object found, the difference, in rectangled so nicely. Now what i want to know is, the "area" i have calculated is correct way? and can i use it for comparison? I mean if the new found object area is more than 120 pixels then it must be the real object there.

Its the output : Apples-MacBook:object_area rushi$ g++ area.cpp -o area pkg-config --cflags --libs opencv Apples-MacBook:object_area rushi$ ./area area in pixels = 120 road.jpg file road.jpg file

road_changed.jpg file road_changed.jpg file

output file with change rectangled : detected area

Thanking you so much. rushikant Pawar

edit retag flag offensive close merge delete

Comments

2

What happen if you have two new objects in your image? you will get only one rectangle

You should use connectedComponents to find new object.

LBerger gravatar imageLBerger ( 2018-02-09 03:30:35 -0600 )edit

@LBerger , Yes, It may happen..., there are probabilities of finding two or more objects too... Need to work on all possibilities certainly, By the way thank you so much.

rushix gravatar imagerushix ( 2018-02-09 03:43:17 -0600 )edit