如何使用opencv VideoCapture从Firewire(精确来说是Fire-i 630c)摄像机读取帧

时间:2019-01-17 16:26:30

标签: qt opencv

我正在使用opencv3.4.5,我的相机是Fire-I 630c。我不确定cv :: VideoCapture是否能够从相机读取帧。我尝试输入不同的参数,例如0,cv :: CAP_FIREWIRE,cv :: CAP_IEEE1394,这些参数都不适用于视频捕获。以下是我的代码。

由于未显示调试消息,因此似乎无法识别摄像机。

//This run function is to capture images from the camera and display them in two label Qt widgets. 
void videoProcessorThread::run()
{
    using namespace cv;

    VideoCapture camera(cv::CAP_FIREWIRE);  

    Mat inFrame, outFrame;
    while(camera.isOpened() /*&& !isInterruptionRequested()*/)
    {
        qDebug() << "Camera is opened ....";
        camera >> inFrame;
        if(inFrame.empty())
            continue;

        bitwise_not(inFrame, outFrame); //cv::bitwise_not

        emit inDisplay(
                    QPixmap::fromImage(
                        QImage(
                            inFrame.data,
                            inFrame.cols,
                            inFrame.rows,
                            inFrame.step,
                            QImage::Format_RGB888).rgbSwapped()));

        emit outDisplay(
                    QPixmap::fromImage(
                        QImage(
                            outFrame.data,
                            outFrame.cols,
                            outFrame.rows,
                            outFrame.step,
                            QImage::Format_RGB888).rgbSwapped()));
    }
}

mainwindow.cpp中的代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(&processor, SIGNAL(inDisplay(QPixmap)),
            ui->inVideo, SLOT(setPixmap(QPixmap)));
    connect(&processor, SIGNAL(outDisplay(QPixmap)),
            ui->outVideo, SLOT(setPixmap(QPixmap)));
    processor.start();

}

1 个答案:

答案 0 :(得分:1)

据我了解,您使用的是非常昂贵的基于IEEE-1394的工业相机。该模型没有兼容MS DirectShow的驱动程序,因此很难从OpenCV连接,但是它具有制造商的本地API。我建议您使用DLL包装此API中的某些函数,从基于OpenCV的应用程序中加载此DLL,并逐帧从相机中加载数据。