vision/video.go

58 lines
1.4 KiB
Go

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)
}