ecc align testing
This commit is contained in:
18
cmd/test.go
18
cmd/test.go
@@ -1,8 +1,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"github.com/airbusgeo/godal"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/spf13/cobra"
|
||||
@@ -29,10 +27,20 @@ var testCmd = &cobra.Command{
|
||||
}
|
||||
|
||||
mv := gocv.Split(*input0_mat)
|
||||
for i := 0; i < len(mv); i++ {
|
||||
out := producer.CV_Sobel(mv[i])
|
||||
utils.SavePanToGDALGTiff(out, 0, 0, "data/temp/out_"+strconv.Itoa(i)+".tif", 1.3)
|
||||
// for i := 0; i < len(mv); i++ {
|
||||
// out := producer.CV_Sobel(mv[i])
|
||||
// utils.SavePanToGDALGTiff(out, 0, 0, "data/temp/out_"+strconv.Itoa(i)+".tif", 1.3)
|
||||
// }
|
||||
for i := 1; i < len(mv); i++ {
|
||||
mv[i] = producer.CV_ECCAlign(mv[0], mv[i])
|
||||
}
|
||||
|
||||
out := gocv.NewMat()
|
||||
mv[0].ConvertTo(&mv[0], gocv.MatTypeCV16U)
|
||||
gocv.Merge(mv, &out)
|
||||
utils.SaveBGRToGDALGTiff(out, 4, 0, 0, 5.2,
|
||||
[]godal.ColorInterp{godal.CIBlue, godal.CIGreen, godal.CIRed, godal.CIUndefined},
|
||||
"data/temp/ecc.tif")
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user