Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Мультимедиа _ Захват видео с IP-камеры

Автор: ONIX 15.5.2014, 20:09

Здравствуйте! Хочу на qt сделать программку для подключения к ip-камере. Простенькую, чтобы только к камере по ip подключалась и всё.
Не получается реализовать её в оконном режиме, получается только путём создания консольного приложения через Qt-creator.
Помогите пожалуйста переделать её из консольной в виджетную. Не судите строго, только начал работать с QT.

Вот код программы на C++

#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>


using namespace std;
using namespace cv;

int main()
{
    VideoCapture cap("http://192.168.0.101:8080/video?x.mjpeg"); //change this URL according to your camera
    if (!cap.isOpened())
    {
        cout << "could not capture";
        return 0;
    }

    Mat frame;
    namedWindow("IPcamera", 1);
    char key = 'a';

    while(key != 27)
    {
        cap.grab();
        cap.retrieve(frame);
        imshow("IPcamera", frame);
        key = waitKey(10);
    }

    destroyAllWindows();
    return 0;
}

Автор: igor_bogomolov 16.5.2014, 10:26

Посмотри этот ролик http://youtu.be/0ONxIy8itRA

Автор: ONIX 16.5.2014, 22:34

Цитата(igor_bogomolov @ 16.5.2014, 10:26) *
Посмотри этот ролик http://youtu.be/0ONxIy8itRA

Спасибо, ролик действительно подробно показывает процесс создания подобного приложения. Сделал всё по образцу, но выскакивает огромная куча ошибок. Я так понял дело в том, что на ролике используется Qt 4, а у меня Qt5. Пытался переделать, но ничего не вышло. Мне бы с этого ролика хотя бы взять вывод с камеры на экран, без обработки с поиском мячика. Может подскажешь, как переделать?

Автор: igor_bogomolov 17.5.2014, 0:20

Там же всё просто.

Раскрывающийся текст
#include "dialog.h"
#include "ui_dialog.h"

#include <QtCore/QDebug>
#include <QtCore/QTimer>

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

    capture.release();
    if (!capture.open(0)) {
        qWarning() << tr("error: capWebCam not accessed successfully");
        return;
    }

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(processFrameAndUpdateGui()));
    timer->start(20);
}

Dialog::~Dialog()
{
    capture.release();
    delete ui;
}

void Dialog::processFrameAndUpdateGui()
{
    if (capture.read(mat)) {
        QImage image((uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        ui->label->setPixmap(QPixmap::fromImage(image));
    }
}
Более подробно смотри во вложении.

 QtTracker3.tar.gz ( 3.59 килобайт ) : 856
 

Автор: ONIX 17.5.2014, 0:22

Нашёл программу, вот только хотелось бы несколько её усовершенствовать.
Хочу чтобы программа не автоматически подключалась по ip-адресу и выводила изображение с камеры.
А чтобы можно было IP-адрес вводить в текстовое поле, и потом уже осуществлялся переход.
Как это реализовать вообще без понятия, ведь в cvCaptureFromFile кроме цифр ip ещё ведь кое что есть.
Помогите пожалуйста!

void MainWindow::createMycamera()
{
    CvCapture *c = cvCaptureFromFile("http://xxx.xxx.x.xxx:xxxx/video?x.mjpeg");
    if (c != NULL) {
        vidcap = new Vidcap(c);
        FrameSize sizeWH;
        sizeWH.width = 640;
        sizeWH.height = 480;
        vidcap->setSize(sizeWH);
        connect(vidcap, SIGNAL(redy(IplImage *)), this, SLOT(ShowNewFrame(IplImage *)));
        vidcap->start();
    }
    else {
        ui->label->setText("Video device not found.");
    }

Автор: igor_bogomolov 17.5.2014, 0:29

Показ у тебя начинается когда ты запускаешь таймер. В твоём случае это vidcap->start(). Пока её не вызовешь, показ не начнётся.
Заведи поле для ввода IP и кнопочку, котороя останавливает и запускает таймер. В общем всё у тебя для реализации есть. Смотри исходники, разбирайся.

Автор: ONIX 17.5.2014, 1:11

Цитата(igor_bogomolov @ 17.5.2014, 0:20) *
Там же всё просто.
Раскрывающийся текст
#include "dialog.h"
#include "ui_dialog.h"

#include <QtCore/QDebug>
#include <QtCore/QTimer>

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

    capture.release();
    if (!capture.open(0)) {
        qWarning() << tr("error: capWebCam not accessed successfully");
        return;
    }

    QTimer *timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(processFrameAndUpdateGui()));
    timer->start(20);
}

Dialog::~Dialog()
{
    capture.release();
    delete ui;
}

void Dialog::processFrameAndUpdateGui()
{
    if (capture.read(mat)) {
        QImage image((uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
        ui->label->setPixmap(QPixmap::fromImage(image));
    }
}
Более подробно смотри во вложении.

Спасибо тебе за помощь! Кстати твой проект сразу запустился, пожалуй буду переделывать именно эту прогу.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)