background image

Marcin Matras, gr25a

Laboratorium 4 - Open CV

 

 
1.Opis działania programu 
 
Program wyznacza środek masy znajdowania się białych punktów na obrazie binaryzowanym. 
Następnie zostaje wyznaczona trajektoria ruchu srodka masy.
 
2. Kod programu z objaśnieniami
 

#include <cv.h> 
#include <highgui.h> 
#include <stdio.h> 
#include <windows.h> 
 
CvCapture* capture = NULL;  //utworzenie pustego obiektu capture 
 
int wysokosc= 400;

//deklaracja zmiennych i ich wartosc 

int rozm = 400; 
int th = 125;

//zmienna do trackbara bedaca poczatkowa rozdzielczoscia 

int wsp_x[100]; 
int wsp_y[100]; 
int zmienna = 0; 
int i=0; 
 
IplImage *frame = 0;

//utworzenie wskaznikow do obiektow IpImage 

IplImage *dst = 0; 
IplImage *dst_th = 0; 
IplImage *moments = 0; 
IplImage *centre_of_mass=0; 
IplImage *frame_histogram = cvCreateImage (cvSize (256,wysokosc),8,1); 
IplImage *test=0;

 

CvHistogram *hist = cvCreateHist (1,&rozm,CV_HIST_ARRAY);

//utworzenie wskaznika do obiektu CvHistogram 

void init();

 //deklaracja funkcji

 

void release();

 

void histogram (IplImage *image);  
void trkbar (int th); 
void com (); 
 
void init() 
{    capture = cvCaptureFromAVI(CV_CAP_ANY);

//przekazanie obrazu z kamery 

     
 
 

int width = (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH);

//ustanowienie wartosci zmiennej widht 

int height = (int)cvGetCaptureProperty( capture,CV_CAP_PROP_FRAME_HEIGHT); 

 

CvSize size = cvSize((int)cvGetCaptureProperty( capture,CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, 

CV_CAP_PROP_FRAME_HEIGHT));

//ustanowienie wartosci zmiennej widht 

     

dst = cvCreateImage (CvSize(size),8,1); 
dst_th = cvCreateImage (CvSize(size),8,1); 
 
cvNamedWindow( "obraz", CV_WINDOW_AUTOSIZE );

//wywolanie okna, w ktorym bedzie wyswietlany obraz z kamery 

cvNamedWindow( "histogram", CV_WINDOW_AUTOSIZE );

//wywolanie okna, w ktorym bedzie wyswietlany histogram 

cvNamedWindow( "treshold", CV_WINDOW_AUTOSIZE );

//wywolanie okna, w ktorym bedzie wyswietlana binaryzacja 

cvNamedWindow( "test", CV_WINDOW_AUTOSIZE ); 
 }

 

      
void trkbar(int th) 

     }

 

      
 void release() 
 {  cvDestroyAllWindows();

//zamkniecie okna 

cvReleaseImage (&dst);

//skasowanie obiektu dst 

cvReleaseImage (&frame_histogram); 
cvReleaseImage (&dst_th); 
cvReleaseCapture (&capture); 
cvReleaseHist (&hist); 
cvReleaseImage (&test); 
cvReleaseImage (&centre_of_mass); 

background image

  } 
 
void histogram (IplImage *image) 

cvCalcHist (&image,hist);

// calculates histogram 

cvNormalizeHist (hist,1);

// normalization to 1 

 

float max_value_g = 0; 
float min_value_g = 0; 

 

cvGetMinMaxHistValue (hist,&min_value_g,&max_value_g); 

 

cvZero (frame_histogram); 

 

double skala_g = wysokosc/max_value_g; 

 

for (int i=0;i<255;i++)

// draws histogram

 

double x_g = cvQueryHistValue_1D (hist,i); 
 
cvLine (frame_histogram,cvPoint(i,wysokosc),cvPoint(i,wysokosc -(int)(skala_g*x_g)),cvScalar(155.0)) ; 


 
void com ()

 


    CvMoments moments;           
    cvMoments( dst_th, &moments,1);                             

 

    CvPoint centre_of_mass = cvPoint( (int)(moments.m10/moments.m00), 
    (int)(moments.m01/moments.m00) ); 
 
    printf("\nCenter of mass coordinates( X , Y ):  %d 
    %d\n\n",centre_of_mass.x,centre_of_mass.y); 
    printf("Moments ( X , Y ):  %f %f \n", moments.m20, moments.m02); 
     
    cvCircle(frame, centre_of_mass, 10, cvScalar(0,0,255,0)); 
    cvCircle(dst_th, centre_of_mass, 10, cvScalar(0,0,255,0)); 
 
     
        wsp_x[i]=(int)(moments.m10/moments.m00); 
        wsp_y[i]=(int)(moments.m01/moments.m00); 
        i++; 
        zmienna++; 
        if(zmienna>99) 
        {zmienna=0;} 
     
 
 } 
 
int main() 

    init(); 
    //cvNamedWindow( "Moje_okno", CV_WINDOW_AUTOSIZE ); 
  
 cvCreateTrackbar ("trackbar", "obraz",&th,255,trkbar);

//utworzenie slidera 

     
    while(1) 

        frame = cvQueryFrame( capture ); 

// Przechwycenie klatki z kamery 

 

 

        cvCvtColor(frame,dst,CV_BGR2GRAY); //zmiana obrazu w skali szarosci 

cvCvtColor(frame,dst_th,CV_BGR2GRAY); 
cvThreshold(dst, dst_th, th ,255,CV_THRESH_BINARY_INV);

//wywolanie funkcji cvThrehold ktora bilinearyzuje obraz 

 
histogram(dst); 
com(); 
for(int i=0; i<99;i++) 

             CvPoint zmienna = cvPoint ( (int) wsp_x[i], (int) wsp_y[i]); 
             cvCircle(frame, zmienna, 5, cvScalar(100,130,0,0)); 
              
             } 

 
 
 
cvShowImage( "test", test ); 
//cvShowImage( "centre", centre_of_mass ); 
cvShowImage( "obraz", frame ); 
cvShowImage( "histogram", frame_histogram ); 

background image

        cvShowImage( "treshold", dst_th ); 
      
     if((cvWaitKey(10) & 255)==27) 
 { 
     break;} 
     } 
     release(); 
     }

 
 

 
 
 
 
 
 
 
 
 
 
3. Wynik działania programu