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

OpenCV Discussion :

enregistrement d'image à partir d'une caméra (opencv)


Sujet :

OpenCV

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 13
    Points
    13
    Par défaut enregistrement d'image à partir d'une caméra (opencv)
    Bonjour,
    je suis débutante avec opencv et j'ai besoin de votre aide pour l'enregistrement des images dans un fichier à partir d'une caméra en entrée( enregistrer une image chaque 10 secondes par exemple), la fonction qui va me permettre de capturer les images est "getImgFromCamera" (décrite ci dessous )mais je sais pas comment l'exploiter pour l'enregistrement des images???

    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
    cv::Mat Acquisition::getImgFromCamera(int resV,int resU)
    {
    	is_GetImageMem(m_hCam,&pMemVoid);
        img->imageData=(char*)pMemVoid;
        img->imageDataOrigin=(char*)pMemVoid;
        cv::Mat res;
        cv::Mat img2=img;
    	cv::Mat imgrgb(img2.rows,img2.cols,DataType<Vec3b>::type);
    	for(int i=0;i<img2.rows;i++)
    	{
    		for(int j=0;j<img2.cols;j++)
    		{
    			imgrgb.at<Vec3b>(i,j)[0]=img2.at<Vec4b>(i,j)[0];
    			imgrgb.at<Vec3b>(i,j)[1]=img2.at<Vec4b>(i,j)[1];
    			imgrgb.at<Vec3b>(i,j)[2]=img2.at<Vec4b>(i,j)[2];
    		}
    	}
        cv::resize(imgrgb,res,cvSize(800,600));
        return(res);
    }
    Merci d'avance

  2. #2
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Pourquoi n'utilises-tu pas la fonction imWrite ? Tu récupères une image depuis ta caméra et tu n'as plus qu'à l'enregistrer avec la fonction.
    Ensuite si tu veux enregistrer toutes les 10 secondes, je dirais à chaud d'utiliser une solution a base de thread et de la fonction sleep.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci bcq Danny-k pour la réponse, je suis débutante et je suis pas sure de ce bout de code pour la fonction imwrite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int _tmain(int argc, char** argv)
    {Acquisition acq;
     
    	char dirImg[10]="Capture/";
    	char nomImg[50];
    	cv::Mat img;
     
    		sprintf_s(nomImg,"%simg-%05d.jpg",dirImg);
    		img=acq.getImgFromCamera(800,600);
     
    		cv::imwrite(file,img);
     
    }
    Est ce que c correct? comment écrire la solution à base de thread et de la fonction sleep ??

    Merci d'avance!

  4. #4
    Membre actif
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Points : 282
    Points
    282
    Par défaut
    Pour une méthode à base de thread, voici une manière de faire, le code est en C++11 :
    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
    #include <iostream>
    #include <thread>
    #include <cstdio>
    #include <opencv2/opencv.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <cstdio>
     
    #define WINDOW "camera"
     
    using namespace std;
     
    void foo(const string & filename, const cv::Mat * frame)
    {
        int compteur = 0;
        string str;
        while(1)
        {
            //wait 10 seconds
            //A noter que cette boucle n'est la que pour afficher le cout, 
            //il suffit tout simplement de l'enlever et de rentrer le temps dans chrono::seconds(nb_seconds) pour attendre la duree souhaite
            for (int i=10; i>0; --i) {
                std::cout << i << '\n';
                std::this_thread::sleep_for (std::chrono::seconds(1));
            }
            str = filename+"-"+to_string(compteur++)+".jpg";
            cv::imwrite(str, *frame);
            cout << "write : "<<str<<endl;
        }
    }
     
    void fun(cv::Mat * frame)
    {
        cv::VideoCapture cap(0);
        if(!cap.isOpened()) // check if we succeeded
        {
            cerr << "probleme ouverture camera"<<endl;
            exit(EXIT_FAILURE);
        }
     
        cv::namedWindow(WINDOW);
        while(1)
        {
            cap.read(*frame);
            cv::imshow(WINDOW, *frame);
            int key = cvWaitKey(2) & 255;
            if('q' == key || 'Q' == key)
                exit(0);
        }
     
    }
     
    int main()
    {
        cv::Mat frame;
     
        std::thread s(fun, &frame);
        std::thread t(foo, "file", &frame);
        s.join();
        t.join();
        return 0;
    }
    La fonction fun(...) ouvre un flux video et lit une frame seconde par seconde, la fonction foo(...) récupère la frame et enregistre l'image.
    Si tu n'as pas accès au C++11 (à cause de thread ou chrono), tu peux utiliser les threads de pthread (si tu es sous Linux), ou tout autre libraire multithread selon la plateforme.
    Enfin l'idée est là.

    Si tu n'as pas accès au C++11 (pour les thread et chrono surtout), si tu es sous Linux, tu peux utiliser la librairie pthread et remplacer chrono par sleep.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci Danny pour votre aide précieuse

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

Discussions similaires

  1. Enregistrer une image prise par une caméra dans ma mémoire interne de mon téléphone
    Par aminata bella dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 14/11/2013, 10h40
  2. [Débutant] Enregistrer image à partir d'une WebBrowser
    Par Enix13 dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/11/2013, 15h45
  3. 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
  4. Réponses: 8
    Dernier message: 10/04/2009, 15h13
  5. Enregistrements multiples renvoyés à partir d'une excécution
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2004, 15h25

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