Создание пользовательского классификатора каскада Хаара - PullRequest
0 голосов
/ 17 января 2019

Я просто новичок в 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 положительных изображения.

Скрипт работает хорошо, но обнаружение не так точно. Как я могу улучшить производительность?

Пример положительного изображения:

Sample positive image

Мой Размер окна равен [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 этапов тренировок: -

enter image description here

Мне нужно избегать этих нежелательных выборов. Какие-либо предложения ?

Заранее спасибо.

...