Windows + Qt以及如何在没有OpenCV的情况下捕捉networking摄像头

我很长时间以来一直在与这个问题斗争。 我无法使OpenCV工作,并且我已经遵循了很多关于它的教程以及如何在Qt中使用,所以我感到厌倦,我想避免使用OpenCV。

现在,我的要求或问题…我需要在一个Qt GUI应用程序中显示一个摄像头源(实时video,没有audio),只有一个button:“Take Snapshot”,显然,从当前的饲料拍照,存储它。

就这样。

反正有没有使用OpenCV来完成这个任务?

系统规格:

  • Qt 4.8

  • Windows XP 32位

  • USB 2.0.1.3M UVC WebCam(我现在使用的那个,它也应该支持其他型号)

希望有人能帮助我,因为我疯了。

提前致谢!

好的,我终于做到了,所以我会在这里发表我的解决方案,所以我们对此有清楚的了解。

我使用了一个名为“ESCAPI”的库: http ://sol.gfxile.net/escapi/index.html

这提供了一个非常简单的方法来捕捉设备的帧。 有了这些原始数据,我只需创建一个QImage,然后在QLabel中显示。

我创建了一个简单的对象来处理这个。

 #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中的帧,你将有视频…

希望它有帮助! 感谢尼古拉斯的帮助!