2017-04-06 55 views
1

我用下面的代碼來移動圖像:移位圖像。 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()); 

我知道,你可以更容易。怎麼樣?

回答

0

仿射變換是相當複雜的操作。簡單的轉換可以通過將副矩陣(roi)複製到與原始大小相同的新矩陣來完成。

Shift Width和Height可以設置爲函數的參數。所有的操作都可以在三行中完成(讀取圖像,創建新的mat,將submat複製到新的mat),但將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)); 
+0

我將不勝感激,如果你接受答案,如果它幫助你。 –