diff --git a/cmd/proc.go b/cmd/proc.go index 1b8cefb..df56fb8 100644 --- a/cmd/proc.go +++ b/cmd/proc.go @@ -84,6 +84,7 @@ var procCmd = &cobra.Command{ reg.SaveRegisteredMssToRaw(registerdMSSRAW) } + runtime.GC() panScenes, mssScenes, err := reg.SubScenes() if err != nil { logrus.Error(err) @@ -92,6 +93,13 @@ var procCmd = &cobra.Command{ reg.SaveScenesToTiff(panScenes, mssScenes) producer.CleanScenes(panScenes) producer.CleanScenes(mssScenes) + + // err := reg.SubScenesLessMem() + // if err != nil { + // logrus.Error(err) + // return + // } + runtime.GC() if saveStrip { diff --git a/pkg/fusion/fusion.go b/pkg/fusion/fusion.go index 7889205..8974cc9 100644 --- a/pkg/fusion/fusion.go +++ b/pkg/fusion/fusion.go @@ -245,8 +245,6 @@ func PansharpenIHS(pan, B, G, R, I gocv.Mat, w float32) gocv.Mat { // 将图像从 HLS 转换回 BGR fusedImage := gocv.NewMat() - - log.Println("cvt color from HLS to BGR") gocv.CvtColor(mssHLS, &fusedImage, gocv.ColorHLSToBGR) channels := gocv.Split(fusedImage) diff --git a/pkg/producer/image_registration.go b/pkg/producer/image_registration.go index e45d011..e7e2c6c 100644 --- a/pkg/producer/image_registration.go +++ b/pkg/producer/image_registration.go @@ -161,6 +161,7 @@ func (r *Registrator) CalcDownPhaseCorrelation() error { // 将PAN将采样作为轮廓匹配基准图像 downsampledPanImage := gocv.NewMat() + defer downsampledPanImage.Close() gocv.Resize(r.PanImage, &downsampledPanImage, image.Point{X: r.MssWidth, Y: r.MssHeight}, 0, 0, gocv.InterpolationCubic) log.Println("down sampled PAN images size:", downsampledPanImage.Size()) @@ -385,6 +386,9 @@ func (r *Registrator) DoCoRegistration() error { gocv.InterpolationCubic, gocv.BorderConstant, color.RGBA{0, 0, 0, 0}) + + mapX.Close() + mapY.Close() } // 裁掉末尾的的 MSS 480 行 和 PAN 的 480*4 行 diff --git a/pkg/producer/scenes.go b/pkg/producer/scenes.go index dc7a9c5..451c785 100644 --- a/pkg/producer/scenes.go +++ b/pkg/producer/scenes.go @@ -6,6 +6,7 @@ import ( "image" "os" "path/filepath" + "runtime" "strings" "github.com/airbusgeo/godal" @@ -88,6 +89,7 @@ func (r *Registrator) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err e matFiltered := rrc.HFNoiseFilter(mat, float64(mat.Cols())*config.GCONFIG.Radiation.HfRadiusRatio) mat.Close() mat = matFiltered + runtime.GC() } if config.GCONFIG.Radiation.SceneMomentMatching { @@ -132,6 +134,7 @@ func (r *Registrator) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err e matFiltered := rrc.HFNoiseFilter(mat, float64(mat.Cols())*config.GCONFIG.Radiation.HfRadiusRatio/4) mat.Close() mat = matFiltered + runtime.GC() } if config.GCONFIG.Radiation.SceneMomentMatching { @@ -149,6 +152,10 @@ func (r *Registrator) SubScenes() (panScenes []*Scene, mssScenes []*Scene, err e err = fmt.Errorf("pan and mss scenes count not match") } + // var b bytes.Buffer + // gocv.MatProfile.WriteTo(&b, 1) + // fmt.Print(b.String()) + return panScenes, mssScenes, err } @@ -201,7 +208,7 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e // 输出 GeoJSON 数据 log.Debug(string(data)) - for i, scene := range mssScenes { + for _, scene := range mssScenes { dir := filepath.Join(r.Params.OutputDir, scene.SceneIndex, "MSS") os.MkdirAll(dir, 0755) @@ -211,6 +218,8 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e r.SetSceneBoundary(scene) rgbirImage, _ := r.MergeMSSToBGRNIR(scene.Mat) + defer rgbirImage.Close() + err := utils.SaveBGRToGDALGTiff(rgbirImage, 4, scene.Meta.Corners.UpperLeft.Longitude, @@ -219,7 +228,6 @@ func (r *Registrator) SaveScenesToTiff(panScenes []*Scene, mssScenes []*Scene) e []godal.ColorInterp{godal.CIBlue, godal.CIGreen, godal.CIRed, godal.CIUndefined}, scene.Tiff) if err != nil { - log.Errorf("save mss scene %d to tiff failed: %v", i+1, err) return err } diff --git a/pkg/rrc/hf_filter.go b/pkg/rrc/hf_filter.go index 1ac74a7..5decf3a 100644 --- a/pkg/rrc/hf_filter.go +++ b/pkg/rrc/hf_filter.go @@ -32,7 +32,9 @@ func HFNoiseFilter(img gocv.Mat, radius float64) gocv.Mat { // 执行 DFT DFT := gocv.NewMat() defer DFT.Close() - gocv.Merge([]gocv.Mat{img32f, gocv.Zeros(rows, cols, gocv.MatTypeCV32F)}, &DFT) + zero := gocv.Zeros(rows, cols, gocv.MatTypeCV32F) + defer zero.Close() + gocv.Merge([]gocv.Mat{img32f, zero}, &DFT) gocv.DFT(DFT, &DFT, gocv.DftComplexOutput) // 中心化频谱 @@ -126,6 +128,8 @@ func fftshift(input *gocv.Mat) { q3 := input.Region(image.Rect(cx, cy, input.Cols(), input.Rows())) // Bottom-Right tmp := gocv.NewMatWithSize(q0.Rows(), q0.Cols(), input.Type()) + defer tmp.Close() + q0.CopyTo(&tmp) q3.CopyTo(&q0) tmp.CopyTo(&q3) @@ -133,6 +137,11 @@ func fftshift(input *gocv.Mat) { q1.CopyTo(&tmp) q2.CopyTo(&q1) tmp.CopyTo(&q2) + + q0.Close() + q1.Close() + q2.Close() + q3.Close() } func visualizeDFT(DFT gocv.Mat, file string) {