package vision import ( "fmt" ) // StreamProcessor 定义帧处理器函数 type StreamProcessor func(frame *Canvas, frameIndex int) error // ProcessVideoFrames 模拟视频帧处理 (通过一系列图片或自定义逻辑) // 这是一个为未来视频流处理预留的语义化接口 func ProcessVideoFrames(totalFrames int, provider func(int) (*Canvas, error), processor StreamProcessor) error { for i := 0; i < totalFrames; i++ { frame, err := provider(i) if err != nil { return fmt.Errorf("provider failed at frame %d: %w", i, err) } if err := processor(frame, i); err != nil { return fmt.Errorf("processor failed at frame %d: %w", i, err) } } return nil } // DiffFrames 计算两帧之间的差异 (简单运动检测基础) func DiffFrames(prev, curr *Canvas) float64 { pImg := prev.dc.Image() cImg := curr.dc.Image() bounds := pImg.Bounds() w, h := bounds.Dx(), bounds.Dy() var diffTotal uint64 // 采样计算 for y := 0; y < h; y += 4 { for x := 0; x < w; x += 4 { pr, pg, pb, _ := pImg.At(x, y).RGBA() cr, cg, cb, _ := cImg.At(x, y).RGBA() dr := int(pr>>8) - int(cr>>8) dg := int(pg>>8) - int(cg>>8) db := int(pb>>8) - int(cb>>8) if dr < 0 { dr = -dr } if dg < 0 { dg = -dg } if db < 0 { db = -db } diffTotal += uint64(dr + dg + db) } } // 归一化差异百分比 maxDiff := uint64(w/4 * h/4 * 255 * 3) if maxDiff == 0 { return 0 } return float64(diffTotal) / float64(maxDiff) }