Marcin Matras, rok 3, grupa25A
Systemy wizyjne
Open CV – lab5A
Celem laboratoriów było zapoznanie się z czterema podstawowymi typami filtrów morfologicznych oraz zbadanie przefiltrowanego obrazu
Kod programu
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
CvCapture* capture = NULL; // pusty obiekt capture
// zmienne do wykorzystania w suwakach zmieniających parametry filtrów
int erode_iter = 1;
int dilate_iter = 1;
int open_iter = 1;
int clos_iter = 1;
// wskaźniki do obiektów IplImage dla obrazu i filtrów
int th = 60;//zmienna przechowująca prug binaryzacji
IplImage *dst = 0;
IplImage *dst_th = 0;
IplImage *frame = 0;
IplImage *erode = 0;
IplImage *dilate = 0;
IplImage *opening = 0;
IplImage *closing = 0;
IplImage *temp;
// funkcje tworzące suwaki
void dilate_trackbar(int dilate_iter);
void clos_trackbar(int clos_iter);
void open_trackbar(int open_iter);
void erode_trackbar(int erode_iter);
void trkbar(int th);//do symuacji zmiany położenia suwaka
// deklaracja funkcji
void image_processing();
void enable_trakcbars();
void show_image();
void init();
void clone_images();
void release();
void init()
{
capture = cvCaptureFromCAM( CV_CAP_ANY ); // przypisanie do obiektu capture obrazu z kamery
//pobranie klatki z capture
IplImage* frame = cvQueryFrame(capture);
int width = (int)cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH,320);
int height = (int)cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT,240);
CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
dst = cvCreateImage (CvSize(size),8,1);
dst_th = cvCreateImage (CvSize(size),8,1);
// kopiowanie klatki frame
erode = cvCloneImage(dst_th);
dilate = cvCloneImage(dst_th);
opening = cvCloneImage(dst_th);
closing = cvCloneImage(dst_th);
// tworzenie okien do wyświetlania obrazu bazowego i wyników działania filtrów
cvNamedWindow("erode", CV_WINDOW_AUTOSIZE);
cvNamedWindow("dilate", CV_WINDOW_AUTOSIZE);
cvNamedWindow("opening", CV_WINDOW_AUTOSIZE);
cvNamedWindow("closing", CV_WINDOW_AUTOSIZE);
cvNamedWindow( "treshold", CV_WINDOW_AUTOSIZE );
}
void image_processing()
{
// wywołanie funkcji odpowiadających za suwaki
erode_trackbar((int) erode_iter);
dilate_trackbar((int) dilate_iter);
open_trackbar((int) open_iter);
clos_trackbar((int) clos_iter);
trkbar((int) th);
}
void enable_trakcbars()
{
// tworzenie trackbarów
cvCreateTrackbar("erode", "erode", &erode_iter, 6, erode_trackbar);
cvCreateTrackbar("dilate", "dilate", &dilate_iter, 6, dilate_trackbar);
cvCreateTrackbar("closing", "closing", &clos_iter, 6, clos_trackbar);
cvCreateTrackbar("opening", "opening", &open_iter, 6, open_trackbar);
cvCreateTrackbar ("treshold","obraz",&th,255,trkbar);
}
void show_image()
{
// przedstawienie wszystkich utworzonych obrazów
cvShowImage("erode", erode);
cvShowImage("dilate", dilate);
cvShowImage("closing", closing);
cvShowImage("opening", opening);
cvShowImage("threshold", dst_th);
}
// funkcje odpowiadające za suwaki do zmiany parametrów algorytmów
void trkbar (int th)
{
}
void erode_trackbar(int erode_iter)
{
cvErode (dst_th,erode,0,erode_iter);
}
void dilate_trackbar(int dilate_iter)
{
cvDilate (dst_th,dilate,0,dilate_iter);
}
void clos_trackbar(int clos_iter)
{
cvMorphologyEx (dst_th,closing,temp,CV_SHAPE_RECT,CV_MOP_CLOSE,clos_iter);
}
void open_trackbar(int open_iter)
{
cvMorphologyEx (dst_th,opening,temp,CV_SHAPE_RECT,CV_MOP_OPEN,open_iter);
}
void release()
{
cvDestroyAllWindows(); //usunięcie wszystkich okien
//usunięcie obiektów IplImage
cvReleaseImage(&temp);
cvReleaseImage(&frame);
cvReleaseCapture(&capture); // usunięcie obiektu capture
cvReleaseImage(&erode);
cvReleaseImage(&opening);
cvReleaseImage(&closing);
cvReleaseImage(&dilate);
cvReleaseImage (&dst_th);
cvReleaseImage (&dst);
}
int main() {
init(); // wywołanie funkcji init()
enable_trakcbars(); //wywołanie funkcji enable_trakcbars()
if (!capture)
{
fprintf(stderr, "blad");
getchar();
return -1;
}
while (1) // pętla nieskończona
{
frame = cvQueryFrame(capture); // pobranie klatki z obiektu captrure
cvCvtColor(frame,dst,CV_BGR2GRAY);
cvCvtColor(frame,dst_th,CV_BGR2GRAY);
cvThreshold(dst, dst_th, th ,255,CV_THRESH_BINARY);
show_image(); // wywołanie funkcji show_image()
image_processing(); // wywołanie funkcji image_processing()
if ((cvWaitKey(10) & 255) == 27) // pętla sprawdzająca czy został naciśnięty ESC
{ break; }
}
release(); // wywołanie funkcji release()
}
Wynik działania programu dla różnych progów binaryzacji
Rys1. Działanie różnych filtrów dla progu binaryzacji 125
Rys2. Działanie różnych filtrów dla progu binaryzacji 64
Opis filtrów morfologicznych
Filtr erode
Filtr dilate
Filtr closing
Filtr opening
Marcin Matras, rok 3, grupa25A
Systemy wizyjne
Open CV – lab5B
Zapoznanie się z filtrami przestrzennymi oraz zbadanie wpływu działania danego filtru na obraz
Kod programu
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
CvCapture* capture; //wskaźnik na obiekt CvCapture
//zmienne przechowujące wartości masek filtrów
int blurns_iter,blur_iter,gauss_iter,med_iter,bil_iter,sob_iter,lap_iter;
int width=320, height=240; //zmienne rozmiarów obrazu
//wskaźniki na obiekty graficzne
IplImage *frame=0,*blurns=0,*blur=0,*gauss=0,*med=0,*bil=0,*sob=0,*lap=0,*temp=0;
void init();//przypisanie wartości zmiennym, adresowanie wskaźników
void release();//zwolnienie zasobów
void show_images();//wyświetlanie obrazu
void image_processing();//filtrowanie
void enable_trackbars();//utworzenie suwaków
//obsługa suwaków
void blurns_trackbar(int t) {blurns_iter=t;}
void blur_trackbar(int t) {blur_iter=t;}
void gauss_trackbar(int t) {gauss_iter=t;}
void med_trackbar(int t) {med_iter=t;}
void bil_trackbar(int t) {bil_iter=t;}
void sob_trackbar(int t) {sob_iter=t;}
void lap_trackbar(int t) {lap_iter=t;}
int main()
{
init();
enable_trackbars();
while((cvWaitKey(10)&255)!=27)
{ //pobranie klatki filmu
frame = cvQueryFrame(capture);
if(!frame) //działanie w razie niepowodzenia odczytu klatki
{ //odpowiedni komunikat i zakończenie programu
fprintf(stderr, "błąd wyswietlenia");
getchar();
return -1;
}
image_processing();
show_images();
}
release(); //zwolnienie zasobów
return 0;
}
void init()
{
capture=cvCaptureFromCAM(CV_CAP_ANY);
//zaadresowanie wskaźnika
if(!capture) //działanie w razie niepowodzenia
{
capture=cvCaptureFromAVI(CV_CAP_ANY);
if(!capture)
{
fprintf(stderr, "błąd odczytu");
getchar();
}
}
//przypisanie wymiarów zmiennym
width = (int)cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH, 300);
height = (int)cvSetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT, 200);
CvSize size = cvSize(width,height);
frame=cvQueryFrame(capture);
if(!frame) //działanie w razie niepowodzenia odczytu klatki
{ //odpowiedni komunikat i zakończenie programu
fprintf(stderr, "błąd wyswietlenia");
getchar();
}
//definicja obrazów o wymiarach klatki frame
blurns=cvCloneImage(frame);
blur=cvCloneImage(frame);
gauss=cvCloneImage(frame);
med=cvCloneImage(frame);
bil=cvCloneImage(frame);
sob=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,1);
temp=cvCreateImage(cvGetSize(frame),8,1);
lap=cvCreateImage(cvGetSize(frame),IPL_DEPTH_16S,3);
cvNamedWindow("Lab 6"); //utworzenie okien
cvNamedWindow("Blur no scale");
cvNamedWindow("Blur");
cvNamedWindow("Gauss");
cvNamedWindow("Median");
cvNamedWindow("Bilateral");
cvNamedWindow("Sobel");
cvNamedWindow("Laplace");
}
void release()//zwolnienie zsaobów, zamknięcie okien
{
cvDestroyAllWindows();
cvReleaseImage (&frame);
cvReleaseImage (&blurns);
cvReleaseImage (&blur);
cvReleaseImage (&gauss);
cvReleaseImage (&med);
cvReleaseImage (&bil);
cvReleaseImage (&sob);
cvReleaseImage (&lap);
cvReleaseCapture(&capture);
}
void image_processing() //wywołanie filtrów
{
//blurn_iter, bil_iter, lap_iter muszą być >0
if(blurns_iter==0)blurns_iter=1;
if(bil_iter==0)bil_iter=1;
if(lap_iter==0)lap_iter=1;
//filtrowanie
cvSmooth(frame, blurns,CV_BLUR_NO_SCALE,blurns_iter,blurns_iter);
//gauss_iter, blur_iter, med_iter muszą być nieparzyste
if(gauss_iter%2==1) cvSmooth(frame,gauss,CV_GAUSSIAN,gauss_iter,gauss_iter);
else cvSmooth(frame,gauss,CV_GAUSSIAN,gauss_iter+1,gauss_iter+1);
if(blur_iter%2==1) cvSmooth(frame,blur,CV_BLUR,blur_iter,blur_iter);
else cvSmooth(frame,blur,CV_BLUR,blur_iter+1,blur_iter+1);
if(med_iter%2==1) cvSmooth(frame,med,CV_MEDIAN,med_iter,med_iter);
else cvSmooth(frame,med,CV_MEDIAN,med_iter+1,med_iter+1);
//cvSmooth(frame, bil, CV_BILATERAL,21,21,bil_iter,bil_iter);
cvCvtColor(frame,temp,CV_BGR2GRAY);
if(sob_iter%2==1) cvSobel(temp,sob,0,1,sob_iter);
else cvSobel(temp,sob,0,1,sob_iter+1);
if(lap_iter%2==1) cvLaplace(frame,lap,lap_iter);
else cvLaplace(frame,lap,lap_iter+1);
blurns_trackbar(blurns_iter);//obsługa suwaków
blur_trackbar(blur_iter);
gauss_trackbar(gauss_iter);
med_trackbar(med_iter);
bil_trackbar(bil_iter);
sob_trackbar(sob_iter);
lap_trackbar(lap_iter);
}
void enable_trackbars()
{
cvCreateTrackbar("blur no scale", "Blur no scale",&blurns_iter,8, blurns_trackbar);
cvCreateTrackbar("blured", "Blur",&blur_iter,200, blur_trackbar);
cvCreateTrackbar("gaussian", "Gauss",&gauss_iter,200, gauss_trackbar);
cvCreateTrackbar("median", "Median",&med_iter,200, med_trackbar);
cvCreateTrackbar("bilateral", "Bilateral",&bil_iter,200, bil_trackbar);
//sob_iter, lap_iter muszą być < 32
cvCreateTrackbar("sobel", "Sobel",&sob_iter,31, sob_trackbar);
cvCreateTrackbar("laplace", "Laplace",&lap_iter,31, lap_trackbar);
}
void show_images()
{ //wyświetlenie obrazów w oknach
cvShowImage("Lab 6",frame);
cvShowImage("Blur",blur);
cvShowImage("Blur no scale",blurns);
cvShowImage("Gauss",gauss);
cvShowImage("Median",med);
cvShowImage("Bilateral",bil);
cvShowImage("Sobel",sob);
cvShowImage("Laplace",lap);
}
Wynik działania programu
Rys1. Przedstawienie wyników dla niskiego poziomu filtracji
Rys1. Przedstawienie wyników dla średniego poziomu filtracji