记录对象出现在窗口中的时间

问题描述

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

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

我的代码目前看起来像

for {
        gocv.GaussianBlur(imgCrop,&imgCrop,blur,gocv.BorderReflect101)
        gocv.CvtColor(imgCrop,gocv.ColorBGRToHSV)
        thresholded := gocv.NewMat()
        gocv.InRangeWithScalar(imgCrop,lhsv,hhsv,&thresholded)
        gocv.Erode(thresholded,&thresholded,kernel)
        gocv.Dilate(thresholded,kernel)
        const minArea = 500
        cnt,set := bestContour(thresholded,minArea)
        gocv.Line(&imgCrop,image.Pt(0,line),image.Pt(imgCrop.Cols(),color.RGBA{255,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,3)
        wi.imshow(img)
        wc.imshow(imgCrop)
        wt.imshow(thresholded)
        if wi.WaitKey(1) == 27 || wt.WaitKey(1) == 27 {
            break
        }
}

然后输出

enter image description here

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

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

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

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

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

解决方法

您似乎共享了一个函数,而我只能复制部分代码,因此我的语法已关闭。所以我会详细说明一点...

我认为您每秒抓取许多帧,并且对象不会在单个帧的范围内进入和离开您的 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,gocv.BorderReflect101)
        gocv.CvtColor(imgCrop,gocv.ColorBGRToHSV)
        thresholded := gocv.NewMat()
        gocv.InRangeWithScalar(imgCrop,lhsv,hhsv,&thresholded)
        gocv.Erode(thresholded,&thresholded,kernel)
        gocv.Dilate(thresholded,kernel)
        const minArea = 500
        cnt,set := bestContour(thresholded,minArea)
        gocv.Line(&imgCrop,image.Pt(0,line),image.Pt(imgCrop.Cols(),color.RGBA{255,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,3)
        wi.IMShow(img)
        wc.IMShow(imgCrop)
        wt.IMShow(thresholded)
        if wi.WaitKey(1) == 27 || wt.WaitKey(1) == 27 {
            break
        } 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...