SW Matras Marcin Lab04

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


Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron