Informatik und Kram

Da wir lange nicht wußten, wo wir das für die Uni ausgearbeitete Material unterbringen sollten und auch einen schrecklichen Drang hatten der Welt diverse Sachen aufzudrücken...

OpenCV
de-flagge aktiviert en-flagge deaktiviert

Wir suchen ja schon länger nach ner coolen Bildverarbeitungs-Lib, die uns erlaubt, ordentlich auf Webcam-Streams zu rechnen, speziell auf V4L2 Geräten. Wir haben bereits mit Vigra von Holger Friedrich sehr gute Erfahrungen gemacht, leider fehlt hier der V4L2-Support. Als nächstes war dann CImg dran, was auch ziemlich gute Funkionen zur Verfügung stellt, aber leider nur wieder mal so eine beschne Doxygen-Doku bereitstellt und kaum Tutorials zu finden sind.
Letztendlich bin ich dann aber bei OpenCV gelandet, was mich voll überzeugt hat. Ich brauchte ganze fünf Minuten, um Farbbilder von der Webcam einulesen und einen Sobel-Operator drauf anzuwenden, ausserdem ist das Wiki von denen super!

Download und Installieren

Downloaden OpenCV von sourceforge, dann wie gewohnt:
$> tar xvzf opencv-1.1.tar.gz
$> cd open-cv-1.1.0
$> ./configure
$> make && make install
Fertig! Jetzt noch die Umgebungsvariablen anpassen, in der Anleitung steht auch direkt schon, wie man für Linux damit kompilieren kann!

Erstes Programm compilen

Wenn ihr eine V4L2-Cam habt könnt ihr nun mit folgendem Code das erste einfache Programm speichern:
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <iostream>

using namespace std;

int main() {

  CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
  if( !capture ) {
    fprintf( stderr, "ERROR: capture is NULL \n" );
    getchar();
    return -1;
  }

  // Zwei Fenster erstellen, eins für original-Bild, eins für Sobel
  cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
  cvNamedWindow( "extra", CV_WINDOW_AUTOSIZE );

  while( 1 ) {
    // Erstmal die "Container" füllen, hier mit dem CamBild
    IplImage* image = cvQueryFrame( capture );
    IplImage* frame = cvQueryFrame( capture );
    if( !frame ) {
      fprintf( stderr, "ERROR: frame is null...\n" );
      getchar();
      break;
    }
   
    cvShowImage( "mywindow", frame);
    cvSobel(frame, image, 1, 1, 3);

    cvShowImage( "extra", image);
   
    //Wenn ESC gedrückt wird, Key=0x10001B 
    //mit OpenCV 0.9.7(linux version),
    //hohe bits mit AND-Operator entfernen, Prog verlassen
    if( (cvWaitKey(10) & 255) == 27 ) break;
  }

  // Release
  cvReleaseCapture( &capture );
  cvDestroyWindow( "mywindow" );
  return 0;
}
Das ganze kann jetzt mit
g++ `pkg-config --cflags opencv` `pkg-config --libs opencv` -o cam_capture main.cpp
kompiliert werden. Der Aufruf von cam_capture liefert dann folgendes:

Einfache Erkennung

Hier mal ne einfache Erkennung (rot-Verhältnis im Vergleich zu den anderen beiden Kanälen):

Kommentare

Für alle, die verstanden haben, wofür es PKGBUILDs gibt, hier der Link ins AUR.

Kommentar schreiben