58 lines
1.4 KiB
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)
|
|
}
|