Golang中gocv的normalize函数使用方法

Golang中gocv的normalize函数使用方法 大家好,我在使用 gocv 的 Normalize 函数时遇到了问题。文档中该函数的定义如下。

func Normalize(src Mat, dst *Mat, alpha float64, beta float64, typ NormType)

我在代码中调用它,但得到了一个段错误。你能帮我修复这个调用吗?

package main

import (
	"./imageprocessing"
	"gocv.io/x/gocv"
	// "fmt"

)
/** CovarFlags
// CovarScrambled indicates to scramble the results.
CovarScrambled CovarFlags = 0

	// CovarNormal indicates to use normal covariation.
	CovarNormal CovarFlags = 1

	// CovarUseAvg indicates to use average covariation.
	CovarUseAvg CovarFlags = 2

	// CovarScale indicates to use scaled covariation.
	CovarScale CovarFlags = 4

	// CovarRows indicates to use covariation on rows.
	CovarRows CovarFlags = 8

	// CovarCols indicates to use covariation on columns.
	CovarCols CovarFlags = 16

**/

func main() {

	var size int

	var normtype gocv.NormType = gocv.NormMinMax

	size  = imageprocessing.FolderLength("./imageprocessing/Images/danger")

	Images := make([]gocv.Mat,size)

	GLCMs := make([]gocv.Mat,size)

	normalizedGLCMs := make([]gocv.Mat,size)

	means := make([]gocv.Mat,size)

	imageprocessing.ReadFolder(Images,"./imageprocessing/Images/danger",true,false,false)

	//GroupGLCM(Images []gocv.Mat, GLCMs []gocv.Mat, means []gocv.Mat, show bool)
	imageprocessing.GroupGLCM(Images, GLCMs, means, false)

	//func Normalize(src Mat, dst *Mat, alpha float64, beta float64, typ NormType)
	//min value of dst is alpha and max value of dst is beta
	for i := 0; i < size; i++ {
		gocv.Normalize(GLCMs[i], &normalizedGLCMs[i], 0.0, 255.0, normtype )
		//imageprocessing.ShowImage("normalizedGLCMs", normalizedGLCMs[i], 100)
	}
}

更多关于Golang中gocv的normalize函数使用方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中gocv的normalize函数使用方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在调用 gocv.Normalize 时出现段错误,通常是因为目标矩阵 dst 没有正确初始化。gocv.Normalize 要求目标矩阵必须是已分配内存的有效矩阵。以下是修复后的代码示例:

package main

import (
    "gocv.io/x/gocv"
)

func main() {
    // 假设这是你的GLCM矩阵
    src := gocv.NewMat()
    defer src.Close()
    
    // 目标矩阵必须初始化
    dst := gocv.NewMat()
    defer dst.Close()
    
    // 正确调用Normalize
    gocv.Normalize(src, &dst, 0.0, 255.0, gocv.NormMinMax)
}

在你的具体代码中,需要确保 normalizedGLCMs 切片中的每个矩阵都已初始化:

// 初始化normalizedGLCMs切片中的每个矩阵
normalizedGLCMs := make([]gocv.Mat, size)
for i := 0; i < size; i++ {
    normalizedGLCMs[i] = gocv.NewMat()
}

// 现在可以安全调用Normalize
for i := 0; i < size; i++ {
    gocv.Normalize(GLCMs[i], &normalizedGLCMs[i], 0.0, 255.0, normtype)
}

// 使用完毕后记得释放资源
defer func() {
    for i := 0; i < size; i++ {
        normalizedGLCMs[i].Close()
    }
}()

如果 GLCMs[i] 是空矩阵或无效,也会导致段错误。确保 imageprocessing.GroupGLCM 正确填充了 GLCMs 切片:

// 在调用Normalize前检查矩阵是否有效
for i := 0; i < size; i++ {
    if GLCMs[i].Empty() {
        // 处理空矩阵情况
        continue
    }
    gocv.Normalize(GLCMs[i], &normalizedGLCMs[i], 0.0, 255.0, normtype)
}

完整修复示例:

func main() {
    var normtype gocv.NormType = gocv.NormMinMax
    size := imageprocessing.FolderLength("./imageprocessing/Images/danger")

    Images := make([]gocv.Mat, size)
    GLCMs := make([]gocv.Mat, size)
    normalizedGLCMs := make([]gocv.Mat, size)
    means := make([]gocv.Mat, size)

    // 初始化所有目标矩阵
    for i := 0; i < size; i++ {
        normalizedGLCMs[i] = gocv.NewMat()
    }

    imageprocessing.ReadFolder(Images, "./imageprocessing/Images/danger", true, false, false)
    imageprocessing.GroupGLCM(Images, GLCMs, means, false)

    for i := 0; i < size; i++ {
        if !GLCMs[i].Empty() {
            gocv.Normalize(GLCMs[i], &normalizedGLCMs[i], 0.0, 255.0, normtype)
        }
    }

    // 清理资源
    defer func() {
        for i := 0; i < size; i++ {
            Images[i].Close()
            GLCMs[i].Close()
            normalizedGLCMs[i].Close()
            means[i].Close()
        }
    }()
}
回到顶部