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 :

utilisation CvArr*


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut utilisation CvArr*
    Bonjour,

    J'essaie d'utiliser la fonction cvCalcOpticalFlowLK

    oui je sais elle est "deprecated" mais elle a l'air plus simple d'utilisation que cvCalcOpticalFlowPyrLK donc je commence avec elle pour le flot optique
    (grâce à # include <opencv2\legacy\legacy.hpp>)

    voici sa définition :

    void*cvCalcOpticalFlowLK(const CvArr**prev, const CvArr**curr, CvSize*win_size, CvArr**velx, CvArr**vely)

    Calculates the optical flow for two images using Lucas-Kanade algorithm.
    prev*– First image, 8-bit, single-channel
    curr*– Second image, 8-bit, single-channel
    win_size*– Size of the averaging window used for grouping pixels
    velx*– Horizontal component of the optical flow of the same size as input images, 32-bit floating-point, single-channel
    vely*– Vertical component of the optical flow of the same size as input images, 32-bit floating-point, single-channel

    Voici mon code :
    Dans lequel frames est un vector<Mat> qui contient les images d'une video

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	        CvSize winSize = cvSize(20,20);
                    Mat velX = Mat(frames[0].rows,frames[0].cols,CV_32FC1);
    		Mat *velx = &velX;
    		Mat velY = Mat(frames[0].rows,frames[0].cols,CV_32FC1);
    		Mat *vely=&velY;
     
                    cvCalcOpticalFlowLK(&frames[0],&frames[10],winSize,velx,vely);
     
                    imshow("Flot selon x:",*velx);
    Il n'y a pas d'erreur lors de la compilation mais lorsque j’exécute mon cod eil y a un bug qui s'affiche et dans la console est écrit "unsupported array type" in cvGetMat

    Quand j’exécute en mode debug
    * on voit bien que le bug est obtenu lors de l'appel de cvCalcOpticalFlowLK
    * j'obtiens : "Exception de première chance à 0x7c812fd3 (kernel32.dll) dans Open_cv.exe*: Exception Microsoft C++*: cv::Exception à l'emplacement mémoire 0x0011eaa8.."
    * les valeurs de velx : Symbole "velx" introuvable


    J'imagine que j'instancie mal mes variables velx et vely, peut être ne correspondent-elles pas à des CvArr* 32-bit floating-point, single-channel ??

    Merci d'avance pour vos idées,

    Cordialement,

    Ronan

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    Je suis maintenant sûr que mon erreur viens de l'Array*

    J'essaie de convertir une image couleur en niveau de gris avec cvCvtColor et j'obtiens exactement la même erreur que précédemment (ça compile et ça bug exactement pareil) à cause de Image1 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    Mat Image1=Mat();
    		cvCvtColor(&frames[0],&Image1,CV_BGR2GRAY);
     
    		imshow("Image",Image1);

    Même erreur avec le code suivant ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		IplImage *grayScaleImage = cvCreateImage(cvSize(320,240),8,1);
     
    		cvCvtColor(&frames[0],grayScaleImage,CV_BGR2GRAY);
     
    		imshow("Image",*grayScaleImage->imageData);

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    Donc j'ai bien réussi.

    Le problème c'est que j'ai confondu
    cvCvtColor et cv::cvtColor

    La première fonction est une des premières version créé pour le c et fonctionne avec des iplimage

    la seconde est la fonction à jour pour le c++ et fonction avec des Mat
    ceci fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		Mat Image1 = Mat::zeros(frames[0].size(),frames[0].type());
     
    		cvtColor(frames[0],Image1,CV_RGB2GRAY);
     
    		imshow("Image",Image1);

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2012
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 65
    Par défaut
    cvCalcOpticalFlowLK est une fonction de l'API C et tu essayes d'utiliser des cv::Mat, structure de données C++, selon moi c'est normal que tu as cette erreur.
    Il faut utiliser des IplImage si tu veux utiliser cette fonctions, sinon si tu veux conserver tes cv::Mat il faudra utiliser la fonction C++ cv::calcOpticalFlow, ou encore convertir tes cv::Mat en IplImage, quoiqu'il soit il va falloir faire un choix.

    Sinon la fonction cvCalcOpticalFlowPyrLk n'est pas plus compliqué a utilisé.

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2013
    Messages : 75
    Par défaut
    oui c'est bien ce que j'avais compris

    cvCalcOpticalFlowPyrLk est basé sur des "features" alors que moi je voudrais calculer un flot dense

    Je vais ouvrir un poste à ce sujet ^^

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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