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!
Ci sono alcune opzioni elencate qui: http://stackoverflow.com/questions/1259192/webcam-access-in-c ma l'API 'DirectShow' è probabilmente quella che funzionerà meglio. –
Cr * p ... Cerco e cerco in modo da non duplicare una domanda, ed eccolo ... Grazie Nicholas – webbi
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