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

  1. #1
    Membre du Club
    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
    Points : 59
    Points
    59
    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 du Club
    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
    Points : 59
    Points
    59
    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 du Club
    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
    Points : 59
    Points
    59
    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 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
    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 du Club
    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
    Points : 59
    Points
    59
    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