Я просто новичок в OpenCV. Я планирую внедрить детектор валют, используя OpenCV Haar Cascade.
Это скрипт linux, который я использую для создания Haar Cascade xml .
#!/bin/sh
RATIO=0.41
NUMPOS=800
WIDTH=70
FACTOR=5
find ./negative -name '*.jpg' >negatives.dat
find ./positive -name '*.jpg' >positives.dat
# width = 70 , height = 28 using ratio.
perl createsamples.pl positives.dat negatives.dat samples 1000 "opencv_createsamples -bgcolor 0 -bgthresh 0 -maxxangle 1.1 -maxyangle 1.1 maxzangle 0.5 -maxidev 40 -w $WIDTH -h $(expr $WIDTH*$RATIO/1 |bc) "
# python file instead since mergevec c++ is not perfectly compiling.
python mergevec.py -v /home/anoopknr/Desktop/haar/Haar_training/samples -o pos.vec
opencv_traincascade -data data -vec pos.vec -bg negatives.dat -w $WIDTH -h $(expr $WIDTH*$RATIO/1 |bc) -numPos $(expr $NUMPOS*0.85/1 |bc) -numNeg $(expr $FACTOR*$NUMPOS*0.85/1 |bc) -precalcValBufSize 1024 -precalcIdxBufSize 1024 -featureType HAAR
Я сохранил положительные изображения в каталоге положительных , содержит 3 или 4 положительных изображения.
Скрипт работает хорошо, но обнаружение не так точно. Как я могу улучшить производительность?
Пример положительного изображения:
Мой Размер окна равен [70,28] (соотношение выбрано так же, как и для банкноты) . Помогут ли какие-либо изменения в windowSize?
Мой пример кода C ++: -
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main( )
{
Mat image;
image = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
namedWindow( "window1", 1 ); imshow( "window1", image );
// Load currency cascade (.xml file)
CascadeClassifier currency_cascade;
currency_cascade.load( "cascade.xml" );
// Detect currency
std::vector<Rect> currencies;
currency_cascade.detectMultiScale( image, currencies, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(70, 28) );
// Draw recatngle on the detected currencies
for( int i = 0; i < currencies.size(); i++ )
{
Point center( currencies[i].x, currencies[i].y);
rectangle( image, center, Size( currencies[i].x + currencies[i].width,currencies[i].y + currencies[i].height),CV_RGB(0,255,0), 2, 4, 0 );
putText(image,"500 Rupees", center, CV_FONT_HERSHEY_COMPLEX, 0.8, CV_RGB(0,255,0), 1.1);
}
imshow( "Detected currencies", image );
waitKey(0);
return 0;
}
Есть ли какая-либо ошибка в вызове моей функции ниже?
currency_cascade.detectMultiScale( image, currencies, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(70, 28) );
Я дал значение Size(70, 28)
, такое же как windowSize
. Это правильный путь?
Мой текущий выходной сигнал после 14 этапов тренировок: -
Мне нужно избегать этих нежелательных выборов. Какие-либо предложения ?
Заранее спасибо.