0

我正在尝试将“ vlc-qt ”连接到“ opencv ”。我正在使用VlcInstanceVlcMedia阅读我的网络摄像机。

据我所知,要使 OpenCV 正常工作,它需要将视频置于 Mat 格式:

videoCapture cap;
Mat frame ;
cap >> frame ; 

但我有它的VlcMedia格式。有没有办法将其转换为 Mat 格式(或作为视频捕获的源),然后将其转换回 VlcMedia 以便能够在 VlcMediaPlayer 中显示它。

我需要它快速(实际上是实时快速:D)。

这是我的代码(我在 Visual Studio 中使用 Qt):

我的头文件:

#ifndef QT_VLC_OPENCV1_H
#define QT_VLC_OPENCV1_H

#include <QtWidgets/QMainWindow>
#include "ui_qt_vlc_opencv1.h"

#include <VLCQtCore\Instance.h>
#include <VLCQtCore\Media.h>
#include <VLCQtCore\MediaPlayer.h>

class qt_vlc_opencv1 : public QMainWindow
{
    Q_OBJECT

public:
    qt_vlc_opencv1(QWidget *parent = 0);
    ~qt_vlc_opencv1();
private slots:
    void on_btnOpenFile_clicked();

private:
    Ui::qt_vlc_opencv1Class ui;

    VlcInstance *_instance;
    VlcMedia *_media;
    VlcMediaPlayer *_player;
};

#endif // QT_VLC_OPENCV1_H

和我的 cpp 文件:

#include "qt_vlc_opencv1.h"

#include <VLCQtCore\Common.h>
#include <qinputdialog.h>

#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
using namespace cv;

qt_vlc_opencv1::qt_vlc_opencv1(QWidget *parent)
: QMainWindow(parent), _media(0)
{
    ui.setupUi(this);

    _instance = new VlcInstance(VlcCommon::args(), this);
    _player = new VlcMediaPlayer(_instance);
    _player->setVideoWidget(ui.video);

    ui.video->setMediaPlayer(_player);
}

qt_vlc_opencv1::~qt_vlc_opencv1()
{
    delete _player;
    delete _media;
    delete _instance;
}

void qt_vlc_opencv1::on_btnOpenFile_clicked()
{
    QString file = QInputDialog::getText(this,tr("Open File"),tr("Enter a file path or a Url"));
    if (file.isEmpty())
        return;

    _media = new VlcMedia(file, true, _instance);
    _player->open(_media);
}
4

1 回答 1

0

在 Qt-vlc 库中有一个 VlcVideoStream 类。VlcVideoStream 设置适当的回调以从 libVLC 获取 YUV 帧。这个类应该是子类并实现 frameUpdated 以指定如何处理框架。在下面的代码中,frameUpdator 是 VlcVideoStream 的一个子类,我已经实现了它的 frameUpdated 函数。例如,您可以通过这种方式实现 frameUpdated:

  void frameUpdator::frameUpdated()
 {
int rows, cols, matType;

// convert to shared pointer to const frame to avoid crash
std::shared_ptr<const VlcYUVVideoFrame> frame = std::dynamic_pointer_cast<const VlcYUVVideoFrame>(renderFrame());

if (!frame) {
    return; // LCOV_EXCL_LINE
}

 //     rows = frame->height + frame->height / 2;
 //     cols = frame->width;
 //     matType = CV_8UC1;
 // 
 //     cv::Mat myuv(rows, cols, matType, (void*)frame->frameBuffer.data());
 //     cv::Mat mrgb(frame->height, frame->width, CV_8UC3);
 //     cv::cvtColor(myuv, mrgb, CV_YUV2RGB_I420);

  int width = frame->width;
  int height = frame->height;

   cv::Mat result = cv::Mat(height, width, CV_8UC1,(void*)frame->frameBuffer.data());
cv::imshow("result", result);
cv::waitKey(2);

   }
于 2019-07-26T10:35:02.597 回答