Я распознаю дорожные знаки в режиме реального времени, используя каскад Хаара.Моя веб-камера обнаруживает знак, затем извлекает frameROI, сохраняет изображение в файл, а затем я хочу распознать это изображение, используя SVM, классификатор k-NN и т. Д. (Это еще не сделано).Но проблема в том, что знак захватывается несколько раз.Как это решить?Я провел исследование и нашел решение, которое соответствует шаблону .Но как именно я должен использовать эту функцию, чтобы перестать воспринимать frameROI знака, который был когда-то обнаружен?Я новичок, поэтому, пожалуйста, поймите.
Mat sign;
Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
{
ui->setupUi(this);
capWebcam.open(0);
if (capWebcam.isOpened() == false) {
QMessageBox::critical(this, tr("Błąd"), tr("brak kamerki"));
return;
}
QTimer *timer = new QTimer;
connect(timer, SIGNAL(timeout()), this,
SLOT(processFrameAndUpdateGUI()));
timer->start(5);
}
void Dialog::processFrameAndUpdateGUI()
{
CascadeClassifier tsr_cascade;
tsr_cascade.load("a.xml");
Mat image;
Mat image2;
Mat frameROI;
capWebcam.read(image);
cvtColor(image, image2, CV_BGR2GRAY);
equalizeHist(image2, image2);
vector<Rect>znaki;
tsr_cascade.detectMultiScale(image2, znaki, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_SCALE_IMAGE, Size(30, 30));
for (size_t i = 0; i < znaki.size(); i++)
{
Point pt1(znaki[i].x + znaki[i].width, znaki[i].y + znaki[i].height);
Point pt2(znaki[i].x, znaki[i].y);
rectangle(image, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);
frameROI = image(Rect(znaki[i].x, znaki[i].y, znaki[i].width, znaki[i].height));
sign = frameROI;
}
imwrite("znak.jpg", sign);
QPixmap s = ("znak.jpg");
QImage qimg((uchar*)image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
QImage qimg2((uchar*)frameROI.data, frameROI.cols, frameROI.rows, frameROI.step, QImage::Format_RGB888);
ui->label_3->setPixmap(QPixmap::fromImage(qimg2));
ui->label->setPixmap(QPixmap::fromImage(qimg));
ui->label_2->setPixmap(s);
}
Dialog::~Dialog()
{
delete ui;
}