web-dev-qa-db-fra.com

OpenCV avec caméras GigE Vision

Je dois utiliser OpenCV avec une caméra Ethernet GigE Vision, mais je n'ai pas trouvé beaucoup d'informations utiles sur la façon de procéder, des pointeurs, des documents et un exemple de code?

J'ai besoin de lire les images de l'appareil photo.

31
Matias Valdenegro

Gig-E est une norme de communication pour une large gamme de caméras. OpenCV contient maintenant un wrapper pour les caméras basées sur Prosilica Gig-E (voir CV_CAP_PVAPI)

Mais en général, il est préférable d'utiliser l'API native de la caméra pour obtenir les données, puis d'utiliser openCV pour convertir les données renvoyées en image, openCv contient un certain nombre de modèles Bayer -> routines RVB.

Le module CvCapture est pratique pour les tests, car il peut sembler lire à partir d'une caméra ou d'un fichier - mais il n'est pas vraiment adapté à la vision en temps réel à grande vitesse

20
Martin Beckett

Tu peux le faire! J'ai utilisé le SDK Baumer GAPI, qui est un consommateur GenTL. GenTL est une couche de transport générique, qui est un module dans genIcam. Vous pouvez lire sur GenTL ICI . L'utilisation d'un consommateur GenTL comme le GAPI de Baumer ou l'API de Basler facilite les choses. Ils devraient fonctionner avec n'importe quelle caméra GigE.

J'ai fait un moyen plus complet d'utiliser le SDK GAPI de Baumer dans une autre réponse ICI , donc je vais donner un résumé de ce dont vous avez besoin.

  1. Visual Studios
  2. openCV 3 pour C++ ( [[# # ~] ici [~ # ~] est un tutoriel YouTube sur la façon dont)
  3. SDK Baumer GAPI ICI
  4. (facultatif) Testez votre caméra et votre carte d'interface réseau à l'aide du programme Camera Explorer de Baumer. Vous devez activer les paquets jumbo. Vous devrez peut-être également configurer l'adresse IP de la caméra et de la voiture à l'aide du programme IPconfig de Baumer.
  5. Configurez vos variables système. reportez-vous au guide du programmeur dans le dossier de documentation Baumer GAPI SDK (devrait être dans C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide). Reportez-vous à la section 4.3.1.
  6. Créez un nouveau projet C++ dans Visual Studios et configurez les propriétés. Reportez-vous à la section 4.4.1.
  7. Accédez au dossier des exemples et recherchez l'exemple 005_PixelTransformation. Il doit être en (C:\Program Files\Baumer\Baumer GAPI SDK\Components\Examples\C++\src\0_Common\005_PixelTransformation). Copiez le fichier C++ et collez-le dans le répertoire source de votre nouveau projet.
  8. Vérifiez que vous pouvez créer et compiler. REMARQUE: vous pouvez rencontrer un problème avec la partie qui ajuste les paramètres de l'appareil photo (temps d'exposition par exemple). vous devriez voir des valeurs de pixels écrites à l'écran pour les 6 premiers pixels dans les 6 premières lignes, pour 8 images.

Ajoutez ces instructions #include en haut du fichier source .cpp:

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

Ajoutez ces déclarations de variables au début de la fonction main()

// 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
cvVideoCreator.open(videoFileName, CV_FOURCC('D', 'I', 'V', 'X'), 20, frameSize, true); // set the codec type and frame rate

Dans le fichier 005_PixelTransformation.cpp d'origine, la ligne 569 a une boucle for qui fait une boucle sur 8 images, qui dit for(int i = 0; i < 8; i++). Nous voulons changer cela pour qu'il fonctionne en continu. Je l'ai fait en le changeant en boucle while qui dit

while (pDataStream->GetIsGrabbing())

Dans la boucle while, il y a une instruction if et else pour vérifier le format des pixels de l'image. Après l'accolade fermante de l'instruction else et avant l'instruction pImage->Release();, ajoutez les lignes suivantes

// 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);

Assurez-vous d'avoir choisi le format de pixel correct pour votre objet openCvImage. J'ai choisi CV_8U Car mon appareil photo est mono 8 bits.

Lorsque vous construisez et compilez, vous devriez obtenir une fenêtre openCV qui affiche le flux en direct de votre caméra!

Comme je l'ai dit, cela peut être fait, car je l'ai fait. Si vous rencontrez des problèmes, reportez-vous au guide du programmeur.

enter image description here

9
mark jay

J'utilise une caméra uEye GigE (5240) avec OpenCV. Il fonctionne comme un cv :: VideoCapture prêt à l'emploi. Néanmoins, l'utilisation de l'API permet de contrôler beaucoup plus les paramètres des caméras.

4
Herr von Wurst

Vous ne mentionnez pas le type de caméra et votre plateforme. Sous Windows, selon la documentation OpenCV:

Actuellement, deux interfaces de caméra peuvent être utilisées sur Windows: Video for Windows (VFW) et Matrox Imaging Library (MIL)

Il est peu probable que votre pilote de caméra GigE prenne en charge VFW, et pour MIL, vous avez besoin de la bibliothèque MIL, qui n'est pas gratuite AFAIK.

La plupart des caméras GigE auront une API que vous pouvez utiliser pour capturer des images. Dans la plupart des cas, l'API sera basée sur GenICam . Votre meilleure approche est probablement d'utiliser l'API fournie avec votre appareil photo, puis de convertir l'image capturée en structure IplImage (C) ou en classe Mat (C++).

3
Dani van der Meer