问题描述
我正在使用 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
}
}
然后输出
但是,这可能会导致多次超时,因为它会在对象离开 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
}