我有一个简单的程序,可以从网络摄像头中读取帧,并将指针放在goroutine的通道上。另一部分从通道读取帧指针并将它们弹出到另一个队列。然后,这个其他队列对它们进行一些额外的处理,并且当完成这个额外的处理时,分配一堆内存,显然永远不会被垃圾收集。我正在试图找出原因:
此函数以循环方式从通道中读取帧:
func (mr *OpenCVMotionRunner) Run() error {
log.Println("Starting motion detection... ")
// inMotion := false
win := opencv.NewWindow("GoOpenCV: VideoPlayer")
defer win.Destroy()
test := mr.md.(*CV2FrameDiffMotionDetector)
for {
f := mr.imageChan.PopFrame()
mr.frame = nil
switch f := f.(type) {
default:
return fmt.Errorf("Unknown frame type")
case *BSFrame:
mr.frame = f.ToOpenCVFrame()
case *OpenCVFrame:
mr.frame = f
}
f = nil
test.SetCurrent(mr.frame)
delta := test.Delta()
// win.ShowImage(mr.frame.image)
if delta != nil {
win.ShowImage(delta)
opencv.WaitKey(1)
} else {
fmt.Println("wtf")
}
}
return nil
}
有问题的部分似乎是具体的:
mr.frame = f.ToOpenCVFrame()
这是类型和方法:
// Frame with byte slice image
type BSFrame struct {
image []byte
Time time.Time
Width uint32
Height uint32
}
func (f *BSFrame) ToOpenCVFrame() *OpenCVFrame {
img := opencv.DecodeImageMem(f.image)
return &OpenCVFrame{
image: img,
Time: f.Time,
Width: f.Width,
Height: f.Height,
}
}
这是目的地类型:
type OpenCVFrame struct {
image *opencv.IplImage
Time time.Time
Width uint32
Height uint32
}
PopFrame,FYI,只是一种对通道别名的类型的方法:
type BSFrameChan chan *BSFrame
func (fc BSFrameChan) PopFrame() (frame Frame) {
frame = <-fc
return
}
希望这是解决问题的足够代码。如果需要,剩下的就是here。
答案 0 :(得分:0)
go library I'm using for the OpenCV bindings在图像上提供Release
方法,以便在完成图像时释放内存。这解决了这个问题。