,
ASK LAB8 KameraVfWASK LAB8 KameraVfW, WI ZUT studia, Studia ( WI ZUT ), Architektura systemów komputerowych
[ Pobierz całość w formacie PDF ]
Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Laboratorium: MS Windows – obsługa kamery Krok 1. Uruchamiamy Visual Studio C++. Otwieramy nowy projekt ( menu-File- New-Project ). Konfigurujemy tak jak na rysunku poniżej. Projekt umieszczamy w katalogu C:\users\inazwisko gdzie inazwisko to pierwsza litera swojego imienia i nazwisko (bez spacji). Rys. 1. Okno zakładania nowego projektu Krok 2. Konfigurujemy wzorzec projektu tak jak na rysunku poniżej (typu Single Document). Rys. 2. Okno konfiguracji projektu Opracował: Mariusz Kapruziak ( mkapruziak@wi.ps.pl ) wersja: 2009-11-11 1 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Krok 3. Otwieramy plik „KameraView.h” i wprowadzamy modyfikacje: 1) dołączamy plik „Vfw.h” (rys.3) 2) dodajemy pole HWND m_wndKamera (rys.3) 3) Dodajemy symbol ID_CAMWND (rys.4) 1 2 Rys. 3. Modyfikacje w pliku KameraView.h 3 Rys. 4. Dodawanie symbolu ID_CAMWND Opracował: Mariusz Kapruziak ( mkapruziak@wi.ps.pl ) wersja: 2009-11-11 2 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Krok 4. Do klasy CKameraView dodajemy metodę OnInitialUpdate (rys.5). Wpisujemy kod do utworzonej metody (rys.6). Następnie uruchamiamy program. Powinniśmy otrzymać komunikat błędu taki jak na rys.7. void CKameraView::OnInitialUpdate(){ CView::OnInitialUpdate(); // TODO: Add your specialized code here HWND hwndParent = this ->GetSafeHwnd(); m_wndKamera = capCreateCaptureWindow( L "Nazwa" , WS_CHILD | WS_VISIBLE, 10, 10, 640, 480, hwndParent, ID_CAMWND ); } //--------------------------------------------------- Rys. 6. Kod w OnInitialUpdate() Rys. 5. Dodawanie metody OnInitialUpdate Rys. 7. Spodziewany komunikat błędów komentarz: Funkcja capCreateCaptureWindow tworzy okno przechwytywania strumienia wideo. Wykorzystując technologię Vfw (Video for Windows) trzeba takie okno utworzyć, nawet jeśli nie chcemy aby było widoczne. Zaleca się spojrzenie do dokumentacji MSDN w celu przeanalizowania argumentów przekazywanych do funkcji. Ciekawszą obserwacją może być sposób otrzymania uchwytu do „naszego” okna (CKameraView), które ma się stać oknem nadrzędnym względem tworzonego. Wykorzystana jest do tego metoda GetSafeHwnd. Opracował: Mariusz Kapruziak ( mkapruziak@wi.ps.pl ) wersja: 2009-11-11 3 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT Krok 5. Dodajemy do linkera powiązanie z biblioteką vfw32.lib (rys.8). Następnie uruchamiamy program ponownie. Rys. 8. Dodanie powiązania do vfw32.lib komentarz: Tym razem kompilacja i łączenie powinno przejść pomyślnie. W wyniku powinniśmy otrzymać okno z czarnym kwadratem w środku o rozmiarach 640 na 480. W tym kwadracie w dalszych etapach będzie pokazywany obraz z kamery po jego przetworzeniu wykonanym przez nas. Krok 6. Enumeracja urządzeń . komentarz: Wykorzystując Vfw można obsługiwać do 10 urządzeń wideo. Każde dostaje swój numer. Które urządzenie jest gotowe do obsługi i które ma jaki numer można określić wykorzystując funkcje capGetDriverDescription , capDriverGetName oraz capDriverGetCaps . Do połączenia się ze sterownikiem służy funkcja capDriverConnect a do rozłączenia capDriverDisconnect . Zadanie: Wypisać listę wszystkich urządzeń ich statusu oraz stanu ich gotowości: 1) Dodać tablicę łańcuchów (CString) do klasy CKameraView (rys.9). 2) Dodać kod do enumeracji w OnInitialUpdate (rys.10). 3) Przeanalizować dodany kod, w sytuacji jakby coś nie było wystarczająco jasne KONIECZNIE PYTAĆ (ważne aby rozumieć) 4) Dodać kod do OnDraw wypisujący listę urządzeń na ekranie (rys.11). Opracował: Mariusz Kapruziak ( mkapruziak@wi.ps.pl ) wersja: 2009-11-11 4 Architektura Systemów Komputerowych, Wydział Informatyki, ZUT class CKameraView : public CView { protected : // create from serialization only CKameraView(); DECLARE_DYNCREATE(CKameraView) protected : HWND m_wndKamera; CString m_strDriversEnum[10]; CString m_strDriversParam[10]; bool m_bIsDrivers[10]; … Rys. 9. Modyfikacje w KameraView.h – dodanie tablic łańcuchów z opisem urządzeń void CKameraView::OnInitialUpdate(){ CView::OnInitialUpdate(); HWND hwndParent = this ->GetSafeHwnd(); m_wndKamera = capCreateCaptureWindow( L "Nazwa" , WS_CHILD | WS_VISIBLE, 10, 10, 640, 480, hwndParent, ID_CAMWND ); for ( int i =0; i<10; i++ ){ bool res = capDriverConnect( m_wndKamera, i ); m_bIsDrivers[i] = res; m_strDriversParam[i] = L " " ; if ( res ){ char mstring[80]; capDriverGetName( m_wndKamera, mstring, 80 ); CAPDRIVERCAPS drvCaps; capDriverGetCaps( m_wndKamera, &drvCaps, sizeof ( drvCaps ) ); m_strDriversEnum[i].Format( L "%d. %s" , i, mstring ); if ( drvCaps.fHasDlgVideoSource ){ m_strDriversParam[i] += L "SourceDLG; " ; }; if ( drvCaps.fHasDlgVideoFormat ){ m_strDriversParam[i] += L "FormatDLG; " ; }; if ( drvCaps.fCaptureInitialized ){ m_strDriversParam[i] += L "INIT; " ; }; } else { m_strDriversEnum[i].Format( L "%d. ----------" , i ); }; capDriverDisconnect( m_wndKamera ); }; Rys. 10. Kod w metodzie OnInitialUpdate } //----------------------------------------------------------------------------- Opracował: Mariusz Kapruziak ( mkapruziak@wi.ps.pl ) wersja: 2009-11-11 5 5) [ Pobierz całość w formacie PDF ] |
Podobne
|