2013-03-17 18 views
6

Sto combattendo con questo problema da molto tempo. Non riesco a far funzionare OpenCV, e ho seguito un sacco di tutorial su questo e su come usare in Qt, quindi mi stanco e voglio evitare l'uso di OpenCV per questo.Windows + Qt e come acquisire i feed webcam senza OpenCV

Ora, il mio requisito o domanda ... Devo mostrare un feed webcam (video in tempo reale, senza audio) in un'applicazione Qt GUI con un solo pulsante: "Scatta istantanea" che, ovviamente, scatta una foto da il feed attuale e memorizzarlo.

Questo è tutto.

Esiste comunque la possibilità di eseguire questa operazione senza utilizzare OpenCV?

specifiche di sistema:

  • Qt 4.8

  • Windows XP 32 bit

  • 2.0.1.3M USB UVC WebCam (quella che sto usando ora, dovrebbe sostenere altri modelli)

Spero che qualcuno mi possa aiutare con questo perché Sto diventando pazzo.

Grazie in anticipo!

+1

Ci sono alcune opzioni elencate qui: http://stackoverflow.com/questions/1259192/webcam-access-in-c ma l'API 'DirectShow' è probabilmente quella che funzionerà meglio. –

+0

Cr * p ... Cerco e cerco in modo da non duplicare una domanda, ed eccolo ... Grazie Nicholas – webbi

+0

Beh, ho letto di DirectShow sulla domanda che punti, sembra facile o quasi compatibile con i miei bisogni, il fatto è che non riesco a trovare alcun esempio completo su come interagire con DirectShow da Qt. Sto facendo qualche ricerca ora, ma se qualcuno vuole aiutare, lo apprezzerei. – webbi

risposta

8

Ok, finalmente l'ho fatto, quindi posterò qui la mia soluzione, quindi abbiamo qualcosa di chiaro su questo.

ho usato una libreria chiamata 'ESCAPI': http://sol.gfxile.net/escapi/index.html

Questo fornire un modo estremamente facile da catturare fotogrammi dal dispositivo. Con questi dati grezzi, creo solo un QImage che successivamente verrà mostrato in una QLabel.

Ho creato un oggetto semplice per gestirlo.

#include <QDebug> 
#include "camera.h" 

Camera::Camera(int width, int height, QObject *parent) : 
    QObject(parent), 
    width_(width), 
    height_(height) 
{ 
    capture_.mWidth = width; 
    capture_.mHeight = height; 
    capture_.mTargetBuf = new int[width * height]; 

    int devices = setupESCAPI(); 
    if (devices == 0) 
    { 
     qDebug() << "[Camera] ESCAPI initialization failure or no devices found"; 
    } 
} 

Camera::~Camera() 
{ 
    deinitCapture(0); 
} 

int Camera::initialize() 
{ 
    if (initCapture(0, &capture_) == 0) 
    { 
     qDebug() << "[Camera] Capture failed - device may already be in use"; 
     return -2; 
    } 
    return 0; 
} 

void Camera::deinitialize() 
{ 
    deinitCapture(0); 
} 

int Camera::capture() 
{ 
    doCapture(0); 
    while(isCaptureDone(0) == 0); 

    image_ = QImage(width_, height_, QImage::Format_ARGB32); 
    for(int y(0); y < height_; ++y) 
    { 
     for(int x(0); x < width_; ++x) 
     { 
      int index(y * width_ + x); 
      image_.setPixel(x, y, capture_.mTargetBuf[index]); 
     } 
    } 
    return 1; 
} 

E il file di intestazione:

#ifndef CAMERA_H 
#define CAMERA_H 

#include <QObject> 
#include <QImage> 
#include "escapi.h" 

class Camera : public QObject 
{ 
    Q_OBJECT 

public: 
    explicit Camera(int width, int height, QObject *parent = 0); 
    ~Camera(); 
    int initialize(); 
    void deinitialize(); 
    int capture(); 
    const QImage& getImage() const { return image_; } 
    const int* getImageRaw() const { return capture_.mTargetBuf; } 

private: 
    int width_; 
    int height_; 
    struct SimpleCapParams capture_; 
    QImage image_; 
}; 

#endif // CAMERA_H 

E 'così semplice, ma solo a scopo esemplificativo. L'uso dovrebbe essere qualcosa di simile:

Camera cam(320, 240); 
cam.initialize(); 
cam.capture(); 
QImage img(cam.getImage()); 
ui->label->setPixmap(QPixmap::fromImage(img)); 

Naturalmente, è possibile utilizzare un QTimer e aggiornare il telaio in QLabel e avrete il video lì ...

Speranza che aiuta! e grazie Nicholas per il tuo aiuto!

+0

Ho dimenticato di menzionare che è necessario inserire lib escapi.dll nella stessa directory della propria app e, naturalmente, aggiungere escapi.cpp ed escapi.h al comando di compilazione. – webbi

+0

Oh wow- questo è meraviglioso! Più facile da seguire rispetto alla mia versione di Actionscript3. Grazie per la condivisione! – FredTheWebGuy

Problemi correlati