IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Afficher un flux de caméra IP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 74
    Par défaut Afficher un flux de caméra IP
    Bonjour,

    Je cherche a pouvoir viusaliser l'image d'une caméra ip sur mon proggramme.

    J'ai déja effectué des recherches, et voila ce que j'ai trouvé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QWebView view = new QWebView(parent);
            view.load(new QUrl("ip camera 's ip and forwarded port no"));
            view.show();
    mais hélas, sans résultats positifs.

    Ensuite, j'ai trouvé un autre bout de code, le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    void DetectionDlg::connexion()
    {
        http = new QHttp();
        imgInit = new QFile();
        img = new QPixmap();
     
        /* Construction de l'entete HTTP */
        //QHttpRequestHeader header( "GET", "htpp://192.168.2.5/cgi-bin/video.jpg" );
        //header.setValue( "Host", "192.168.2.5" );
        //header.setValue( "Authorization", "Basic dXNlcjp1c2Vy" );
     
        QHttpRequestHeader header( "GET", "/dotclear/themes/qtfr2/img/qt4.png" ); /* Test */
        header.setValue( "Host", "www.lesite.org" ); /* Test */
     
        /* Connexion au serveur HTTP de la camera et recuperation de l'image*/
        //http->setHost( "192.168.2.5" );
        http->setHot( "www.lesite.org" ); /* Test */
     
        connect(http, SIGNAL(done(bool)), this, SLOT(recupImg()));
     
       /* delete http;
        delete imgInit;
        delete img;
        */
    }
     
    void DetectionDlg::recupImg()
    {
        /* Envoi de l'entete HTTP */
        http->request( header );
     
        /* Reception du fichier video.jpg */
        //http->get("htpp://192.168.2.5/cgi-bin/video.jpg");
     
        http->get("http://www.lesite.org/dotclear/themes/qtfr2/img/qt4.png"); /* Test */
     
        /* Recuperation de l'image en RAM */
        img->loadFromData(http->readAll());
     
        /* Affichage de l'image sur l'IHM */
        Qpix_imgCam->setPixmap(*img);
     
        delete http;
        delete imgInit;
        delete img;
    Et quand je fait ceci, il me dit cette erreur ci:

    QHttp: no suck file or directory.

    Je le remplace donc par QNetworkAccessManager, et toujours la même erreur.

    J'ai aussi regardé le tuto sur le protocole http, mais je n'arrive pas a l'adapter a mon cas.

    Donc ma question est: comment faire pour afficher le flux d'une caméra ip sur mon ihm ?


    Merci d'avance pour votre aide.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Pour afficher le flux d'une caméra IP, j'ai opté pour l'intégration d'OpenCV, bibliothèque douée pour ça. Par contre si le flux est du MJPEG, j'avais dû modifier les sources d'OpenCV (ffmpeg) pour que cela fonctionne, si c'est ton cas je partagerai le code ici. Précise un peu plus techniquement ce que tu cherches à afficher, c'est vague "une caméra IP".

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 74
    Par défaut
    Ba je cherche a pouvoir visualiser ce que voit la caméra sur mon programme.
    Au lieu, de voir sur le navigateur via son adresse ip.

    Je veut bien ton code oui, pour voir.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Ce n'est pas ça, "techniquement". Le flux que tu cherches à afficher est en quel format ? Tu as le choix entre plusieurs ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 74
    Par défaut
    Le flux que je cherche a afficher est: M-JPEG et MPEG-4

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Le principe c'est de faire un "cliché" depuis la caméra grâce à OpenCV, et de convertir l'image renvoyée en un format affichage par Qt dans un QLabel par exemple. Si tu fais ça toutes les 25ms, tu as une vidéo...

    qcameralabel.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #ifndef QCAMERALABEL_H
    #define QCAMERALABEL_H
     
    #include <QLabel>
    #include <QImage>
     
    struct CvCapture;
     
    class QCameraLabel : public QLabel {
            Q_OBJECT
     
        public:
            explicit QCameraLabel( QWidget* parent = 0 );
            ~QCameraLabel();
     
        public slots:
            void run();
            void stop();
     
        protected:
            void timerEvent ( QTimerEvent* );
            void showEvent ( QShowEvent* );
            void hideEvent ( QHideEvent* );
     
        private:
            CvCapture* m_pCamera;
            QImage m_CurrentImage;
            int m_iIdTimer;
            bool m_bRunningCamera;
    };
     
    #endif // QCAMERALABEL_H
    qcameralabel.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include "qcameralabel.h"
     
    #include "opencv2/core/core_c.h"
    #include "opencv2/highgui/highgui_c.h"
     
    QCameraLabel::QCameraLabel( QWidget* parent ) :
        QLabel ( parent ),
        m_iIdTimer ( 0 ),
        m_bRunningCamera ( false ) // camera désactivée au départ, true pour l'activer
    {
        setAlignment ( Qt::AlignCenter );
     
        m_pCamera = cvCreateFileCapture ( "http://url/vers/camera.mjpg" );
     
        if ( !m_pCamera ) {
            // "Unable to initialize camera, check the url"
        }
    }
     
    QCameraLabel::~QCameraLabel()
    {
        if ( m_pCamera ) {
            cvReleaseCapture ( &m_pCamera );
        }
    }
     
    void QCameraLabel::run()
    {
        if ( isVisible() ) {
            m_iIdTimer = q->startTimer ( 25 );
        }
     
        m_bRunningCamera = true;
    }
     
    void QCameraLabel::stop()
    {
        if ( m_iIdTimer ) {
            killTimer ( m_iIdTimer );
            m_iIdTimer = 0;
            m_bRunningCamera = false;
        }
    }
     
    void QCameraLabel::timerEvent()
    {
        if ( m_pCamera ) {
            IplImage* l_pIplImage = cvQueryFrame ( m_pCamera );
     
            if ( l_pIplImage && l_pIplImage->depth == IPL_DEPTH_8U && l_pIplImage->nChannels == 3 ) {
                const uchar* qImageBuffer = ( const uchar* ) l_pIplImage->imageData;
                m_CurrentImage = QImage ( qImageBuffer, l_pIplImage->width, l_pIplImage->height, QImage::Format_RGB888 ).rgbSwapped();
                setPixmap ( QPixmap::fromImage ( m_CurrentImage ) )
            }
        }
    }
     
    void QCameraLabel::showEvent ( QShowEvent* )
    {
        if ( m_bRunningCamera ) {
            m_iIdTimer = startTimer ( 25 );
        }
    }
     
    void QCameraLabel::hideEvent ( QHideEvent* )
    {
        if ( m_bRunningCamera && m_iIdTimer ) {
            killTimer ( m_iIdTimer );
            m_iIdTimer = 0;
        }
    }
    C'est un code adapté "à la main" pour ici, j'espère que je n'ai pas fait d'erreur. C'est un exemple d'implémentation, la partie importante étant la gestion de m_pCamera dans le timerEvent.

    Edit : Je t'ai aussi parlé de sources OpenCV à patcher, car pour le format MJPEG c'est bugué (en tout cas dans la version 2.3.1 d'OpenCV, tu compareras avec ta version). Dans les sources d'OpenCV, c'est le fichier modules\highgui\src\cap_ffmpeg_impl.hpp, y'a qu'une méthode à modifier, c'est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    bool CvCapture_FFMPEG::open( const char* _filename )
    {
        unsigned i;
        bool valid = false;
     
        close();
     
        /* register all codecs, demux and protocols */
        av_register_all();
     
    #ifndef _DEBUG
        // av_log_level = AV_LOG_QUIET;
    #endif
     
        //int err = av_open_input_file(&ic, _filename, NULL, 0, NULL);
        AVInputFormat* iformat = av_find_input_format("mjpeg");
        int err = av_open_input_file(&ic, _filename, iformat, 0, NULL);
        if (err < 0) {
                CV_WARN("Error opening file");
                goto exit_func;
        }
        ic->iformat = iformat;
        err = av_find_stream_info(ic);
        if (err < 0) {
                CV_WARN("Could not find codec parameters");
                goto exit_func;
        }
        for(i = 0; i < ic->nb_streams; i++) {
    #if LIBAVFORMAT_BUILD > 4628
            AVCodecContext *enc = ic->streams[i]->codec;
    #else
            AVCodecContext *enc = &ic->streams[i]->codec;
    #endif
     
            avcodec_thread_init(enc, get_number_of_cpus());
     
            #if LIBAVFORMAT_BUILD < CALC_FFMPEG_VERSION(53, 4, 0)
                #define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
            #endif
     
            if( AVMEDIA_TYPE_VIDEO == enc->codec_type && video_stream < 0) {
                AVCodec *codec = avcodec_find_decoder(enc->codec_id);
                if (!codec ||
                avcodec_open(enc, codec) < 0)
                goto exit_func;
                video_stream = i;
                video_st = ic->streams[i];
                picture = avcodec_alloc_frame();
     
                rgb_picture.data[0] = (uint8_t*)malloc(
                                        avpicture_get_size( PIX_FMT_BGR24,
                                        enc->width, enc->height ));
                avpicture_fill( (AVPicture*)&rgb_picture, rgb_picture.data[0],
                        PIX_FMT_BGR24, enc->width, enc->height );
     
                frame.width = enc->width;
                frame.height = enc->height;
                frame.cn = 3;
                frame.step = rgb_picture.linesize[0];
                frame.data = rgb_picture.data[0];
                break;
            }
        }
     
        if(video_stream >= 0) valid = true;
     
        // perform check if source is seekable via ffmpeg's seek function av_seek_frame(...)
        /*err = av_seek_frame(ic, video_stream, 10, 0);
        if (err < 0)
        {
            filename=(char*)malloc(strlen(_filename)+1);
            strcpy(filename, _filename);
            // reopen videofile to 'seek' back to first frame
            reopen();
        }
        else
        {
            // seek seems to work, so we don't need the filename,
            // but we still need to seek back to filestart
            filename=NULL;
            int64_t ts    = video_st->first_dts;
            int     flags = AVSEEK_FLAG_FRAME | AVSEEK_FLAG_BACKWARD;
            av_seek_frame(ic, video_stream, ts, flags);
        }*/
    exit_func:
     
        if( !valid )
            close();
     
        return valid;
    }
    Ensuite pour recompiler, c'est dans 3rdparty\ffmpeg, tu lances le make.bat .

    Au niveau des dépendances du projet, tu dois le livrer avec les dll core et gui d'OpenCV (opencv_core231.dll et opencv_highgui231.dll pour la v2.3.1), et donc avec opencv_ffmpeg.dll que tu as recompilé.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2013, 18h18
  2. Afficher un flux d'images à partir d'une caméra IP
    Par FlorianDeParis dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2013, 00h01
  3. [Java 1.5] Process : afficher le flux de sortie
    Par Zapan dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 11/01/2006, 10h34
  4. Afficher un flux
    Par bolo dans le forum ASP
    Réponses: 1
    Dernier message: 13/11/2005, 18h30
  5. [XSL] Afficher un flux XML
    Par minimoi1234 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 18/02/2005, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo