Domowe efekty specjalne - podmiana tła

28.09.2011 - Filip Mróz
TrudnośćTrudność

Wyświetlanie obrazu z kamery

Pierwszym krokiem podczas pracy z kamerą jest jej poprawna instalacja. Instalujemy sterowniki, a następnie podłączamy kamerę. Dobrze jest sprawdzić czy wszystko działa, używając dostarczonego z kamerą programu albo za pomocą małej aplikacji AMCap.

Kamera działa, pora podłączyć się do niej za pośrednictwem OpenCV. Jest to niezwykle proste i, co ważne, kod jest niezależny od rodzaju używanej kamery czy interfejsu. Tworzymy nowy projekt, nazwijmy go foreground_separation, a następnie dodajemy do niego plik main.cpp. Spróbujmy najpierw połączyć się z kamerą. By tego dokonać umieśćmy w pliku main.cpp następujący kod:

#include <cstdio>
using namespace std;
 
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
 
VideoCapture camera;
 
int main(int argc, char *argv[]) {
	camera.open(0);
	if(!camera.isOpened()){
		printf("Cannot connect to the camera!\n"); 
		getchar();
		return -1;
	}
	else {
		printf("Connection established!\n");
		getchar();
	}
	return 0;
}

Program próbuje się połączyć z kamerą o identyfikatorze 0 i informuje o rezultacie. Jeśli identyfikator zwiększymy poza liczbę kamer podłączonych do komputera to podłączy się do ostatniej dostępnej. VideoCapture to wspólna klasa obsługująca kamery i pliki wideo z którą zapoznamy się bliżej przy pobieraniu obrazu z kamery.

W przypadku problemów

Jeśli kod się nie kompiluje (np. występują błędy linkera) należy sprawdzić, czy ścieżki do plików biblioteki zostały poprawnie dodane do środowiska, oraz czy odpowiednie biblioteki zostały dodane do projektu (więcej). W przypadku VC++ należy pamiętać, że biblioteki z końcówką 'd' są bibliotekami używanymi przy kompilacji 'Debug' (do 'Release' należy podłączyć pliki bez tej końcówki).

W przypadku błędów podczas uruchomienia, gdy brak pliku opencv_highgui230.dll, należy ten plik skopiować do katalogu z programem, bądź dodać katalog z plikami DLL OpenCV do ścieżki systemowej PATH.

Kolejnym krokiem jest pobranie aktualnego obrazu z kamery i wyświetlenie go. Wystarczy zadeklarować obiekt typu Mat (który reprezentuje macierz pikseli), a następnie wypełnić go aktualnym obrazem z kamery. Potem pozostaje tylko wyświetlić go korzystając z prostego GUI dostarczanego z OpenCV:

	printf("Connection established!\n");
	Mat inputImage;
	camera >> inputImage;
	imshow("Camera Image", inputImage);
	waitKey(0);

waitKey(0) oczekuje naciśnięcia klawisza i zwraca go, a także pozwala na wyświetlenie obrazu inputImage w oknie "Camera Image". Gdyby użyć getchar(), obraz nie zostałby pokazany.

Sukces! Udało nam się z poziomu C++ wykorzystać kamerę do zrobienia zdjęcia.

Wyświetlanie wideo z kamery

Pora ożywić trochę program i napisać pętlę, która będzie wyświetlać aktualny obraz z kamery na żywo. Najpierw dodajmy stałą regulującą prędkość odświeżania:

 const int FPS = 30;

Następnie dodajmy pętlę, która powtarza wcześniej napisaną operację wyświetlania, do momentu naciśnięcia klawisza 'k':

char key=0;
while(key!='k') {
	camera >> inputImage;
	imshow("Camera Image", inputImage);
	key = waitKey(1000/FPS);
}

waitKey(time) czeka time minisekund na klawisz, więc w miarę dodawania operacji do środka pętli czas jednego wykonania będzie rósł, przez co FPS będzie miał tylko znaczenie orientacyjne. Mimo to dla nas jest to wystarczająca regulacja.

Sporo kamer domyślnie przesyła obraz o rozdzielczości 320x240. Możemy temu zaradzić, zwiększając rozdzielczość (jeśli kamera na to pozwala) poprzez dodanie dwóch komend bezpośrednio po nawiązaniu połączenia:

camera.set(CV_CAP_PROP_FRAME_WIDTH,640);
camera.set(CV_CAP_PROP_FRAME_HEIGHT,480);

Mamy teraz program, który potrafi wyświetlać w czasie rzeczywistym obraz z kamery. Kolejnym krokiem będzie zapamiętanie obrazu tła.

Aktualną wersję kodu można znaleźć w paczce ze źródłami w pliku: main1_wyswietlanie_wideo.cpp
5
Twoja ocena: Brak Ocena: 5 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com