Als Erstes ein Überblick über die wichtigsten Typen und Funktionen von OpenCV:
typedef struct CvCapture:
Eine Struktur zur Videoerfassung. Entweder duch eine Webcam oder eine AVI-Datei
typedef struct IplImage:
Eine Struktur in der ein Bild gespeichert wird. Qt kennt dieses Format nicht, deshalb müssen wir es später in QImage konvertieren.
CvCapture* cvCaptureFromCAM(int index)
Diese Funktion startet den Stream einer Kamera. Sie gibt einen pointer auf ein CvCapture zurück.
Der erste Parameter ist die Nummer der zu benutzenden Kamera.
void cvReleaseCapture(CvCapture** capture)
schließt den Stream wieder.
IplImage* cvQueryFrame(CvCapture* capture)
Damit kann man ein Frame aus einem Stream auslesen.
Das waren alle wichtigen Funktionen.
Dann lasst uns mal anfangen!
Zum kompilieren müsst ihr euch erstmal OpenCV herunterladen: http://opencv.willowgarage.com/wiki/
Als Erstes brauchen wir ein MainWindow (bei mir "MainWin") mit einem GraphicsView ("ViewBox").
Das ist dann die mainwin.h:
Code: Alles auswählen
#ifndef MAINWIN_H
#define MAINWIN_H
#include "ui_mainwin.h"
#include <cv.h>
#include <highgui.h>
class MainWin : public QMainWindow, private Ui::MainWin
{
Q_OBJECT
private:
CvCapture *source; // Der Stream
public:
MainWin(QWidget *parent = 0); // Konstruktor
~MainWin(void); // Destruktor
protected:
void timerEvent(QTimerEvent*); // Timer-Funktion zum Frames-auslesen und anzeigen
};
#endif
Code: Alles auswählen
#include <QtGui>
#include <stdio.h>
#include "imgconvert.h"
#include "mainwin.h"
MainWin::MainWin(QWidget *parent)
{
setupUi(this);
source = cvCaptureFromCAM(0);
startTimer(30);
}
Code: Alles auswählen
MainWin::~MainWin(void)
{
cvReleaseCapture(&source);
}
Code: Alles auswählen
void MainWin::timerEvent(QTimerEvent*)
{
IplImage *image; // Eingelesenes Bild im OpenCV-Format
QGraphicsScene *scene = new QGraphicsScene(); // Grafikszene
scene->setBackgroundBrush(QColor(0, 0, 0)); // Schwarzer Hintergrund
image = cvQueryFrame(source); // Frame auslesen
scene->addPixmap(QPixmap::fromImage(MirrorImage(ConvertImage(image), H_MIRROR))); // Bild in QImage konvertieren, auf den Kopf stellen und anzeigen
ViewBox->setScene(scene); // Szene anzeigen
}
Diese Funktionen müssen wir erstmal schreiben:
imgconvert.h:
Code: Alles auswählen
#ifndef IMGCONVERT_H
#define IMGCONVERT_H
#include <cv.h>
#include <QPixmap>
#include <QImage>
#define V_MIRROR 1
#define H_MIRROR 2
QImage MirrorImage(const QImage source, int side);
QImage ConvertImage(IplImage *source);
#end
Code: Alles auswählen
#include "imgconvert.h"
QImage MirrorImage(QImage source, int side)
{
int x, y;
QImage ret;
ret = QImage(source); //source.width(), source.height(), source.format());
for(x=0; x<source.width(); x++)
{
for(y=0; y<source.height(); y++)
{
ret.setPixel(((side & V_MIRROR) ? source.width() - (x + 1) : x), ((side & H_MIRROR) ? source.height() - (y + 1) : y), source.pixel(x, y));
}
}
return ret;
}
QImage ConvertImage(IplImage *source)
{
int cvIndex, cvLineStart;
QImage ret;
if(source->depth != IPL_DEPTH_8U || source->nChannels != 3)
return ret;
QImage temp(source->width, source->height, QImage::Format_RGB32);
ret = temp;
cvIndex = 0;
cvLineStart = 0;
for (int y = 0; y < source->height; y++)
{
unsigned char red,green,blue;
cvIndex = cvLineStart;
for (int x = 0; x < source->width; x++)
{
red = source->imageData[cvIndex+2];
green = source->imageData[cvIndex+1];
blue = source->imageData[cvIndex+0];
ret.setPixel(x,y,qRgb(red, green, blue));
cvIndex += 3;
}
cvLineStart += source->widthStep;
}
return ret;
}
Jetzt müssen wir noch die *.pro Datei editieren, damit das mit dem CV hinhaut:
Code: Alles auswählen
INCLUDEPATH += "D:\Programme\OpenCV\cxcore\include" \
"D:\Programme\OpenCV\cv\include" \
"D:\Programme\OpenCV\cvaux\include" \
"D:\Programme\OpenCV\otherlibs\highgui"
win32:LIBS += -L"D:\Programme\OpenCV\lib"
LIBS += -lcv \
-lhighgui
FORMS += mainwin.ui
SOURCES += mainwin.cpp \
main.cpp \
imgconvert.cpp
HEADERS += mainwin.h \
imgconvert.h
Und das sollte es eigentlich schon gewesen sein!
Bitte gebt mir Feedback!
Das mit dem OpenCV brauchte ich für einen Webcam-Stream Server (von American Pie inspiriert ):
http://www.metallic-entertainment.com/?page=webcam_app