2013-03-17 31 views
6

Tôi đang chiến đấu với vấn đề này từ lâu. Tôi không thể mở OpenCV, và tôi đã làm theo rất nhiều hướng dẫn về nó và cách sử dụng trong Qt, vì vậy tôi cảm thấy mệt mỏi và tôi muốn tránh việc sử dụng OpenCV cho việc này.Windows + Qt và cách chụp nguồn cấp dữ liệu webcam mà không có OpenCV

Bây giờ, yêu cầu hoặc câu hỏi của tôi ... Tôi cần hiển thị nguồn cấp dữ liệu webcam (video thời gian thực, không có âm thanh) trong ứng dụng GUI Qt chỉ với một nút: "Chụp nhanh", obviusly, chụp ảnh nguồn cấp dữ liệu hiện tại và lưu trữ nó.

Đó là tất cả.

Có cách nào để thực hiện việc này mà không cần sử dụng OpenCV không?

hệ thống đặc điểm kỹ thuật:

  • Qt 4.8

  • Windows XP 32 bit

  • USB 2.0.1.3M UVC WebCam (một trong những Tôi đang sử dụng hiện nay, cần hỗ trợ khác mô hình quá)

Hy vọng mọi người có thể giúp tôi với điều này vì Tôi bị điên.

Cảm ơn trước!

+1

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. –

+0

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

+0

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

Trả lời

8

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!

+0

Tôi quên đề cập đến rằng bạn cần phải đặt lib escapi.dll trong cùng một thư mục của ứng dụng của bạn và, tất nhiên, thêm escapi.cpp và escapi.h vào lệnh biên dịch của bạn. – webbi

+0

Ồ wow- điều này thật tuyệt vời! Dễ theo dõi hơn phiên bản Actionscript3 của tôi. Cám ơn vì đã chia sẻ! – FredTheWebGuy

Các vấn đề liên quan