2012-06-13 17 views
7

Mam wcześniej zaprogramowaną kamerę internetową USB, której jedynym celem jest uzyskanie klatek na żywo z kamery i wyświetlanie w oknie. W tym celu użyłem cvCaptureFromCAM, który działał dobrze dla kamery USB (zobacz poniższy kod).OpenCV: Jak przechwytywać ramki z kamery Ethernet

Chcę wiedzieć, w jaki sposób przechwytywać ramki z kamery Gigabit Ethernet? Chyba muszę przechwytywać klatki z jakiegoś domyślnego adresu IP za pomocą jakiegoś API. Czy ktoś może wskazać mi właściwy kierunek?

Będę używać C++ z OpenCV na Windows 7 na procesorze Intel i3.

#include "cv.h" 
#include "highgui.h" 
#include <stdio.h> 

// A Simple Camera Capture Framework 
int main() { 
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); 
    if (!capture) { 
     fprintf(stderr, "ERROR: capture is NULL \n"); 
     getchar(); 
     return -1; 
    } 

    // Create a window in which the captured images will be presented 
    cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE); 

    // Show the image captured from the camera in the window and repeat 
    while (1) { 
     // Get one frame 
     IplImage* frame = cvQueryFrame(capture); 

     if (!frame) { 
      fprintf(stderr, "ERROR: frame is null...\n"); 
      getchar(); 
      break; 
     } 

     cvShowImage("mywindow", frame); 

     // Do not release the frame! 
     // If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version), 
     // remove higher bits using AND operator 
     if ((cvWaitKey(10) & 255) == 27) break; 
    } 

    // Release the capture device housekeeping 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("mywindow"); 
    return 0; 
} 

Aktualizacja

Więc teraz jestem w stanie wyświetlać obrazy na żywo w sprzedawca warunkiem oprogramowania GUI. Ale nadal chcę wyświetlić obraz (i ewentualnie wideo) za pomocą adresu IP kamery.

Kiedy znam adres IP kamery, dlaczego nie mogę uzyskać dostępu do danych (obrazów) wysyłanych przez kamerę i do wyświetlania w przeglądarce? Próbowałem wpisać adres IP kamery (tj. 192.169.2.3) w mojej przeglądarce (192.169.2.4), ale powiedziałem "nie znaleziono strony". Co to znaczy?

+0

możliwe duplikat [OpenCV z kamery sieciowe] (http://stackoverflow.com/questions/712998/opencv-with-network-cameras) – karlphillip

+0

Jest to także możliwe duplikat [OpenCV z GigE Vision Kamery] (http://stackoverflow.com/questions/3345467/opencv-with-gige-vision-cameras). – karlphillip

+0

Dzięki, zauważyłem twoje komentarze po opublikowaniu aktualizacji. Spojrzę na linki. – gpuguy

Odpowiedz

3

Nie będziesz mieć dostępu do zdjęć w aparacie, jeśli nie ma on uruchomionego serwera WWW (sprawdź w doco). spróbuj wpisać to w wierszu poleceń:

telnet 192.169.2.3 80 

Jeśli czasy telnet się, aparat nie działa serwer na porcie domyślnym 80.

zobaczyć również na to pytanie: C++ code Capturing image from IP/Ethernet Cameras (AXIS Cam)

+0

dzięki temu ma wiele sensu. dzięki – gpuguy

0

ponieważ jest kamerą IP, co oznacza, że ​​działa serwer WWW, musisz znać port tego serwera, powinieneś go znaleźć w instrukcji, jeśli nie możesz go znaleźć, jest program o nazwie "iSpy", ten program skanuje LAN i znajdzie wszystkie informacje potrzebne do połączenia się z CAM tylko google dla iSpy i można go pobrać, to nic nie kosztuje .

6

Możesz to zrobić za pomocą interfejsu API genIcam. genIcam to ogólny interfejs dla kamer (USB, GigE, CameraLink itp.). Składa się z wielu modułów, ale najbardziej interesuje Cię GenTL (warstwa transportowa). Możesz przeczytać więcej na temat dokumentacji GenTL HERE. Aby ułatwić ten proces, zalecamy użycie interfejsu Basler API lub interfejsu API Baumer, które są klientami GenTL (producenci i konsumenci są opisani w dokumentacji GenTL). Użyłem interfejsu API Baumer, ale oba będą działać.

UWAGA: Używam aparatu czarno-białego Baumer HXG20.

RZECZY pobrać i zainstalować

  1. wizualna eddition Studios Społeczność (użyłem 2015 LINK)
  2. Baumer GAPI SDK LINK
  3. OpenCV (tutaj jest tutorial youtube zbudować OpenCV 3 dla C++) HERE

KAMER TESTOWY A Z APARATEM Z URZĄDZENIAM

Warto sprawdzić, czy karta sieciowa (NIC) i kamera GigE działają i bawić się z aparatem, korzystając z programu Eksplorator aparatu. Może być konieczne włączenie pakietów Jumbo na karcie sieciowej. Możesz skonfigurować IP kamery również za pomocą programu IPconfig. Używam ustawienia DHCP, ale możesz też użyć statycznego adresu IP dla kamery i karty sieciowej.

USTAWIENIA VISUAL STUDIOS

kroki do ustawiania zmiennych środowiskowych systemu i konfigurowanie studio wizualne są opisane w Baumer GAPI programistów SDK prowadnicy (rozdział 4), który znajduje się w następującym katalogu

C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide

  • Sprawdź, czy masz następujące zmiennej systemowej (w przypadku korzystania z wersji 64 bitowej) lub utworzyć zmienną w razie potrzeby (re do punktu 4.3.1 w przewodniku programisty).

    • name = GENICAM_GENTL64_PATH
    • value = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64\
  • w Visual Studio, utwórz nowy projekt C++ i aktualizuje następujące właściwości (patrz rozdział 4.4.1 w podręczniku programisty).

    • C/C++> Ogólne> Dodatkowe Include Directories = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Inc
    • Linker> Ogólne> dodatkowe katalogi biblioteczne = C:\Program Files\Baumer\Baumer GAPI SDK\Components\Dev\C++\Lib\x64
    • Linker> Wejścia> Dodatkowe Zależności = bgapi2_genicam.lib
    • Build Wydarzenia> Post-Budowa zdarzeń > Wiersz poleceń = copy "C:\Program Files\Baumer\Baumer GAPI SDK\Components\Bin\x64"\*.* .\

STWÓRZ .cpp plik do Wyświetlany obraz strumień w OpenCV OKNA

Najprostszym sposobem, aby zacząć jest użycie jednego z kodów przykładowych przewidzianych w Baumer GAPI SDK i zmodyfikować go, aby dodać funkcjonalność OpenCV.Przykładowy kod do wykorzystania jest 005_PixelTransformation, który znajduje się tutaj

C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation

Kopiuj i wklej ten plik .cpp do katalogu źródłowego projektu i upewnić się, można zbudować i skompilować. Powinien przechwycić 8 obrazów i wydrukować pierwsze 6 pikseli wartości z pierwszych 6 linii dla każdego obrazu.

Dodaj te #include oświadczenia do pliku źródłowego .cpp:

#include <opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv2\video\video.hpp> 

Dodaj te deklaracje zmiennych na początku main() funkcji

// OPENCV VARIABLE DECLARATIONS 
cv::VideoWriter cvVideoCreator;     // Create OpenCV video creator 
cv::Mat openCvImage;       // create an OpenCV image 
cv::String videoFileName = "openCvVideo.avi"; // Define video filename 
cv::Size frameSize = cv::Size(2048, 1088);  // Define video frame size (frame width x height) 
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate 

w oryginalnym pliku 005_PixelTransformation.cpp, linia 569 ma pętlę for, która wykonuje pętlę ponad 8 obrazów, co oznacza for(int i = 0; i < 8; i++). Chcemy to zmienić, aby działał nieprzerwanie. Zrobiłem to zmieniając go do while pętli, który mówi

while (pDataStream->GetIsGrabbing()) 

ramach naszej nowej while pętli, nie ma oświadczenie if, który sprawdza, czy format pikseli jest „Mono” (skala szarości) lub kolor. W oryginalnym pliku zaczyna się od wiersza 619 i kończy na 692. Bezpośrednio po zamknięciu nawiasów instrukcji if i else musimy dodać część openCV, aby wyświetlić obrazy w oknie. Dodaj poniższe linie kodu

} // This is the closing brace for the 'else color' statement 

// OPEN CV STUFF 
openCvImage = cv::Mat(pTransformImage->GetHeight(), pTransformImage->GetWidth(), CV_8U, (int *)pTransformImage->GetBuffer()); 

// create OpenCV window ---- 
cv::namedWindow("OpenCV window: Cam", CV_WINDOW_NORMAL); 

//display the current image in the window ---- 
cv::imshow("OpenCV window : Cam", openCvImage); 
cv::waitKey(1); 

Należy zwrócić uwagę jest format piksela w obiekcie openCvImage. Mój aparat ma 8-bitowy kod, więc muszę podać CV_8U. Jeśli twój aparat ma rozdzielczość RGB lub 10-bitową, musisz podać poprawny format (zobacz dokumentację openCV HERE).

można zapoznać się z innymi przykładami regulacji parametrów kamery.

teraz po zbudowaniu i skompilowaniu, powinieneś mieć otwarte okno openCV wyświetlające obrazy z kamery!

KOŃCZY SIĘ WIĘCEJ GŁOSÓW LUDZI !!!! (Miało to dużo czasu, aby dostać pracę tak zaczepić mnie !!!)

THUMBS UP FOR MORE UP VOTES!!!!!

+0

Mogę potwierdzić to działa w programie Win32 Baumer-GAPI 2.8.1 na Win7 64bit śpiewać aparat Baumer TXG06. Dziękuję za wejście. –

0

Aby dodać do mark jay „s odpowiedź (co mogę potwierdzić prace nad Win7x64 wewnątrz programu Win32 przy użyciu Baumer- GAPI2 2.8.1 i kompilator VC10 oraz kamera Baumer TXG06). Jeśli kamera jest skonfigurowana do przechwytywania Mono8 i zamierzasz pobrać obrazek w tym samym formacie CV_8UC1, to w przykładzie 005_PixelTransformation.cpp możesz w ogóle uniknąć tworzenia BGAPI2::Image* pTransformImage i BGAPI2::Image* pImage i po prostu zbudować cv::Mat używając wskaźnika pamięci buforowej jak w następujący fragment z mojego GigE_cam klasy:

bool GigE_cam::operator>>(cv::Mat& out_mat) 
{ 
    bool success(false); 
    try 
    { 
     _p_buffer_filled = _p_data_stream->GetFilledBuffer(static_cast<bo_uint64>(_timeout_ms)); 
     if(_p_buffer_filled != 0) 
     { 
      if(_p_buffer_filled->GetIsIncomplete()) 
      { 
       _p_buffer_filled->QueueBuffer(); 
      } 
      else 
      { 
       if(_p_buffer_filled->GetPixelFormat() == "Mono8") 
       { 
        _image_out_buffer = cv::Mat(static_cast<int>(_p_buffer_filled->GetHeight()), 
               static_cast<int>(_p_buffer_filled->GetWidth()), 
               CV_8UC1, 
               static_cast<uchar*>(_p_buffer_filled->GetMemPtr())); 
        if(_image_out_buffer.data) 
        { 
         _image_out_buffer.copyTo(out_mat); 
         success = true; 
        } 
       } 
       else if(_p_buffer_filled->GetPixelFormat() == "Mono10") 
       { 
        // Todo transform to BGR8 etc. not implemented 
       } 
       _p_buffer_filled->QueueBuffer(); // Queue buffer after use 
      } 
     } 
    } 
    catch(BGAPI2::Exceptions::IException& ex) 
    { 
     _last_BGAPI2_error_str = ex.GetType(); 
    } 
    return success; 
} 

Ten kod jest uzyskiwanie pełnych klatek z kamery (776 x 582 px) na 66,5 fps, gdzie nawet arkusz twierdzi jedynie 64,0 fps. Jestem ciekaw, czy ich API będzie działać tak samo na Debianie.

Incoming Image

Powiązane problemy