1. 程式人生 > >C# EMGU 3.4.1學習筆記(十一)示例程式:仿射變換

C# EMGU 3.4.1學習筆記(十一)示例程式:仿射變換

本示例是《OpenCV3程式設計入門》中7.4.5中的示例程式的C# + EMGU 3.4.1版,演示了以WarpAffine和GetRotationMatrix2D函式為核心的對影象進行仿射變換的操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.Util;

namespace warpAffine
{
    class Program
    {
        static void Main(string[] args)
        {
            //【1】引數準備
            //定義兩組點,代表兩個三角形
            PointF[] srcTriangle = new PointF[3];
            PointF[] dstTriangle = new PointF[3];
            //定義一些Mat變數
            Mat warpMat = new Mat(2, 3, DepthType.Cv32F, 1);
            Mat rotMat = new Mat(2, 3, DepthType.Cv32F, 1);
            Mat srcImage = new Mat(), dstImage_warp = new Mat(), dstImage_warp_rotate = new Mat();

            //【2】載入源影象並作一些初始化
            srcImage = CvInvoke.Imread("landscape1.jpg"); //首先確保目錄中存在該圖片
            //設定目標型別的大小和型別與源影象一致
            dstImage_warp = Mat.Zeros(srcImage.Rows, srcImage.Cols, srcImage.Depth, srcImage.NumberOfChannels);

            //【3】設定源影象和目標影象上的三組點以計算用於仿射變換的矩陣
            srcTriangle[0] = new PointF(0, 0);
            srcTriangle[1] = new PointF(srcImage.Cols - 1, 0);
            srcTriangle[2] = new PointF(0, srcImage.Rows - 1);

            dstTriangle[0] = new PointF((float)(srcImage.Cols * 0.0), (float)(srcImage.Rows * 0.33));
            dstTriangle[1] = new PointF((float)(srcImage.Cols * 0.65), (float)(srcImage.Rows * 0.35));
            dstTriangle[2] = new PointF((float)(srcImage.Cols * 0.15), (float)(srcImage.Rows * 0.6));

            //【4】求得用於仿射變換的矩陣
            warpMat = CvInvoke.GetAffineTransform(srcTriangle, dstTriangle);

            //【5】對源影象應用以上求得的仿射變換矩陣
            CvInvoke.WarpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.Size);

            //【6】對影象進行縮放後再旋轉
            //計算繞影象中心點順時針旋轉30度,縮放因子為0.6的旋轉矩陣
            Point center = new Point(dstImage_warp.Cols / 2, dstImage_warp.Rows / 2);
            double angle = -30.0;
            double scale = 0.6;
            //通過以上的旋轉細節資訊求得旋轉矩陣
            CvInvoke.GetRotationMatrix2D(center, angle, scale, rotMat);
            //呼叫仿射變換函式,進行影象的旋轉和縮放
            CvInvoke.WarpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.Size);

            //【7】顯示結果
            CvInvoke.Imshow("Source Image", srcImage);
            CvInvoke.Imshow("Warp Image", dstImage_warp);
            CvInvoke.Imshow("Warp Rotate Image", dstImage_warp_rotate);

            //等待使用者按任意鍵退出程式
            CvInvoke.WaitKey(0);    
        }
    }
}

程式執行截圖如下: