我只是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个正图像。
脚本运行良好,但是检测不那么准确。我该如何提高性能?
正面图片示例:
我的 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
相同的值。那是正确的方法吗?
我当前的输出:-
我需要避免那些不必要的选择。有什么建议么 ?
谢谢。