Advertisement
Guest User

Image difference with OpenCV

a guest
Jan 13th, 2013
352
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.45 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <fstream>
  5.  
  6. #include "cv.h"
  7. #include "highgui.h"
  8.  
  9. using namespace std;
  10.  
  11. char imagename1[100] = "red1.jpg";
  12. char imagename2[100] = "red2.jpg";
  13.  
  14. void diffImage(IplImage* img1, IplImage* gimg1, IplImage* img2, IplImage* gimg2, IplImage* res) {
  15.     // saving 1st channel
  16.     cvSetImageCOI(img1, 3);
  17.     cvCopy(img1, gimg1);
  18.     cvSmooth(gimg1, gimg1, CV_BLUR, 5, 5);
  19.     cvResetImageROI(img1);
  20.  
  21.     // saving 1st channel
  22.     cvSetImageCOI(img2, 3);
  23.     cvCopy(img2, gimg2);
  24.     cvSmooth(gimg2, gimg2, CV_BLUR, 5, 5);
  25.     cvResetImageROI(img2);
  26.    
  27.     // comparison
  28.     cvAbsDiff(gimg1, gimg2, res);
  29.     cvCmpS(res, 20, res, CV_CMP_GE);
  30. }
  31.  
  32. void calculateMovementCoordinates(
  33.         IplImage* diff_img,
  34.         CvPoint& upperLeft,
  35.         CvPoint& lowerRight) {
  36.  
  37.     upperLeft = cvPoint(-1,-1);
  38.     lowerRight = cvPoint(-1,-1);
  39.     //int minFound = 0;
  40.     for(int row = 0; row < diff_img->height; ++row) {
  41.         const uchar *ptr = (const uchar*)(diff_img->imageData + row * diff_img->widthStep);
  42.         for(int col = 0; col < diff_img->width; ++col ) {
  43.             if( *ptr++ ) {
  44.                 if( upperLeft.y == -1  ) {
  45.                     upperLeft.y = row;
  46.                 } else {
  47.                     lowerRight.y = row;
  48.                 }
  49.                 if( upperLeft.x == -1 || upperLeft.x > col ) {
  50.                     upperLeft.x = col;
  51.                 } else if( lowerRight.x < col ) {
  52.                     lowerRight.x = col;
  53.                 }
  54.             }
  55.         }
  56.     }
  57.     //cvMinMaxLoc(diff_img,&min,&max,&minloc,&maxloc);
  58.  
  59. }
  60.  
  61. int main(int argc, char** argv) {
  62.     IplImage* old_img;
  63.     IplImage* gimg1;
  64.     IplImage* new_img = 0;
  65.     IplImage* gimg2;
  66.     IplImage* diff_img;
  67.     IplImage* display_img;
  68.     CvCapture* g_capture = NULL;
  69.     CvPoint upperLeft, lowerRight;
  70.  
  71.     cvInitSystem(argc, argv);
  72.  
  73.     // photo
  74.     //IplImage* tmpimg1 = cvLoadImage(imagename1);
  75.     //IplImage* tmpimg2 = cvLoadImage(imagename2);
  76.     //new_img = tmpimg1;
  77.  
  78.     char *libraries;
  79.     char *modules;
  80.     cvGetModuleInfo(0, (const char**) & libraries, (const char**) & modules);
  81.     printf("libraries: %s\n, modules: %s\n", libraries, modules);
  82.  
  83.  
  84.     // webcam
  85.     g_capture = cvCreateFileCapture("panda.mp4");
  86.     //g_capture = cvCreateCameraCapture(0);
  87.     new_img = cvQueryFrame(g_capture);
  88.  
  89.     CvSize size = cvGetSize(new_img);
  90.     old_img = cvCreateImage(size, IPL_DEPTH_8U, 3);
  91.     gimg1 = cvCreateImage(size, IPL_DEPTH_8U, 1);
  92.     gimg2 = cvCreateImage(size, IPL_DEPTH_8U, 1);
  93.     diff_img = cvCreateImage(size, IPL_DEPTH_8U, 1);
  94.     display_img = cvCreateImage(cvSize(2*size.width,size.height), IPL_DEPTH_8U, 3);
  95.    
  96.     IplImage *left_img = cvCreateImageHeader(size,display_img->depth,display_img->nChannels);
  97.     left_img->origin = display_img->origin;
  98.     left_img->widthStep = display_img->widthStep;
  99.     left_img->imageData = display_img->imageData;
  100.  
  101.     IplImage *right_img = cvCreateImageHeader(size,display_img->depth,display_img->nChannels);
  102.     right_img->origin = display_img->origin;
  103.     right_img->widthStep = display_img->widthStep;
  104.     right_img->imageData = display_img->imageData + right_img->width*right_img->nChannels;
  105.  
  106.     cvNamedWindow("Surveillance", CV_WINDOW_AUTOSIZE);
  107.     int i = 0;
  108.     while (1) {
  109.         ++i;
  110.         //new_img = i % 2 ?  tmpimg1 : tmpimg2;
  111.         new_img = cvQueryFrame(g_capture);
  112.         if (new_img) {
  113.             diffImage(old_img, gimg1, new_img, gimg2, diff_img);
  114.             cvCopy(new_img, old_img);
  115.             cvSetImageCOI(left_img,1);
  116.             cvCopy(diff_img,left_img);
  117.             cvSetImageCOI(left_img,2);
  118.             cvCopy(diff_img,left_img);
  119.             cvSetImageCOI(left_img,3);
  120.             cvCopy(diff_img,left_img);
  121.             cvResetImageROI(left_img);
  122.             calculateMovementCoordinates(diff_img, upperLeft,lowerRight);
  123.             cvRectangle(new_img,upperLeft,lowerRight,cvScalar(0,0,255),6);
  124.             cvCopy(new_img,right_img);
  125.             cvShowImage("Surveillance", display_img);
  126.         }
  127.  
  128.         char c = (char) cvWaitKey(10);
  129.         if (c == 27) break;
  130.     }
  131.     cvReleaseImageHeader(&left_img);
  132.     cvReleaseImageHeader(&right_img);
  133.     cvReleaseImage(&display_img);
  134.     cvReleaseImage(&old_img);
  135.     cvReleaseImage(&gimg1);
  136.     cvReleaseImage(&gimg2);
  137.     cvReleaseImage(&diff_img);
  138.     cvDestroyWindow("Surveillance");
  139.     return (0);
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement