【问题标题】:record time when an object appears in window记录对象出现在窗口中的时间
【发布时间】:2021-08-03 23:12:15
【问题描述】:

我正在使用 gocv,并且我有一个播放视频的窗口。我已经获取了那个窗口的投资回报率,我知道那里有运动。我已经扩张并将颜色转换为 HSV。我现在可以在我的 ROI 内找到最大的轮廓并在其周围画一个框。

但是,每次检测到对象在窗口内移动时,我都想记录一个时间戳。这并不难,但我只想花 1 次,而不是很多很多,这是目前正在发生的事情。

我的代码目前看起来像

for {
        gocv.GaussianBlur(imgCrop, &imgCrop, blur, 0, 0, gocv.BorderReflect101)
        gocv.CvtColor(imgCrop, &imgCrop, gocv.ColorBGRToHSV)
        thresholded := gocv.NewMat()
        gocv.InRangeWithScalar(imgCrop,
            lhsv,
            hhsv,
            &thresholded)
        gocv.Erode(thresholded, &thresholded, kernel)
        gocv.Dilate(thresholded, &thresholded, kernel)
        const minArea = 500
        cnt, set := bestContour(thresholded, minArea)
        gocv.Line(&imgCrop, image.Pt(0, line), image.Pt(imgCrop.Cols(), line), color.RGBA{255, 0, 0, 0}, 2)
        if set {
            cntBox := gocv.BoundingRect(cnt)
            gocv.Rectangle(&imgCrop, cntBox, blue, 2)
            log.Println("time ", time.Since(startTime))
        }
        // draw it.
        gocv.Rectangle(&img, rect, blue, 3)
        wi.IMShow(img)
        wc.IMShow(imgCrop)
        wt.IMShow(thresholded)
        if wi.WaitKey(1) == 27 || wt.WaitKey(1) == 27 {
            break
        }
}

然后输出

但是,这可能会导致多次超时,因为它会在对象离开 ROI 之前多次检测到相同的运动。每次对象进入 ROI 时,我都试图获得一个时间

我添加了红线,因为我认为可能有一个技巧,我可以检查 cntBox 是否越线或越线,然后阅读,但是我的大脑融合了。

我还想也许我可以在 ROI 内绘制一个矩形并检查蓝色 cntbox 是否进入矩形,但同样的问题....

我注意到有一个使用矩来执行此操作的示例,我尝试过,但是我相信矩也可以进行简单的检测。我想知道时刻是否可以与我现有的代码一起使用。

仅供参考,ROI 中永远只有一个对象。 非常感谢任何帮助。

【问题讨论】:

    标签: opencv go tracker gocv


    【解决方案1】:

    看起来你共享了一个函数,而我只能复制部分代码,所以我的语法被关闭了。所以我会详细说明...

    我认为您每秒抓取许多帧,并且对象不会在单个帧的范围内进入和离开您的 ROI,因此您想过滤掉任何在您的 ROI 中具有“命中”的连续帧?

    我添加了一个变量“timestampbuffer”,它只是一个计数器,每次在您的 ROI 中发生“命中”时,它都会倒计时,一旦它完全倒计时(30 帧,如果您是(希望如此)将是一秒)这么快的时钟帧)将重置,您现在最多只能每秒发送一次时间戳。

    请记住,我编程的时间不长,但我已经完成了一些 YOLO 视频捕捉工作,所以虽然这听起来很原始;它确实有效。

    #add a "buffer" for your calls to grab a timestamp. the buffer delays the calls to write a timestamp
    timeStampBuffer=30
            gocv.GaussianBlur(imgCrop, &imgCrop, blur, 0, 0, gocv.BorderReflect101)
            gocv.CvtColor(imgCrop, &imgCrop, gocv.ColorBGRToHSV)
            thresholded := gocv.NewMat()
            gocv.InRangeWithScalar(imgCrop,
                lhsv,
                hhsv,
                &thresholded)
            gocv.Erode(thresholded, &thresholded, kernel)
            gocv.Dilate(thresholded, &thresholded, kernel)
            const minArea = 500
            cnt, set := bestContour(thresholded, minArea)
            gocv.Line(&imgCrop, image.Pt(0, line), image.Pt(imgCrop.Cols(), line), color.RGBA{255, 0, 0, 0}, 2)
            if set {
                cntBox := gocv.BoundingRect(cnt)
                gocv.Rectangle(&imgCrop, cntBox, blue, 2)
                if timeStampBuffer=30:
                    log.Println("time ", time.Since(startTime))
                else if timeStampBuffer=0:
                    timeStampBuffer=31
                timeStampBuffer-=1
            }
            // draw it.
            gocv.Rectangle(&img, rect, blue, 3)
            wi.IMShow(img)
            wc.IMShow(imgCrop)
            wt.IMShow(thresholded)
            if wi.WaitKey(1) == 27 || wt.WaitKey(1) == 27 {
                break
            } 
    

    【讨论】:

    • 嘿感谢您的回复,我编辑了原始问题以显示每帧发生的循环。结果,我在代码中修改了您的答案,它确实有效,但是我必须调整等待的帧数。我确实想知道是否有更强大的方法来做到这一点 - 这依赖于在分配的帧数内没有发生的两个运动。我希望跟踪机制可能会起作用?
    猜你喜欢
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多