1

我使用以下代码来移动图像:

    Mat img = Cv2.ImRead(@"C:\building.jpg", ImreadModes.GrayScale);        
    Mat imgout = new Mat();

    Point2f[] src = new Point2f[3];
    src[1] = new Point2f(0, 0);
    src[1] = new Point2f(img.Width-1, 0);
    src[2] = new Point2f(0, img.Height-1);

    Point2f[] dst = new Point2f[3];
    dst[0] = new Point2f(-100, 0);
    dst[1] = new Point2f((img.Width - 1)-100, 0);
    dst[2] = new Point2f(-100, img.Height - 1);


    var m = Cv2.GetAffineTransform(src, dst);
    Cv2.WarpAffine(img, imgout, m, img.Size());

我知道你可以让它变得更容易。如何?

4

1 回答 1

1

仿射变换是相当复杂的操作。可以通过将子矩阵 (roi) 复制到与原始矩阵大小相同的新矩阵来完成简单的移位。

Shift Width 和Height 可以设置为函数的参数。所有操作都可以在三行中完成(读取图像、创建新垫子、将子垫子复制到新垫子),但是将 rois 定义为单独的操作会使代码更清晰。

int shiftWidth = -100;
int shiftHeight = -100;
Mat img = Cv2.ImRead(@"C:\building.jpg", ImreadModes.GrayScale);
Mat imgout = new Mat(img.Size(), img.Type());
OpenCvSharp.Rect sourceRoi = new OpenCvSharp.Rect(Math.Max(-shiftWidth, 0), Math.Max(-shiftHeight, 0), img.Width - Math.Abs(shiftWidth), img.Height - Math.Abs(shiftHeight));
OpenCvSharp.Rect destRoi = new OpenCvSharp.Rect(Math.Max(shiftWidth, 0), Math.Max(shiftHeight, 0), img.Width - Math.Abs(shiftWidth), img.Height - Math.Abs(shiftHeight));
img.SubMat(sourceRoi).CopyTo(imgout.SubMat(destRoi));
于 2017-07-28T15:47:55.397 回答