C# EMGU 3.4.1學習筆記(十一)示例程式:仿射變換
阿新 • • 發佈:2018-12-12
本示例是《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); } } }
程式執行截圖如下: