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 (¢re_of_mass);
}
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 );
cvShowImage( "treshold", dst_th );
if((cvWaitKey(10) & 255)==27)
{
break;}
}
release();
}
3. Wynik działania programu