c++ - 如何在视频序列中识别一次图像?

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

我使用 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;
}

最佳答案

connect(timer, SIGNAL(timeout()), this, SLOT(processFrameAndUpdateGUI()));
timer->start(5);

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

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

Starts or restarts the timer with a timeout of duration msec milliseconds.

If the timer is already running, it will be stopped and restarted.

你需要一个单次定时器。

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

关于c++ - 如何在视频序列中识别一次图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50292075/

相关文章:

opencv - 在 Pillow/PIL中转换色彩空间

c++ - int 变量的位运算符

没有 typedef 的模板类的 C++ 模板,这可能吗?

qt - QMessageBox::about 可以根据标题长度调整大小吗?

c++ - QByteArray 获取第n个元素的地址

c++ - 如何使用 OpenCV 检测和修复图像中的坏点?

c++ - 具有多重继承的纯虚函数重载和协变返回类型

c++ - 在文件中搜索 printf 语句并替换为字符串值

c++ - MFC 应用程序中的 Qt DLL - 如何使 QDialog *真正* 模态?

c++ - 当我运行曲线匹配代码时,出现错误