как я могу одновременно отображать несколько видео на разных виджетах QT - PullRequest
0 голосов
/ 22 февраля 2012

Я сделал код, который запускает разные алгоритмы OpenCV на разных QWidgets .. поэтому у меня есть 3 вкладки, и на каждой из них должна отображаться прямая трансляция с камеры с обработкой их ... Я делаю захват видео на первой вкладкевиджет и передать его по глобальной ссылке на другие вкладки ... однако я получаю эту проблему

libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

хотя у меня есть только один захват ..

есть идеи?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2012

Я также работаю с OpenCV и Qt. Для эмуляции камеры я использую объект Capture для чтения кадров из видеофайла и отправки их по TCP / IP.

Чтобы сделать ваши фреймы доступными для всех других виджетов, я предлагаю вам создать новый класс, наследующий от QIODevice, инициализировать ваше устройство захвата. Каждый раз, когда вы получаете новый кадр с камеры, вы сохраняете данные в переменную QByteArray и посылаете сигнал readyRead ().

Примечание: - все ваши виджеты должны быть подключены к сигналу readyRead () - как только вы получите новый кадр, не забудьте очистить предыдущие данные - вам нужно заново реализовать функцию virtual qint64 readData( char * data, qint64 maxSize ), чтобы иметь возможность читать ваши данные

как-то так

#include "opencv2/highgui/highgui.hpp"

using namespace cv;

class VideoCaptureDevice : public QIODevice
{
    Q_OBJECT

public:
    VideoCaptureDevice(QObject *parent);
    virtual ~VideoCaptureDevice();

private:
    VideoCapture            m_capture;
    QByteArray      m_receivedData;

protected:
    // from QIODevice
    qint64 writeData(const char * data, qint64 maxSize);
    qint64 readData(char * data, qint64 maxSize);

};
0 голосов
/ 22 февраля 2012

Правильный способ решения этой проблемы - скопируйте кадр, полученный камерой , и сделайте его доступным для других вкладок. Не использовать capture интерфейс!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...