Как идентифицировать изображение один раз в видео последовательности? - PullRequest
0 голосов
/ 11 мая 2018

Я распознаю дорожные знаки в режиме реального времени, используя каскад Хаара.Моя веб-камера обнаруживает знак, затем извлекает 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;
}

1 Ответ

0 голосов
/ 11 мая 2018
connect(timer, SIGNAL(timeout()), this, SLOT(processFrameAndUpdateGUI()));
timer->start(5);

функция захвата кадра всегда через каждые 5 мс из-за сигнала timeout()

И таймер всегда работает согласно Timer::start()

Запускает или перезапускает таймер с тайм-аутом длительностью мс миллисекунды.

Если таймер уже работает, он будет остановлен и перезапущен.

Вам нужен таймер для одного выстрела.

// fires only once in 200 ms
QTimer::singleShot(200, this, SLOT(processFrameAndUpdateGUI()));
...