仅使用openCV和Qt从嵌入式摄像机接收黑框

时间:2019-07-13 12:57:43

标签: c++ qt opencv camera frames

我正在尝试使用openCV在QT中做一个简单的相机应用程序,但黑框问题。

关键是,当我使用USB摄像头在桌面上运行我的应用程序时,一切似乎都正常运行,我正在获取帧,并且一切都在QGraphicsView中显示。

当我在带有嵌入式摄像头的笔记本电脑中运行我的应用程序时,问题开始了。当我的应用程序运行时,在QGraphicsView上我只能看到黑框。

这是我的代码示例:

首先是我的自定义QGraphicsView:

class CustomGraphicsView : public QGraphicsView
{

    Q_OBJECT

public:
    CustomGraphicsView(QWidget *parent);
    ~CustomGraphicsView();

     void mouseMoveEvent(QMouseEvent *event);
     QGraphicsPixmapItem *pItem;
     QGraphicsScene *pScene;
     QThread *p_worker;
     QTimer *p_timer;
     CustomThread *p_MyCustomThread;

public slots:
     void StartThread();
     void GetFrame(QPixmap);

};
CustomGraphicsView::CustomGraphicsView(QWidget *parent): QGraphicsView(parent)
{
    pScene = new QGraphicsScene(this);
    setScene(pScene);
    pItem = new QGraphicsPixmapItem();
    pItem->setPixmap(pixmap);
    pScene->addItem(pItem);
}

void CustomGraphicsView::StartThread()
{
    p_worker = new QThread();
    p_MyCustomThread = new CustomThread();
    p_MyCustomThread->moveToThread(p_worker);
    connect(p_worker, SIGNAL(started()), p_MyCustomThread,SLOT(StartCamera()));
    connect(p_MyCustomThread, SIGNAL(SendImage(QPixmap)), this, SLOT(GetFrame(QPixmap)));
    p_worker->start();
}

void CustomGraphicsView::GetFrame(QPixmap pix)
{
    pItem->setPixmap(pix);
    pScene->update();
}

这是我的班级,可以接收来自摄像机的帧,将其转换为QPixmap并使用SIGNAL / SLOT发送到QGraphicsView。

class CustomThread : public QObject
{

    Q_OBJECT

public:
    CustomThread();
    VideoCapture cam;
    Mat frame;
    void RunTaking();

public slots:
    void StartCamera();


signals:
    void SendImage(QPixmap);

};

void CustomThread::RunTaking()
{
    while(1)
    {
        cam >> frame;
        cvtColor(frame, frame, CV_BGR2RGB);
        QImage image = QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
        QPixmap pix = QPixmap::fromImage(image);
        emit SendImage(pix);
    }
}

void CustomThread::StartCamera()
{
    if(cam.open(0))
    {
        RunTaking();
    }
}

我试图对标签做同样的事情,没有自定义类,但是没有任何效果。

也许我做错了什么?如果有人知道解决方案,我将不胜感激。

在此先感谢您的回答!

0 个答案:

没有答案