【问题标题】:How to identify an image once in a video sequence?如何在视频序列中识别一次图像?
【发布时间】:2018-10-21 20:33:10
【问题描述】:

我使用 haar 级联进行实时交通标志识别。我的网络摄像头检测到一个标志,然后提取 frameROI,将图像保存到文件中,然后我想使用 SVM、k-NN 分类器等识别该图像(尚未完成)。但问题是标志被多次抓取。如何解决这个问题? 我做了一项研究,我找到了一个解决方案是template matching。但是我应该如何使用这个功能来停止拍摄曾经检测到的标志的 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;
}

【问题讨论】:

    标签: c++ qt opencv video-capture haar-classifier


    【解决方案1】:
    connect(timer, SIGNAL(timeout()), this, SLOT(processFrameAndUpdateGUI()));
    timer->start(5);
    

    由于信号timeout(),抓取帧的函数总是每5毫秒超时一次

    并且计时器始终按照Timer::start()运行

    启动或重新启动计时器,超时持续时间为毫秒 毫秒。

    如果计时器已经在运行,它将停止并重新启动。

    你需要一个单次计时器。

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

    【讨论】:

    • 单次计时器如何帮助我?我必须每 5 毫秒刷新一次网络摄像头的帧,因为它是实时识别的。
    • @yoGGieツ,打破你的功能。一个抓取帧,每 5ms 触发一次,一个只触发一次。正如函数名所说,它在一个函数中做两件事。
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 2013-06-07
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2012-04-02
    • 1970-01-01
    相关资源
    最近更新 更多