Problème Opencv c++ segmentation couleur

naz_en_prog Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -  
naz_en_prog Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

j'aurais un problème avec un code que je travaille en ce moment, je suis débutant en programmation :p je cherche à capturer un flux video, le séparer image par image (jusque là c'est bon) et à réaliser un traitement (une segmentation couleur) sur chacune des images et afficher le résultat dans le avc cvShowImage (donc c'est du non stop)

en exécutant le code, j'ai une fenêtre ouverte qui n'affiche qu'un fond gris :(

voici le code :

#include <stdio.h>
#include <iostream>
#include "cv.h"
#include "highgui.h"

IplImage* traitement(IplImage *brgFrame){

//Copies de l'image pour les transformations...
IplImage* seuilFrame = cvCreateImage( cvGetSize(brgFrame),IPL_DEPTH_8U , 1 );
IplImage* hsvFrame = cvCreateImage( cvGetSize(brgFrame), IPL_DEPTH_8U, 3 );

//Conversion BGR -> HSV
cvCvtColor( brgFrame, hsvFrame, CV_BGR2HSV );

//Retourne l'image par rapport à X si nécessaire
cvFlip( hsvFrame, NULL, 0); //0 = axe X

//Pour chaque pixel...
for(int y = 0; y < (cvGetSize(hsvFrame).height); y++)
{
for(int x = 0; x < (cvGetSize(hsvFrame).width); x++)
{
//...si HSV entre les seuils max et min...
if(
//test minH (=0)
((hsvFrame->imageData + hsvFrame->widthStep*y))[x*3] > 0 &&
//test maxH (=50)
((hsvFrame->imageData + hsvFrame->widthStep*y))[x*3] < 50 &&
//test minS (=100)
(hsvFrame->imageData + hsvFrame->widthStep*y)[(x*3)+1] >100
)
//...placer un point blanc dans l'image « seuils ».
( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 255;
//Sinon, placer un point noir.
else
( seuilFrame->imageData + seuilFrame->widthStep*y)[x] = 0;
}
} //fin des boucles

//libérer l'espace des images
cvReleaseImage( &hsvFrame );
cvReleaseImage( &seuilFrame );

return seuilFrame;
}


int main()
{

// Touche clavier
char key;
// Image
IplImage *image;
IplImage *img_res;
// Capture vidéo
CvCapture *capture;

// Ouvrir le flux vidéo
capture = cvCreateFileCapture("C:/Users/toshiba/Desktop/P3A/moto_test.mp4"); // chemin pour un fichier
//capture = cvCreateCameraCapture(CV_CAP_ANY);

// Vérifier si l'ouverture du flux est ok
if (!capture)
{

printf("Ouverture du flux vidéo impossible !\n");
return 1;

}

// Définition de la fenêtre
cvNamedWindow("GeckoGeek Window", CV_WINDOW_AUTOSIZE);

// Boucle tant que l'utilisateur n'appuie pas sur la touche q (ou Q)
while(key != 'q' && key != 'Q')
{

// On récupère une image
image = cvQueryFrame(capture);

// application du traitement
img_res = traitement(image);

//test des dimensions au cas où :ss
int taille1X=cvGetSize(image).width;
int taille1Y=cvGetSize(image).height;

int taille2X=cvGetSize(img_res).width;
int taille2Y=cvGetSize(img_res).height;

printf("taille de image originale = %d %d ", taille1X, taille1Y);
printf("*********************************************");
printf("taille de image resultat = %d %d ", taille2X, taille2Y);

// On affiche l'image dans une fenêtre
cvShowImage( "GeckoGeek Window", img_res);

// On attend 10ms
key = cvWaitKey(10);

}

cvReleaseCapture(&capture);
cvDestroyWindow("GeckoGeek Window");

return 0;

}

et voilà le message affiché après l'exe :

[mov,mp4,m4a,3gp,3g2,mj2 @ 0x4cf960]multiple edit list entries, a/v desync might
occur, patch welcome
OpenCV Error: Bad argument (Array should be CvMat or IplImage) in unknown functi
on, file ..\..\..\..\ocv\opencv\modules\core\src\array.cpp, line 1237

Process returned 3 (0x3) execution time : 2.433 s
Press any key to continue.


Merci de m'aider sur ce coup parce que je avancer vers d'autres étapes :)

A voir également:

1 réponse

naz_en_prog Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
 
bon déjà une erreur dans mon code, il fallait libérer la mémoire après avoir fait return dans ma fonction traitement. Seulement, même si çà fonctionne maintenant, c'est très lourd et çà coupe parfois, j'ai même eu droit à une alerte "Runtime Error" qui arrête le programme :s
Que devrais-je faire SVP ?
0