Ok, cuối cùng tôi đã làm điều đó, vì vậy tôi sẽ đăng ở đây giải pháp của tôi để chúng tôi có một cái gì đó rõ ràng về điều này.
tôi đã sử dụng một thư viện gọi là 'ESCAPI': http://sol.gfxile.net/escapi/index.html
này cung cấp một cách rất dễ dàng để nắm bắt khung hình từ thiết bị. Với dữ liệu thô này, tôi chỉ tạo ra một QImage mà sau này hiển thị trong một nhãn hiệu.
Tôi đã tạo một đối tượng đơn giản để xử lý việc này.
#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;
}
Và các tập tin tiêu đề:
#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
Đó là đơn giản như vậy, nhưng chỉ dành riêng cho mục đích ví dụ. Việc sử dụng nên được một cái gì đó như:
Camera cam(320, 240);
cam.initialize();
cam.capture();
QImage img(cam.getImage());
ui->label->setPixmap(QPixmap::fromImage(img));
Tất nhiên, bạn có thể sử dụng một QTimer và cập nhật các khung trong QLabel và bạn sẽ có video có ...
Hy vọng nó sẽ giúp! và cảm ơn Nicholas vì sự giúp đỡ của bạn!
Có một vài tùy chọn được liệt kê tại đây: http://stackoverflow.com/questions/1259192/webcam-access-in-c nhưng API 'DirectShow' có thể là những gì sẽ hoạt động tốt nhất. –
Cr * p ... Tôi tìm kiếm và tìm kiếm vì vậy tôi không sao chép một câu hỏi, và ở đó ... Cảm ơn Nicholas – webbi
Vâng, tôi đã đọc về DirectShow về câu hỏi mà bạn trỏ, có vẻ như dễ dàng hoặc gần như tương thích với nhu cầu của tôi, điều này là tôi không thể tìm thấy bất kỳ ví dụ hoàn chỉnh nào về cách tương tác với DirectShow từ Qt. Tôi đang làm một số nghiên cứu bây giờ, nhưng nếu ai đó muốn giúp đỡ, tôi sẽ đánh giá cao nó. – webbi