Qt и ip camera. Возможные пути решения

161
15 ноября 2021, 13:10

Подскажите возможные пути решения с qt, то есть с выводом в в виджет. Камера так же имеет возможности управления зумом, просто вывести данные с помощью vlc либы не подойдет. Буду рад каждому предложения.

Answer 1

IP камера - нетривиальная задача, нужно снифить трафик и попытаться провести реверс-инжиниринг API. Учитывайте, что подобное решение не будет универсальным и сработает только с конкретной моделью ip-камеры конкретного производителя конкретной прошивки.

Универсальным решением является применение ВЕБ камеры в сочетании с библиотекой OpenCV, так как она реализует абстракцию для захвата видео. Данный пример написан на python, но не составит труда переписать его на C++

import cv2
def show_webcam(mirror=False):
    cam = cv2.VideoCapture(0)
    while True:
        ret_val, img = cam.read()
        if mirror: 
            img = cv2.flip(img, 1)
        cv2.imshow('my webcam', img)
        if cv2.waitKey(1) == 27: 
            break  # esc to quit
    cv2.destroyAllWindows()
def main():
    show_webcam(mirror=True)
if __name__ == '__main__':
    main()

Для вывода видео с камеры можно покадрово транслировать Mat в QPixmap, приводя его к unsigned char* массиву, как сделано тут.

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QDialog *dialog = new QDialog();
    QLabel *label = new QLabel(dialog);
    FrameBroadcast *cast = new FrameBroadcast();
    QObject::connect(cast, &FrameBroadcast::frameCaptured, [=](const QSharedPointer<Frame> &frame) {
        int w = static_cast<int>(frame.data()->width);
        int h = static_cast<int>(frame.data()->height);
        QImage img(frame.data()->buffer,w,h,QImage::Format_RGBA8888);
        label->setPixmap(QPixmap::fromImage(img));
        label->resize(w,h);
        qDebug() << "Update";
    });
    cast->startCapture();
    dialog->show();
    return app.exec();
}
READ ALSO
Что означают запятые в функцях cin и cout?

Что означают запятые в функцях cin и cout?

Сегодня я случайно написал в cin следующее:

168
Как динамичски заполнить QListView

Как динамичски заполнить QListView

В приложении есть QListView с именем listView1, который нужно заполнить из основного кода окна - maincpp

96
Как работает часть программы?

Как работает часть программы?

Не могу понять как он работает, что делают cinpeek(), !(cin >> a), cin

208
C++ Динамический Массив

C++ Динамический Массив

Не очень понимаю как реализовать динмассив на CPP

157