7

私は長い間この問題と戦っています。私は OpenCV を動作させることができず、それと Qt での使用方法に関する多くのチュートリアルに従っているので、疲れてしまい、これに OpenCV を使用することを避けたいと思っています。

さて、私の要件または質問... Qt GUIアプリケーションでWebカメラフィード(オーディオなしのリアルタイムビデオ)を1つのボタンで表示する必要があります:「スナップショットを撮る」ボタンは、明らかに、現在のフィードから写真を撮り、保管してください。

それで全部です。

OpenCV を使用せずにこれを行う方法はありますか?

システム仕様:

  • Qt 4.8

  • Windows XP 32 ビット

  • USB 2.0.1.3M UVC WebCam (私が現在使用しているもので、他のモデルもサポートするはずです)

私は夢中になっているので、誰かがこれで私を助けてくれることを願っています。

前もって感謝します!

4

1 に答える 1

8

わかりました、ついにやったので、ここに私の解決策を投稿して、これについて明確にします。

「ESCAPI」というライブラリを使用しました: http://sol.gfxile.net/escapi/index.html

これにより、デバイスからフレームをキャプチャするための非常に簡単な方法が提供されます。この生データを使用して、後で QLabel に表示される QImage を作成します。

これを処理するための単純なオブジェクトを作成しました。

#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;
}

そしてヘッダーファイル:

#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

これは非常に単純ですが、例としてのみ使用します。使用は次のようにする必要があります。

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

もちろん、QTimer を使用して QLabel のフレームを更新すると、そこにビデオが表示されます...

それが役立つことを願っています! ニコラスの助けに感謝します!

于 2013-03-29T22:00:04.817 に答える