FlyCapture SDK
Dies ist ein spezielles SDK für die Handhabung von Point Grey CCD-Kameras, die häufig in der Forschung verwendet werden. Da die Kamera nicht über "openCV" geöffnet werden kann, muss sie in "Mat type" konvertiert werden, wenn Sie sie verarbeiten möchten. Die Plattform ist
Die Sprache ist
Wird unterstützt.
Laden Sie das SDK hier herunter [https://www.ptgrey.com/flycapture-sdk](Registrierung erforderlich) Es gibt auch eine offizielle Referenz in PDF, aber leider in Englisch.
Dieses Mal werden wir uns mit der Konvertierung in C ++ und Python befassen. Ich kann andere Sprachen nicht erklären, weil ich sie überhaupt nicht berührt habe, aber ich denke, dass die Dinge, die zu tun sind, fast die gleichen sind.
Auch dieses Mal verwenden wir opencv3.10
.
C++
VisualStudio2015 wird verwendet und die Umgebungskonstruktion wird weggelassen.
Error error;
BusManager busMgr;
unsigned int numCameras;
PGRGuid guid;
Camera cam;
Image rawImage, convertedImage;
IplImage *cv_image;
cv::Mat imgSub;
cv::Rect rect;
//=====================
//Kamera starten
//=====================
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());
////In meiner Umgebung steht es auf dem Kopf, fügen Sie also die folgende Zeile hinzu
//cv:Flip(writer_img, writer_img);
In den Kommentaren wies yumetodo auf den Code hin und änderte ihn. Die Operation wurde ebenfalls bestätigt.
Es hat funktioniert, wenn ich die Umgebung neu erstellt habe, um den Betrieb zu überprüfen, aber aus irgendeinem Grund hat es in meiner Umgebung nicht funktioniert. Wenn Sie ähnliche Symptome haben, lesen Sie bitte den Code vor der Änderung.
//=====================
// Image => cv::Mat
//=====================
//Konvertieren Sie das Kamerabild in IplImage
error = rawImage.Convert(PIXEL_FORMAT_BGR, &convertedImage);
if (error != PGRERROR_OK) {
error.PrintErrorTrace();
return -1;
}
//Ziel-Lebenslauf kopieren_Bildinitialisierung
int w = rawImage.GetCols(), h = rawImage.GetRows();
cv_image = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);
// cv_In den Bildspeicher kopieren
memcpy(cv_image->imageData, convertedImage.GetData(), w * h * 3);
//In meiner Umgebung steht es auf dem Kopf, fügen Sie also die folgende Zeile hinzu
//cvFlip(cv_image, cv_image);
//Von IplImage nach Mat konvertieren
cv::Mat writer_img = cv::cvarrToMat(cv_image);
Python
Die verwendete Python-Version ist "3.5.2". Wir haben den Vorgang auf dem 2. System nicht bestätigt, aber da beide Wrapper-Bibliotheken unterstützt werden, denke ich, dass dies ein Referenzlevel sein wird.
import PyCapture2
import cv2
#============================
#Kamera starten
#============================
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()
#============================
#Konvertieren Sie in ein Formular, das mit opencv verwendet werden kann
#============================
#Holen Sie sich ein Bild
tmp_image = cam.retrieveBuffer()
#numpy Array(Python OpenCV verwendet Numpy Array)
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()));
#Geben Sie den Farbraum an(Wenn Sie dies nicht tun, erhalten Sie ein graues Bild)
raw_image = cv2.cvtColor(cv_image, cv2.COLOR_BAYER_BG2BGR)