如何使用opencv检测实时feed中的鼠标点击

How to detect mouse clicks in a live feed using opencv

本文关键字:鼠标 feed 何使用 opencv 检测 实时      更新时间:2023-10-16

我是Opencv的新用户,我正在调试一个简单的程序,该程序会在摄像机的直播流上使用setMouseCallback函数来计算鼠标点击的数量和位置,但是一旦程序开始,它就会被击中,并且由于鼠标的移动而不是点击而更新鼠标点击的位置和数量。我把我的程序包括在下面,如果有人指出错误并给我一个解决方案,我将不胜感激。

#include "opencv2highgui.hpp"
#include "opencv2core.hpp"
#include "opencv2imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define window "LiveFeed"
Mat frame;
void cbmouse(int event, int x, int y, int flags, void*userdata)
{
    static int count = 0;
    char text[] = "count999";
    if (event = EVENT_LBUTTONDOWN)
    {
        while (1)
        {
            circle(frame, Point(x, y), 4, Scalar(0, 0, 255), 2);
            count++;
            sprintf(text, "count%d", count);
            putText(frame, text, Point(x + 5, y + 2), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 0), 2);
            imshow(window, frame);
            if (waitKey(33) == 27)
            break;
        }
    }
    return;
}
int main(int argc, char*argv[])
{
    VideoCapture video(0);
    namedWindow(window);
    while (1)
    {
        video >> frame;
        imshow(window, frame);
        setMouseCallback(window, cbmouse, NULL);
        if (waitKey(33) == 27)
            break;
    }
}

也许你只需要更正if (event == EVENT_LBUTTONDOWN)

但是我做了一些改进。请尝试下面的代码。(我不确定,你想冻结实时饲料当你点击第一次?)

#include "opencv2highgui.hpp"
#include "opencv2core.hpp"
#include "opencv2imgproc.hpp"
using namespace cv;
using namespace std;
#define window "LiveFeed"
Mat frame;
vector<Point> pts;
void drawClickedPoints( Mat img )
{
    for(size_t i = 0; i < pts.size(); i++)
    {
        circle(img, pts[i], 4, Scalar(0, 0, 255), 2);
        putText(frame, format("count%d", i), Point(pts[i].x + 5, pts[i].y + 2), FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 0), 2);
    }
}
void cbmouse(int event, int x, int y, int flags, void*userdata)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        pts.push_back(Point(x,y));
    }
}
int main(int argc, char*argv[])
{
    VideoCapture video(0);
    namedWindow(window);
    setMouseCallback(window, cbmouse, NULL);
    while (1)
    {
        video >> frame;
        drawClickedPoints(frame);
        imshow(window, frame);
        if (waitKey(33) == 27)
            break;
    }
}