Я целый день тренировал свой компьютер с opencv_traincascade
обнаруживать монеты номиналом 2 евро, используя более 6000 позитивных изображений, подобных следующему:
Теперь я только что попытался запустить простую программу OpenCV, чтобы увидеть результаты и проверить файл cascade.xml
. Конечный результат очень разочаровал:
На монете много точек, но есть и много других точек на фоне. Может ли быть проблема с моими положительными изображениями, используемыми для обучения? Или, может быть, я использую detectMultiScale()
с неправильными параметрами?
Вот мой код:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int, char**) {
Mat src = imread("2c.jpg", CV_LOAD_IMAGE_COLOR);
Mat src_gray;
std::vector<cv::Rect> money;
CascadeClassifier euro2_cascade;
cvtColor(src, src_gray, CV_BGR2GRAY );
//equalizeHist(src_gray, src_gray);
if ( !euro2_cascade.load( "/Users/lory/Desktop/cascade.xml" ) ) {
printf("--(!)Error loading\n");
return -1;
}
euro2_cascade.detectMultiScale( src_gray, money, 1.1, 0, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, cv::Size(10, 10),cv::Size(2000, 2000) );
for( size_t i = 0; i < money.size(); i++ ) {
cv::Point center( money[i].x + money[i].width*0.5, money[i].y + money[i].height*0.5 );
ellipse( src, center, cv::Size( money[i].width*0.5, money[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}
//namedWindow( "Display window", WINDOW_AUTOSIZE );
imwrite("result.jpg",src);
}
Я также попытался уменьшить количество соседей, но эффект тот же, только с меньшим количеством точек... Может ли быть проблемой тот факт, что на позитивных изображениях есть эти 4 угла в качестве фона вокруг монеты? Я сгенерировал png-изображения с помощью Gimp из снятого видео, показывающего монету, поэтому я не знаю, почему opencv_createsamples
ставит эти 4 угла.