[PYTHON] Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV

introduction

FlyCapture SDK

Il s'agit d'un SDK dédié à la gestion des caméras CCD Point Gray qui sont souvent utilisées dans la recherche. Puisque la caméra ne peut pas être ouverte à partir de ʻopenCV, il est nécessaire de la convertir en type de mat` si vous voulez la traiter. La plateforme est

La langue est

Est pris en charge.

Téléchargez le SDK ici [https://www.ptgrey.com/flycapture-sdk) (inscription requise) Il existe également une référence officielle en PDF, mais malheureusement en anglais.

Langue à utiliser

Cette fois, nous traiterons de la conversion en C ++ et Python. Je ne peux pas expliquer les autres langues parce que je ne les ai pas touchées en premier lieu, mais je pense que les choses à faire sont presque les mêmes.

De plus, cette fois, nous utilisons ʻopencv 3.10`.

C++

VisualStudio2015 sera utilisé et la construction de l'environnement sera omise.


	Error error;
	BusManager busMgr;
	unsigned int numCameras;
	PGRGuid guid;
	Camera cam;
	Image rawImage, convertedImage;
	IplImage *cv_image;
	cv::Mat imgSub;
	cv::Rect rect;


    //=====================
    //Lancer la caméra
    //=====================

	error = busMgr.GetNumOfCameras(&numCameras);
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}

	printf("Number of cameras detected: %u\n", numCameras);
	if (numCameras != 1)
		return -1;

	error = busMgr.GetCameraFromIndex(0, &guid);
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}

	error = cam.Connect(&guid);
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}

	error = cam.StartCapture();
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}

	error = cam.RetrieveBuffer(&rawImage);
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}

	error = cam.RetrieveBuffer(&rawImage);
	if (error != PGRERROR_OK) {
		error.PrintErrorTrace();
		return -1;
	}


    //=====================
    //  Image => cv::Mat
    //=====================


    cv::Mat writer_img(h, w, CV_8UC3, convertedImage.GetData());

    ////Dans mon environnement, il est à l'envers, alors ajoutez la ligne suivante
    //cv:Flip(writer_img, writer_img);

Dans les commentaires, yumetodo a souligné et changé le code. L'opération a également été confirmée.

Cela fonctionnait si je reconstruisais l'environnement pour vérifier l'opération, mais cela ne fonctionnait pas dans mon environnement pour une raison quelconque. Si vous avez des symptômes similaires, veuillez vous référer au code avant le changement.


    //=====================
    //  Image => cv::Mat
    //=====================

    //Convertir l'image de la caméra en IplImage
    error = rawImage.Convert(PIXEL_FORMAT_BGR, &convertedImage);
    if (error != PGRERROR_OK) {
        error.PrintErrorTrace();
        return -1;
    }

   //Copier le CV de destination_initialisation d'image
    int w = rawImage.GetCols(), h = rawImage.GetRows();
    cv_image = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);

    // cv_Copier dans la mémoire d'image
    memcpy(cv_image->imageData, convertedImage.GetData(), w * h * 3);

    //Dans mon environnement, il est à l'envers, alors ajoutez la ligne suivante
    //cvFlip(cv_image, cv_image); 

    //Convertir de IplImage en Mat
    cv::Mat writer_img = cv::cvarrToMat(cv_image);

Python

La version de python utilisée est «3.5.2». Nous n'avons pas confirmé l'opération sur le 2ème système, mais comme les deux bibliothèques Wrapper sont supportées, je pense que ce sera un niveau de référence.


import PyCapture2
import cv2

#============================
#Lancer la caméra
#============================

bus = PyCapture2.BusManager()
cam = PyCapture2.Camera()
uid = bus.getCameraFromIndex(0)
cam.connect(uid)

numCams = bus.getNumOfCameras()
print("Number of cameras detected: ", numCams)
if not numCams:
	print("Insufficient number of cameras. Exiting...")
	exit()

cam.startCapture()


#============================
#Convertir en un formulaire pouvant être utilisé avec opencv
#============================

#Obtenir une image
tmp_image = cam.retrieveBuffer()

#tableau numpy(python opencv utilise un tableau numpy)
row_bytes = float(len(tmp_image.getData()))/float(tmp_image.getRows())
cv_image = np.array(tmp_image.getData(), dtype="uint8").reshape((tmp_image.getRows(), tmp_image.getCols()));

#Spécifiez l'espace colorimétrique(Si vous ne le faites pas, vous obtiendrez une image grise)
raw_image = cv2.cvtColor(cv_image, cv2.COLOR_BAYER_BG2BGR)

Recommended Posts

Convertir des images du SDK FlyCapture en un formulaire pouvant être utilisé avec openCV
Convertir les données de maillage exportées de SpriteUV2 dans un format pouvant être importé par Spine
Convertir une image au format PIL lue depuis un formulaire avec Django au format base64
Types de fichiers pouvant être utilisés avec Go
Formatez les données DataFrame avec Pytorch sous une forme pouvant être entraînée avec NN
Comment installer la bibliothèque Python qui peut être utilisée par les sociétés pharmaceutiques
Je voulais créer rapidement un serveur de messagerie utilisable librement avec postfix + dovecot sur EC2
Notes sur les connaissances Python utilisables avec AtCoder
J'ai créé un programme pour convertir des images en art ASCII avec Python et OpenCV
[Python] Introduction au scraping WEB | Résumé des méthodes pouvant être utilisées avec webdriver
Un mécanisme pour appeler des méthodes Ruby à partir de Python qui peut être fait en 200 lignes
Créez une API Web capable de fournir des images avec Django
Faisons un diagramme sur lequel on peut cliquer avec IPython
[Python3] Code qui peut être utilisé lorsque vous souhaitez redimensionner des images dossier par dossier
Créez un programme qui peut générer votre image préférée avec Selenium
[Python] Créez un graphique qui peut être déplacé avec Plotly
J'ai essayé de l'étendre pour que la base de données puisse être utilisée avec le logiciel d'analyse de Wiire
Créez une Spinbox qui peut être affichée en binaire avec Tkinter
Un minuteur (ticker) qui peut être utilisé sur le terrain (peut être utilisé n'importe où)
Comprendre les probabilités et les statistiques qui peuvent être utilisées pour la gestion des progrès avec un programme python
J'ai fait un shuffle qui peut être réinitialisé (inversé) avec Python
Créez un graphique des devises qui peut être déplacé avec Plotly (2)
À propos du fait que le résumé de la torche peut être vraiment utilisé lors de la construction d'un modèle avec Pytorch
Comparaison de 4 styles pouvant être passés à seaborn avec set_context
Créez une Spinbox pouvant être affichée dans HEX avec Tkinter
Créez un graphique des devises qui peut être déplacé avec Plotly (1)
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
Convertissez l'image du visage en une qualité d'image élevée avec PULSE afin que vous puissiez voir les pores et la texture
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
J'ai créé un modèle de projet Python générique
Module de traitement du signal acoustique qui peut être utilisé avec Python-Sounddevice ASIO [Application]
Comment créer un bot Janken qui peut être facilement déplacé (commentaire)
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Optimisation mathématique pour un travail gratuit avec Python + PuLP
J'ai fait une simple minuterie qui peut être démarrée depuis le terminal
Python-Sound device Module de traitement du signal acoustique ASIO [Basic]
Convertir de PDF en CSV avec pdfplumber
[Python3] Code qui peut être utilisé lorsque vous souhaitez découper une image dans une taille spécifique
Il semble que l'annulation de toutes les commandes enfants puisse être utilisée pour annuler toutes les commandes parentes (commandes spéciales) avec l'API bitflyer
Si vous souhaitez créer une application Windows (exe) qui peut être utilisée maintenant en utilisant uniquement Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Notes personnelles des opérations liées aux pandas qui peuvent être utilisées dans la pratique
J'ai créé une image Docker qui peut appeler FBX SDK Python à partir de Node.js
J'ai essayé de résumer les opérations susceptibles d'être utilisées avec numpy-stl
Commande Linux (édition de base) utilisable à partir d'aujourd'hui si vous connaissez
Module de grattage "Gaspacho" qui peut être utilisé plus facilement que Beautiful Soup
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
Jusqu'à ce que vous puissiez utiliser youtube-dl avec Synology (DS120j)
Fonctions pouvant être utilisées dans l'instruction for
Impossible de télécharger plusieurs images à partir du formulaire avec FastAPI
Convertissez des PDF en images en masse avec Python
Serveur de jeu avec deux PC
Répertorier les packages pouvant être mis à jour avec pip
Une histoire qui a échoué lors de la tentative de suppression du suffixe d'une chaîne avec rstrip
Un mémo qui détecte le visage de l'image acquise à partir de la caméra Web avec OpenCV de Django et le renvoie.
J'ai essayé de faire une application mémo qui peut être pomodoro, mais un enregistrement de réflexion
À partir d'un livre que le programmeur peut apprendre ... Conversion de caractères qui représentent des nombres en type entier
Comment créer une propriété de relations qui peuvent être prefetch_related par des conditions spécifiques
Serveur de partage de fichiers réalisé avec Raspberry Pi pouvant être utilisé pour le travail à distance