2017-04-06 41 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は、関数のパラメータとして設定できます。すべての操作は3行で行うことができます(イメージの読み込み、新しいマットの作成、新しいマットへのサブマートのコピー)。しかし、別の操作として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

私があなたを助けた場合に回答を受け入れると感謝します。 –

関連する問題