Précédent   Forum des professionnels en informatique > C et C++ > Bibliothèques > OpenCV
OpenCV Vos questions sur l'API de traitement d'images OpenCV.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2012, 21h23   #1
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Par défaut conversion cvMat vers unsigned char

bonjour à tous

je suis un peu nouvelle sur opencv

j'ai acheté une petite caméra icube (camera usb2) qui permet un trigger externe.

Mais je dois coder la chose pour créer mon fichier vidéo à partir des données envoyées par le SDK accompagnant la caméra.

Cette SDK propose la possibilité de coder une fonction callback lorsque les données de l'image sont lues.

la fonction est signée comme ceci:

Code :
MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
étant BYTE défini dans le windef.h comme:

Code :
typedef unsigned char       BYTE;
Donc j'aimerais savoir comment je dois faire pour convertir cette chaine pointée par ce pointeur char, vers le type cv::Mat afin d'enregistrer les données vers un fichier .avi à l'aide d'OpenCV

j'espère que je suis claire dans ma question et que je trouverai des gens avec plus d'expérience que moi avec cette belle biblio!!!

merci à tous !!!

je viens de trouver un example de quelque chose qui fonctionnerait:

Code :
1
2
3
4
5
6
 
void process_video_frame(const unsigned char* pixels,
                         int width, int height, int step)
{
    cv::Mat img(height, width, CV_8UC3, pixels, step);
   }
est-ce comme cela que je peux faire la conversion?

merci bien à tous
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 12h42   #2
Membre régulier
 
Avatar de GabrielD
 
Homme Gabriel
ingénieur de recherche
Inscription : août 2009
Messages : 50
Détails du profil
Informations personnelles :
Nom : Homme Gabriel
Localisation : France

Informations professionnelles :
Activité : ingénieur de recherche

Informations forums :
Inscription : août 2009
Messages : 50
Points : 75
Points : 75
à priori ça devrait marcher d'après la doc.
GabrielD est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 22h52   #3
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
merci beaucoup de ton aide, je vais regarder tout ça!!!

Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 11h41   #4
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Salut
je reviens vers toi car lorsque je fais la conversion et que j'affiche l'image obtenue j'obtiens une image toute grise.

je fais ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
long CALLBACK MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
{
 
	// NOUVEAU PROCESSUS
	// utilisation de OpenCV pour traiter l'image
	if(bGrabCallback==true)
	{
		cv::Mat imavi(480, 752, CV_8UC3, pBuffer);
 
		// on affiche l'image
		bGrabCallback=false;
		cv::namedWindow("titi");
		cv::imshow("titi",imavi);
	}
	return 42;
}
BYTE est un unsigned char

Je pense que la conversion ne se passe pas bien et je ne sais pas comment faire

si tu pouvais m'aider ou quelqu'un d'autre merci
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 12h49   #5
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Citation:
Envoyé par Garra Voir le message
Salut
je reviens vers toi car lorsque je fais la conversion et que j'affiche l'image obtenue j'obtiens une image toute grise.

je fais ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
long CALLBACK MyCallbackFunc(BYTE * pBuffer, long lBufferSize,PVOID pContext )
{
 
	// NOUVEAU PROCESSUS
	// utilisation de OpenCV pour traiter l'image
	if(bGrabCallback==true)
	{
		cv::Mat imavi(480, 752, CV_8UC3, pBuffer);
 
		// on affiche l'image
		bGrabCallback=false;
		cv::namedWindow("titi");
		cv::imshow("titi",imavi);
	}
	return 42;
}
BYTE est un unsigned char
et d'après ce que je lis dans la doc la data passé par la fonction callback est : Color- camera: 24bit/Pixel (RGB24 Data)

Je pense que la conversion ne se passe pas bien et je ne sais pas comment faire

si tu pouvais m'aider ou quelqu'un d'autre merci
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 15h43   #6
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Re-salut

en fait je viens de me rendre compte de ceci, lorsque je fais:

Code :
1
2
3
4
5
6
7
8
 
cv::Mat mat = cv::Mat(480, 752, CV_8UC3, (void*) pBuffer); 
 
cv::imwrite("titi.bmp", mat);
 
// on affiche l'image
cv::namedWindow("titi");
cv::imshow("titi",mat);
L'image titi.bmp est bien créée avec l'image reçue de la vidéo alors qu'à l'écran avec namedWindow et imshow j'ai une fenêtre toute grise!!

Je suis déjà contente d'obtenir un .bmp mais j'aimerais comprendre

merci de ton aide
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 10h59   #7
Membre éprouvé
 
Homme
Chercheur en informatique
Inscription : avril 2008
Messages : 272
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : avril 2008
Messages : 272
Points : 451
Points : 451
Quand tu veux utiliser les fonctions OpenCV pour les fenêtres, il te faut une boucle infinie avec un cv::waitKey dedans pour actualiser tout le coté GUI.
math_lab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2012, 11h06   #8
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
Bonjour et merci

tu as raison, je me suis rendue compte après que j'étais sur une fonction callback donc "infinie".
Donc c'est pour cela que je ne voyais pas mon image qui était pourtant bien recupérée!!

je te remercie encore et à tous ceux qui ont eu l'amabilité de repondre
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2012, 22h09   #9
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
salut

je reviens à toi car j'ai un truc bizarre:

j'ai ce code :
Code :
1
2
 
if (!g_writer.open(g_fichier_avi,CV_FOURCC('M','P','4','2'),18,cv::Size(752,480),true)) {
Lorsque je lance en mode Debug tout marche nickel, mon fichier .avi est bien enregistré

Par contre lorsque je lance en mode Release donc pointant vers les .dll d'Opencv pour le release, ça plante sur la ligne en rouge du mallloc.c

je comprends bien qu'il s'agit d'un problème mémoire mais quoi??


Code :
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
void * __cdecl _malloc_base (size_t size)
{
    void *res = NULL;

    //  validate size
    if (size <= _HEAP_MAXREQ) {
        for (;;) {

            //  allocate memory block
            res = _heap_alloc(size);

            //  if successful allocation, return pointer to memory
            //  if new handling turned off altogether, return NULL

            if (res != NULL)
            {
                break;
            }
            if (_newmode == 0)
            {
                errno = ENOMEM;
                break;
            }

            //  call installed new handler
            if (!_callnewh(size))
                break;


Pour plus de précision le problème se trouve sur la dll opencv_highgui220.lib:
car si je compile avec ceci (c'est à dire avec la version debug de la dll, opencv_highgui220d.lib), ça marche :

Code :
1
2
3
4
5
 
opencv_core220.lib
opencv_highgui220d.lib
opencv_imgproc220.lib
opencv_features2d220.lib
est-ce que quelqu'un peut me dire pourquoi et qu'est-ce qui me manque?

merci de tout aide qui pourrait m'aider à comprendre le problème
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2012, 21h31   #10
Membre confirmé
 
Inscription : janvier 2006
Messages : 705
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 705
Points : 229
Points : 229
en fait je reviens car il s'agit d'un probleme de codec car en mode release le codec n'est pas trouvé...

bizz
Garra est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h33.


 
 
 
 
Partenaires

Hébergement Web