自定义Haar级联分类器创建

时间:2019-01-17 02:35:36

标签: c++ opencv object-detection haar-classifier

我只是OpenCV的新手。我打算使用OpenCV Haar Cascade实施货币检测器。

这是我用来创建 Haar Cascade xml 的Linux脚本。

#!/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

我已将正图像保存在 positive 目录中,其中包含3或4个正图像。

脚本运行良好,但是检测不那么准确。我该如何提高性能?

正面图片示例:

Sample positive image

我的 windowSize [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

我需要避免那些不必要的选择。有什么建议么 ?

谢谢。

0 个答案:

没有答案