ecc align testing

This commit is contained in:
nuknal
2024-10-30 17:56:17 +08:00
parent 0e920ce9f0
commit e51d07901d
4 changed files with 66 additions and 7 deletions

View File

@@ -1,3 +1,54 @@
package producer
import (
"image"
log "github.com/sirupsen/logrus"
"gocv.io/x/gocv"
)
// align the image via Enhanced Correlation Coefficient (ECC) algorithm
func CV_ECCAlign(templateImage, inputImage gocv.Mat) gocv.Mat {
warpMode := gocv.MotionHomography
var warpMatrix gocv.Mat
switch warpMode {
case gocv.MotionHomography:
warpMatrix = gocv.NewMatWithSize(3, 3, gocv.MatTypeCV32FC1)
default:
warpMatrix = gocv.NewMatWithSize(2, 3, gocv.MatTypeCV32FC1)
}
for i := 0; i < warpMatrix.Rows(); i++ {
warpMatrix.SetFloatAt(i, i, 1.0)
}
criteria := gocv.NewTermCriteria(gocv.Count+gocv.EPS, 1000, 0.0001)
var mask = gocv.NewMat()
templateImage.ConvertTo(&templateImage, gocv.MatTypeCV32FC1)
inputImage.ConvertTo(&inputImage, gocv.MatTypeCV32FC1)
log.Info("cv::findTransformECC...")
retval := gocv.FindTransformECC(templateImage, inputImage, &warpMatrix, warpMode, criteria, mask, 5)
log.Info("cv::findTransformECC ret:", retval)
var aligned = gocv.NewMat()
sz := image.Point{inputImage.Cols(), inputImage.Rows()}
if warpMode == gocv.MotionHomography {
gocv.WarpPerspective(inputImage, &aligned, warpMatrix, sz)
} else {
gocv.WarpAffine(inputImage, &aligned, warpMatrix, sz)
}
aligned.ConvertTo(&aligned, gocv.MatTypeCV16U)
templateImage.ConvertTo(&templateImage, gocv.MatTypeCV16U)
inputImage.ConvertTo(&inputImage, gocv.MatTypeCV16U)
return aligned
}
func (r *ImgProc) DoECCAlign() error {
r.registeredMssImages[0] = r.MssImages[0].Clone()
for i := 1; i < len(r.MssImages); i++ {
r.registeredMssImages[i] = CV_ECCAlign(r.registeredMssImages[0], r.MssImages[i])
}
return nil
}

View File

@@ -297,7 +297,7 @@ func (r *ImgProc) doPhaseCorrelation(base gocv.Mat,
mssBlock := mssImages[band].Region(rect)
// 处理每个分块
phaseShift, response := r.calculateBlockPhaseShift(panBlock, mssBlock)
phaseShift, response := CV_PhaseCorrelate(panBlock, mssBlock)
shiftM.dx = phaseShift.X
shiftM.dy = phaseShift.Y
shiftM.response = response

View File

@@ -22,7 +22,7 @@ type Block struct {
coord image.Point // top-left corner of the block in the original image
}
func (r *ImgProc) calculateBlockPhaseShift(panBlock, mssBlock gocv.Mat) (gocv.Point2f, float64) {
func CV_PhaseCorrelate(panBlock, mssBlock gocv.Mat) (gocv.Point2f, float64) {
pan := gocv.NewMat()
mss := gocv.NewMat()