Quellcode

Auf dieser Seite werden Quellcodes von erstellten Testprogrammen veröffentlicht.

Zur Ermittlung der Framerate und der Latenz der Kamera wurden einige Testprogramme geschrieben und auf dem oDroid mit angeschlossener Kamera durchgeführt. Wie die Tests im einzelnen Ablaufen ist der Seite Latenzzeitermittlung nachzulesen, dort sind auch die Ergebnisse aufgelistet.

Die FPS der Kamera wurde auf 3 Arten überprüft. Die erste Methode liest dabei einen Richtwert, welcher vom Benutzer gesetzt wird, aus der Kamera per openCV aus. Methode zwei Berechnet aus zwei Zeitwerten die Dauer einer einzelnen Aufnahme und berechnet damit die FPS aus Momentanwerten. Methode drei ermittelt die Dauer der Aufnahme für eine bestimmte Anzahl von Bildern und berechnet damit einen Mittelwert für die FPS über eine längere Zeit.


Dieses Programm wurde für die verschiedenen Anwendungen jeweils variiert. Der Quellcode ist im folgenden Block einsehbar:

/*
Name: camTest6.cpp
Programm erstllt von: Niko Dodt, Oliver Zeitz

In diesem Programm wird die oCam konfiguriert und die Framerate (FPS - Frames per Second) wird auf drei Arten ermittelt und in der Konsole dargestellt. Das Bild wird dabei jedoch nicht angezeigt.
FPS-Ermittlungsarten sind:
1) Auslesen der in der Kamera eingestellten FPS (Konstant)
2) Berechnen des Werts: FPS für jedes Bild neu berechnen (Aktueller Wert)
3) Berechnen des Werts: Anzahl der Bilder / Dauer der Aufnahme (Durchschnittswert)
Die Ergebnisse werden in der Konsole ausgegeben.
*/

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <sys/time.h>

using namespace cv;
using namespace std;

int main()
{
    //Variablen:
    struct timeval tval;
    long countImg(0);


//Kamera initialisieren

    VideoCapture cam1(0); // Kamera oeffnen

    if(!cam1.isOpened()){cout<<"cant open cam";}        //Errornachricht falls Kamera nicht angeschlossen ist

    cam1.set(CV_CAP_PROP_FRAME_WIDTH, 1280);            //Aufloesung der Kamera einstellen, Weite in Pixeln
    cam1.set(CV_CAP_PROP_FRAME_HEIGHT,720);             //Aufloesung der Kamera einstellen, Hoehe in Pixeln
    cam1.set(CV_CAP_PROP_FPS, 30);                      //Framerate der Kamera einstellen, in Frames/sec

//Zeitmessung der Bildaufnahme starten

    gettimeofday(&tval,NULL);                           //Startzeitpunkt in Sekunden und Microsekunden aufnehmen
    double t1=tval.tv_sec+(tval.tv_usec/1000000.0);

//Aufnahmeschleife starten
//Es werden so lange Bilder aufgenommen, bis ein Bildlimit erreicht ist

    while(true){
        double t = (double)cv::getTickCount();          //FPS-Messung pro Bild starten
        Mat camFrame;                                   //In camFrame wird das derzeitig aufgenommene Bild zwischengespeichert
        cam1.read(camFrame);                            //Frame einlesen und in camFrame speichern

        countImg++;                                     //Anzahl der aufgenommenen Bilder zaehlen

        //namedWindow("camoo",WINDOW_NORMAL | WINDOW_AUTOSIZE);//Anzeigefenster erstellen / GUI
        //imshow("camoo",camFrame);                     //Aufgenommenes Bild darstellen...

        t = ((double)cv::getTickCount()- t) / cv::getTickFrequency(); //FPS-Messung pro Bild beenden und ausgeben
        cout<<"Current FPS: "<<1.0 / t <<"\t"<<cam1.get(CV_CAP_PROP_FPS)<< endl;

        if(countImg>=10000)                             //Abbruchkriterium der Aufnahmeschleife, hier bei 10000 Bildern
            break;
    }

    gettimeofday(&tval,NULL);                           //Endzeitpunkt der Aufnahme speichern
    double t2=tval.tv_sec+(tval.tv_usec/1000000.0);     //Laufzeitberechnung der Schleife in sec

    cout<<"\nGesetzte Aufloesung:\t"<<cam1.get(CV_CAP_PROP_FRAME_WIDTH)<<" x "<<cam1.get(CV_CAP_PROP_FRAME_HEIGHT)<<"\tPixel"<<endl;
    cout<<"Anzahl der aufgenommenen Bilder: "<<countImg<<"\tDauer der Schleife in s: "<<t2-t1<<endl;
    cout<<"FPS mean: "<<countImg/(t2-t1)<<endl;         //Gemittelte FPS


    cam1.release(); //Kamera wieder schliessen

    return 0;
}

Die Ausgabe des Programms ist dann folgendermaßen aufgebaut:

Screenshot einer Konsolenausgabe des Programms

Alle Messergebnisse können HIER aufgerufen werden.