Result issues with findContours
Hi all !
I'm kind of new to opencv, and on top of that, I'm french, so, sorry =) I'm using opencv 2.4.1 with visual studio 2008 and i'm having issues with my detection program. I've an image on which there are fishes that I want to detect. I do all the stuff to have an image on which I can work (threshold, dilate, erode...)and then I use Canny and findContours, this is when it gets weird : There are 5 fishes on the image, but the message tells me there are 12404 fishes oO 12404 corresponds to contours.size() Just before, I draw those "contours", and I can clearly see my 5 fishes with their contour drawn in red. So why do I have those 5 drawn contours, but 12404 fishes ?! I'v spent so many time searching and trying anything else but unsuccessfully. Here is the part of my code corresponding :
//**Edges detection
Canny (imde,imcanny,75,150,3);
imshow("cont",imcanny);
cvWaitKey();
//**Contours finding and drawing = way number 1
static vector'<'vector'<'Point'>'> contours; //There ar no '' around < in my code,
//it's just for you to see (html code hides what's in '<>')
findContours(imcanny,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
drawContours(immat,contours,-1,CV_RGB(255,0,0),2);
//**Récupération et affichage du nombre de poissons détectés
char msg[20];
sprintf(msg, "Found %d fishes",contours.size());
printf(msg);
//putText(imcanny,msg,cvPoint(2,12),FONT_HERSHEY_SIMPLEX, 0.4, CV_RGB(255,0,0));
imshow("cont",immat);
cvWaitKey();
I don't know what I'm doing wrong, I've used exactly what is used in the "coins counting" tutorial so... Thanks a lot for your help Tell me if you need to see another part of my code, or the images maybe, and I'll edit =) Thanks
EDIT 1 :
Here is what I do to the image just before Canny :
//**Lissage de l'image
medianBlur(immat,immat,5);
imshow("binaire",immat);
cvWaitKey();
//**Binarisation de l'image
threshold(immat,imthresh,75,255,CV_THRESH_BINARY);
imshow("binaire",imthresh);
cvWaitKey();*
//**Dilatation de l'image
int dilatation_size=1; //dilatation max=21
Mat element=getStructuringElement(MORPH_RECT, Size(2*dilatation_size+1,2*dilatation_size+1), Point(dilatation_size,dilatation_size));
dilate(imthresh,imde,element);
imshow("dne",imde);
cvWaitKey();
//**Erosion de l'image
int erosion_size=1; //erosion max=21
Mat elementt=getStructuringElement(MORPH_RECT, Size(2*erosion_size+1,2*erosion_size+1), Point(erosion_size,erosion_size));
erode(imde,imde,elementt);
imshow("dne",imde);
cvWaitKey();
EDIT 2
Here are some images :
The very first one, taken from a video :
The one after "cvtcolor" & "medianblur" :
The one after "threshold", "dilate" & "erode" :
The one after "findcontours" and "drawcontours" (bold black) with CV_RETR_LIST :
And the one after "findcontours" and "drawcontours" (bold black) if I use CV_RETR_EXTERNAL instead of CV_RETR_LIST :
In both case I've got my lovely message "found 12404 fishes", this value doesn't change whatever I do...
Thanks for your help =)