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.
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
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.
C:\Program Files\Baumer\Baumer GAPI SDK\Docs\Programmers_Guide
). Reportez-vous à la section 4.3.1.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.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.
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.
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++).