Сдвиг изображения. OpenCvSharp

Я использую следующий код для смещения изображения:

    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());

Я знаю, что ты можешь сделать это проще. Как?


person T2k    schedule 06.04.2017    source источник


Ответы (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));
person Melnikov Sergei    schedule 28.07.2017
comment
Буду признателен, если вы примете ответ, если он вам помог. - person Melnikov Sergei; 01.08.2017