【发布时间】: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 中永远只有一个对象。 非常感谢任何帮助。
【问题讨论】: