Hi
I am trying to detect mosquitoes on images using Haar Cascade and it doesn't work.
I use ~200 images of walls (to use as negative images) and ~20 images of mosquitoes.
I did this :
1) I run the script below to resize the negative images (100x100 ) :
[karim@10-83-102-17 haar]$ more resize.py
import cv2
import os
pic_num=0
for img in os.listdir('/home/karim/perso/moustiques/haar/downloads/wall'):
print img
timg = cv2.imread('/home/karim/perso/moustiques/haar/downloads/wall/'+img,cv2.IMREAD_GRAYSCALE)
resized_image = cv2.resize(timg, (100, 100))
cv2.imwrite("negatif/"+str(pic_num)+".jpg",resized_image)
pic_num=pic_num+1
[karim@10-83-102-17 haar]$ ls negatif/* > negatif.txt
2) I run the script below to generate positive images :
[karim@10-83-102-17 haar]$ more samplepos.sh
#!/bin/bash
mkdir -p info
# create the samples
for file in downloads/9*.jpg; do
echo "File=" $file
opencv_createsamples -img "$file" -bg negatif.txt -info "info/info_$file.da"t -pngoutput info -maxxangle 0.5 -maxyangle -0.5 -maxzangle 0.5 -num 125
done
mv info/info_downloads/* info
# generate the sample file
touch temp
for file in info/*.dat; do
echo "File="$file
cat temp "$file" >> ./info/info.dat
done
# generate the sample vector
opencv_createsamples -info info/info.dat -vec positif.vec -w 25 -h 18 -num 2000
3) Then, I train the classifier
[karim@10-83-102-17 haar]$ more train.sh
#!/bin/bash mkdir -p data # train the classifier using haar cascade features opencv_traincascade -data data -vec positif.vec -bg negatif.txt -numStages 10 -numPos 1800 -numNeg 900 -w 25 -h 18 -mode ALL -precalcValBuffSize 1024 -precalcIdxBuffSize 1024 mv ./data/cascade.xml .
It runs a couple of hours.
4) If I run the classifier on a mosquito image, I have the attached image
[karim@10-83-102-17 haar]$ more verif.py
import cv2
from matplotlib import pyplot as plt
img=cv2.imread('img_mous.jpg')
imggris = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgrgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
FiltreMoustique=cv2.CascadeClassifier("/home/karim/perso/moustiques/haar/cascade.xml")
moustique=FiltreMoustique.detectMultiScale(imggris,scaleFactor=1.1,minNeighbors=4,minSize=(20,20))
n=len(moustique)
if n!=0:
for (x,y,w,h) in moustique:
cv2.rectangle(imgrgb,(x,y),(x+h,y+w),(0,255,0),5)
plt.subplot(1,1,1)
plt.imshow(imgrgb)
plt.show()
I got scripts from internet and I modified them for my use. I am probably doing something wrong ... Thanks for any advice.
Karim
