FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Problème avec openCV

Mon Feb 04, 2013 10:23 pm

Bonsoir,

Mon but est de détecter un mouvement à l'aide des librairies proposées par OpenCV. Voici mon algorithme:

- capture PHOTO1
- PHOTO1 convertie en PHOTO_NB1 (NB -> N&B)
- capture PHOTO2
- PHOTO2 convertie en PHOTO_NB2
- soustraction de PHOTONB1 et PHOTONB2 = PHOTOS_SOUST
- binaisation de PHOTO_SOUST = BIT_PHOTO
- comptage du nombre de pixel blanc
- si nombre pixel blancs > SEUIL, alors mouvement

C'est mon algorithme qui est présenté assez succintivement.

Mon problème vient du fait que j'ai des erreur de mémoire (RAM surchargée?), je fait mes ReleaseImage à la fin mais rien a faire, et encore, c'est pire car mon programme ne fait q'un tour dans ma bloucle WHILE(1).. Quelqu'un pourrait-il m'aiguiller?

Voici mon code:

Code: Select all

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <time.h>
#include <stdio.h>
#include <ctype.h>

//int PixelsCount(IplImage *bitimage)   {

//int i,j,k=0;

//int height=bitimage->height;
//int width=bitimage->width;
//int step=bitimage->widthStep;
//int

//}

int main() {

	CvCapture *capture;
	
	int x=0,y=0;
	float WhitePixelCounter = 0;
	float PixelRatio = 0;
	CvScalar pixel;
	

	while(1){
		CvCapture *pCapturedImage = cvCreateCameraCapture(0);
		
		IplImage *pSavedImage1 = cvQueryFrame(pCapturedImage);
		if(!pCapturedImage){
			printf("BREAK1");
			break;
		}	

		IplImage *GreyImage1 = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		//cvCvtColor(pSavedImage1,GreyImage1,CV_RGB2GRAY);
		
		//cvReleaseCapture( &pCapturedImage);
		//cvErode(GreyImage1,GreyImage1,NULL,1);
		//cvSaveImage("Test1.jpg",GreyImage1,0);


		//CvCapture *pCapturedImage = cvCreateCameraCapture(0);
		IplImage *pSavedImage2 = cvQueryFrame(pCapturedImage);
		if(!pCapturedImage){
			printf("BREAK2");
			break;
		}
		
		IplImage *GreyImage2 = cvCreateImage(cvGetSize(pSavedImage2),8,1);
		cvCvtColor(pSavedImage2,GreyImage2,CV_RGB2GRAY);
		cvReleaseCapture( &pCapturedImage);

		//cvErode(GreyImage2,GreyImage2,NULL,1);
		//cvSaveImage("Test2.jpg",GreyImage2,0);
		
		IplImage *ImageDiff = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		cvAbsDiff(GreyImage1,GreyImage2,ImageDiff);

		//cvSaveImage("ImageDiff.jpg",ImageDiff,0);
		
		
// seuillage
		IplImage *BitImage = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		cvThreshold(ImageDiff,BitImage,50,255,CV_THRESH_BINARY);
		//cvSaveImage("BitImage.jpg",BitImage,0);
		PixelRatio = 0;
		for(x=0 ; x < BitImage->height ; x++)
		{
			for( y=0 ;y < BitImage->width ; y++)
			 {
				pixel = cvGet2D(BitImage,x,y);

				if(pixel.val[0] == 255)
				{
					WhitePixelCounter = WhitePixelCounter + 1;
					//printf("PixelCount = %f \n", WhitePixelCounter);
				}

		  	} //FOR width
		
		} //FOR heigth
		
		PixelRatio = (WhitePixelCounter/307200)*100;
		printf("Il y a %f /100 de pixel blancs \n", PixelRatio);
		
	cvReleaseImage(&pSavedImage1);
	cvReleaseImage(&pSavedImage2);
	cvReleaseImage(&GreyImage1);
	cvReleaseImage(&GreyImage2);
	cvReleaseImage(&ImageDiff);
	cvReleaseImage(&BitImage); 

} //WHILE

	return 0;

} // MAIN

En vous remerciant par avance

Bonne soirée à tous ! :)

nikotinux
Posts: 564
Joined: Sat Feb 02, 2013 2:11 am

Re: Problème avec openCV

Tue Feb 05, 2013 2:08 am

peut etre un peu 'lourd' comme librairie pour le raspberry ?
une autre voie ...
http://www.imagemagick.org/Usage/compare/
?

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Tue Feb 05, 2013 7:34 am

Lourd je ne sais pas car OpenCV a déjà été porter sur Raspberry PI. Mais le problème est identique sous un Linux PC(j'ai testé sur Debian sur mon PC, et l'OS sur Raspberry est Raspbian)

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Tue Feb 05, 2013 8:13 am

Voici l'erreur:

"Bad argument (unrecognized or unsupported array type) in cvReleaseData"

nikotinux
Posts: 564
Joined: Sat Feb 02, 2013 2:11 am

Re: Problème avec openCV

Tue Feb 05, 2013 6:21 pm

je ne connais pas OpenCV mais je vais surement me pencher dessus.

j'ai essayé de brancher une webcam sur le raspberry (via un hub usb) en espérant faire tourner motion (cd http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome )
j'ai voulu bien sur tester la cam avec guvcview et j'ai eu un freeze après 2 ou 3 trames. dmesg m'a retourné des flopées d'erreurs sur le bus usb et je n'ai pas eu le temps d'aller plus loin ...

un truc m'interpelle avec ton programme :
CvCapture *pCapturedImage = cvCreateCameraCapture(0);
ça doit a priori initialiser la connexion a la camera ...
donc cette ligne ne devrait pas être dans la boucle while mais avant !

nikotinux
Posts: 564
Joined: Sat Feb 02, 2013 2:11 am

Re: Problème avec openCV

Tue Feb 05, 2013 9:13 pm

de plus ta boucle ne me semble pas optimisée, j'aurais fait un truc du genre:

capture PHOTO_REF
traitement PHOTO_REF

while {
(petit delai d'attente ...)
capture PHOTO_COURANTE
traitement PHOTO_COURANTE

comparaison PHOTO_COURANTE, PHOTO_REF
si != gerer le mouvement

PHOTO_REF = PHOTO_COURANTE
}

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Wed Feb 06, 2013 8:11 am

D'accord, je vais tester ta solution :)

totoharibo
Posts: 3295
Joined: Thu Jan 24, 2013 8:43 am

Re: Problème avec openCV

Wed Feb 06, 2013 10:46 am

motion ne ferait pas tout ça?
(pas testé sur Rpi)

nikotinux
Posts: 564
Joined: Sat Feb 02, 2013 2:11 am

Re: Problème avec openCV

Wed Feb 06, 2013 5:15 pm

motion devrait le faire mais je suis resté a mon problème de blocage de ma webcam ...
une solution alternative est toujours bonne a prendre !

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Wed Feb 06, 2013 8:35 pm

Voici mon code avec l'algorithme proposé ci-dessus:

Code: Select all

#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include <time.h>
#include <stdio.h>
#include <ctype.h>


int main() {

	CvCapture *capture;
	
	int x=0,y=0;
	float WhitePixelCounter = 0;
	float PixelRatio = 0;
	CvScalar pixel;
	IplImage *pSavedImage1 =;
	IplImage *GreyImage1;
	IplImage *pSavedImage2;
	IplImage *GreyImage2;
	IplImage *ImageDiff;
	IplImage *BitImage;

	CvCapture *pCapturedImage = cvCreateCameraCapture(0);
		
		pSavedImage1 = cvQueryFrame(pCapturedImage);
		if(!pCapturedImage){
			printf("BREAK1");
			//break;
		}	

		GreyImage1 = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		cvCvtColor(pSavedImage1,GreyImage1,CV_RGB2GRAY);
		cvReleaseCapture( &pCapturedImage);
		//cvErode(GreyImage1,GreyImage1,NULL,1);
		//cvSaveImage("Test1.jpg",GreyImage1,0);

	while(1){
		

		CvCapture *pCapturedImage = cvCreateCameraCapture(0);
		pSavedImage2 = cvQueryFrame(pCapturedImage);
		if(!pCapturedImage){
			printf("BREAK2");
			break;
		}
		
		GreyImage2 = cvCreateImage(cvGetSize(pSavedImage2),8,1);
		cvCvtColor(pSavedImage2,GreyImage2,CV_RGB2GRAY);
		cvReleaseCapture( &pCapturedImage);

		//cvErode(GreyImage2,GreyImage2,NULL,1);
		//cvSaveImage("Test2.jpg",GreyImage2,0);
		
		ImageDiff = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		cvAbsDiff(GreyImage1,GreyImage2,ImageDiff);

		//cvSaveImage("ImageDiff.jpg",ImageDiff,0);
		
		
// seuillage
		BitImage = cvCreateImage(cvGetSize(pSavedImage1),8,1);
		cvThreshold(ImageDiff,BitImage,50,255,CV_THRESH_BINARY);
		//cvSaveImage("BitImage.jpg",BitImage,0);
		PixelRatio = 0;
		for(x=0 ; x < BitImage->height ; x++)
		{
			for( y=0 ;y < BitImage->width ; y++)
			 {
				pixel = cvGet2D(BitImage,x,y);

				if(pixel.val[0] == 255)
				{
					WhitePixelCounter = WhitePixelCounter + 1;
					//printf("PixelCount = %f \n", WhitePixelCounter);
				}

		  	} //FOR width
		
		} //FOR heigth
		
		PixelRatio = (WhitePixelCounter/307200)*100;
		printf("Il y a %f /100 de pixel blancs \n", PixelRatio);
		WhitePixelCounter = 0;

	pSavedImage1 = cvCloneImage(pSavedImage2);
		
	//cvReleaseImage(&pSavedImage1);
	//cvReleaseImage(&pSavedImage2);
	//cvReleaseImage(&GreyImage1);
	//cvReleaseImage(&GreyImage2);
	//cvReleaseImage(&ImageDiff);
	//cvReleaseImage(&BitImage); 

} //WHILE

	return 0;

} // MAIN


Mais voici l'erreur retournée:
OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /home/morbiducci/OpenCV-2.3.1/modules/core/src/array.cpp, line 1238
terminate called after throwing an instance of 'cv::Exception'
what(): /home/morbiducci/OpenCV-2.3.1/modules/core/src/array.cpp:1238: error: (-5) Array should be CvMat or IplImage in function cvGetSize
Je ne comprends pas et sur internet pu de réponses à ce problème :s. Je n'ai pourtant rien ajouter de plus.

=> AU SECOUR !! :s :s

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Wed Feb 06, 2013 8:37 pm

Concernant motion, c'est un outils semblable à OpenCV ? (avec des fonctions deja toutes faites etc...)

FaAabioOo
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm

Re: Problème avec openCV

Wed Feb 06, 2013 9:03 pm

J'ai tester motion, mais je n comprends pas, on l'execute et il ne fait que prendre des cliché avec la webcam :s

nikotinux
Posts: 564
Joined: Sat Feb 02, 2013 2:11 am

Re: Problème avec openCV

Wed Feb 06, 2013 10:42 pm

l'erreur a lieu quand ?
erreur de compilation sur ton raspberry ?
ou tu as essayé de compiler sur un desktop ?
ou est-ce une erreur d'execution sur le raspberry ou sur un desktop ?

je ne sais pas trop comment t'aider vu que je ne connais pas cette librairie ...
j'ai essayé de regarder la doc sur ce qui me semble le site officiel de cette lib ( http://opencv.org ) mais je ne trouve pas les mêmes API ...

concernant motion ce programme permet certes de visualiser et controler a distance une ou plusieurs cam mais aussi de détecter des mouvements et de réagir. tout ce définit dans un fichier de configuration avec de nombreuses options très complètes.
j'attends la disponibilité du module de camera annoncé par la fondation pour me relancer dans mes tests sur ce programme.

Return to “Français”

Who is online

Users browsing this forum: No registered users and 0 guests