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.
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