基於Emgucv,C#的圖片旋轉方式

来源:https://www.cnblogs.com/motao9527/archive/2018/12/21/10156713.html
-Advertisement-
Play Games

方法調用: ...


 

 1         /// <summary> 
 2         /// 圖片旋轉 --百度 旋轉仿射
 3         /// </summary>
 4         /// <param name="modelImage"></param>
 5         /// <param name="degree"></param>
 6         /// <returns></returns>
 7         Image<Bgra, byte> rotateImage1(Image modelImage, int degree)
 8         {
 9             Image<Bgra, byte> modelImage_Emgucv = new Image<Bgra, byte>(new Bitmap(modelImage));
10             double angle = degree * Math.PI / 180; // 弧度  
11             double a = Math.Sin(angle), b = Math.Cos(angle);
12             int width = modelImage.Width;
13             int height = modelImage.Height;
14             int width_rotate = Convert.ToInt32(height * Math.Abs(a) + width * Math.Abs(b));
15             int height_rotate = Convert.ToInt32(width * Math.Abs(a) + height * Math.Abs(b));
16             //旋轉數組map
17             // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
18             // [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
19             //float[] map = new float[6];
20             //此處為修改點,opencv可以直接使用數組,但emgucv似乎不認,所以改為了Matrix。
21             Matrix<float> map_matrix_temp = new Matrix<float>(2, 3);
22 
23             // 旋轉中心
24             PointF center = new PointF(width / 2, height / 2);
25             CvInvoke.GetRotationMatrix2D(center, degree, 1.0, map_matrix_temp);
26 
27             map_matrix_temp[0, 2] += (width_rotate - width) / 2;
28             map_matrix_temp[1, 2] += (height_rotate - height) / 2;
29 
30             Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(width_rotate, height_rotate, new Bgra(0d, 0d, 0d, 0d));
31 
32             //對圖像做仿射變換
33             //CV_WARP_FILL_OUTLIERS - 填充所有輸出圖像的象素。
34             //如果部分象素落在輸入圖像的邊界外,那麼它們的值設定為 fillval.
35             //CV_WARP_INVERSE_MAP - 指定 map_matrix 是輸出圖像到輸入圖像的反變換,
36             CvInvoke.WarpAffine(modelImage_Emgucv, img_rotate, map_matrix_temp, new Size(width_rotate, height_rotate), Inter.Nearest, Warp.Default, BorderType.Transparent, new MCvScalar(0d, 0d, 0d, 0d));
37 
38             return img_rotate;
39         }

 

 1         /// <summary>
 2         /// 圖像的旋轉
 3         /// 在 Image<TColor,TDepth>Rotate 有三個重載函數, 這邊簡單介紹:
 4         /// public Image<TColor, TDepth> Rotate(double angle, TColor background);
 5         /// public Image<TColor, TDepth> Rotate(double angle, TColor background, boolcrop);
 6         /// public Image<TColor, TDepth> Rotate(double angle, PointF center, Inter interpolationMethod, TColor background, bool crop);
 7         ///參數解析:
 8         /// double angle: 順時針旋轉角度。
 9         /// PointF center: 旋轉中心, 預設為圖像的中心。
10         /// Inter interpolationMethod: 插值類型表示符, 如表 6.1 所示。
11         /// TColor background: 背景圖像的顏色, TColor 類型與圖像的顏色
12         /// 類型一致。
13         /// bool crop: 如果 Crop = true, 則圖像裁剪到與原來圖像一樣大,可能會失去邊角信息。 
14         ///false, 保證不失去邊角信息, 但是改變了圖像的大小。 預設為 true。
15         /// </summary>
16         public Image<Bgra, byte> ImageRotates(Bitmap Map,double Dou,bool Bol=false)
17         {
18             Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
19            //Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol);
20             // Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol) 等同於
21             Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new PointF(Imga1.Width / 2, Imga1.Height / 2), Inter.Cubic, new Bgra(0, 0, 0, 0), Bol);
22             return Imga2;
23 
24         }
 1 /// <summary>
 2         /// 三點仿射實現代碼
 3         /// </summary>
 4         /// <param name="Map"></param>
 5         /// <param name="Dou"></param>
 6         /// <returns></returns>
 7         public Mat ImagePointFs(Bitmap Map, double Dou)
 8         {
 9             Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
10             //Image<Bgra, byte> Imga2 = new Image<Bgra, byte>(Map);
11             PointF[] scr = new PointF[] { new PointF(0, 0), new PointF(90, 0),new PointF(0, 90) };//創建用於獲取仿射矩陣的原始三個點的坐標。
12             PointF[] dst = new PointF[] { new PointF(0, 0), new PointF(0, 90), new PointF(90, 0) };//創建用於獲取仿射矩陣的目標三個點的坐標。
13             Mat data = new Mat();//創建矩陣, 用於存儲仿射矩陣。
14 
15             data = CvInvoke.GetAffineTransform(scr, dst);//獲取仿射矩陣。
16 
17             Mat scr_mat = Imga1.Mat;//創建矩陣, 用於存儲原始圖像(輸入圖像)。
18             Mat dst_mat = new Mat();//創建矩陣, 用於存儲目標圖像(處理後的圖像)。
19             //scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.ImreadModes.AnyColor);//指定目錄實例化一張圖像。
20             //Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(Imga1.Width, Imga1.Height, new Bgra(0d, 0d, 0d, 0d));
21             CvInvoke.WarpAffine(scr_mat, dst_mat, data, new Size(scr_mat.Height, scr_mat.Width));//採用仿射獲取目標圖像。
22             //imageBox1.Image = scr_mat;//顯示原始圖像。
23             //imageBox2.Image = dst_mat;//顯示目標圖像。
24             return dst_mat;
25 
26         }
 1   /// <summary>
 2         /// 旋轉仿射
 3         /// </summary>
 4         /// <param name="Map"></param>
 5         /// <param name="Dou"></param>
 6         /// <returns></returns>
 7         public Mat ImageRume(Bitmap Map, double Dou)
 8         {
 9             Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
10             Mat data = new Mat();//創建矩陣, 用於存儲旋轉矩陣。
11             //double angle = Dou * Math.PI / 180; // 弧度  
12             CvInvoke.GetRotationMatrix2D(new PointF(Imga1.Width/2, Imga1.Height / 2), Dou, 1, data);//以特定的參數獲取旋轉矩陣。
13             Mat scr_mat = Imga1.Mat;//創建矩陣, 用於存儲原始圖像(輸入圖 像)。
14             Mat dst_mat = new Mat();//創建矩陣, 用於存儲目標圖像(處理後的圖像)。
15                                     //scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定目錄實例化一張圖像。
16 
17             //Warp.FillOutliers  向左
18             //Warp.InverseMap  向右
19             CvInvoke.WarpAffine(scr_mat, dst_mat, data, scr_mat.Size, Inter.Nearest, Warp.Default, BorderType.Transparent, new MCvScalar(0d, 0d, 0d, 0d));// 採 用 仿射獲取目標圖像。
20 
21             return dst_mat;
22 
23         }

 

方法調用:

 1  private void button1_Click(object sender, EventArgs e)
 2         {
 3             Image img = bit;
 4             Image<Bgra, byte> Image = null;
 5             if (radioButton1.Checked)
 6                 Image = rotateImage1(img, int.Parse(numericUpDown1.Value.ToString()));
 7             if (radioButton2.Checked)
 8                 Image = ImageRotates(bit, double.Parse(numericUpDown1.Value.ToString()));
 9             if (radioButton3.Checked)
10                 Image =  new Image<Bgra, byte>(ImagePointFs(bit, double.Parse(numericUpDown1.Value.ToString())).Bitmap);
11             if (radioButton4.Checked)
12                 Image = new Image<Bgra, byte>(ImageRume(bit, double.Parse(numericUpDown1.Value.ToString())).Bitmap);
13 
14 
15             if (Image != null)
16             {
17                 pictureBox1.Image = Image.Bitmap;
18             }
19 
20             Image<Bgra, byte> Imae = new Image<Bgra, byte>(bit);
21             CvInvoke.Imshow("原圖", Imae);
22 
23         }

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 界面風格-黑色主題 1、設置-首選項-界面-風格選擇Fusion,再配置題樣式表選擇路徑下的eric6\Styles選擇【Chinese_Dark.qss】進行修改。 ​ 編輯器風格 2、選擇完畢後,編輯風格依然是白色的,可以修改相關的設置 ​ 3、修改頁邊空白背景色,其它部件設置顏色也可以從這個界 ...
  • 我這邊用的是阿裡雲的免費證書,下麵展示一下操作步驟。 首先登陸阿裡雲,搜索ssl證書進入ssl證書控制台。點擊購買 然後選擇免費版,配置如下: 選擇立即購買,購買成功後回到ssl控制台即可查看證書。然後選擇申請綁定功能變數名稱 點擊申請後出現如下界面,選擇手動驗證: 點擊下一步,然後需要手動驗證即去你的功能變數名稱 ...
  • 1. 類的約束 1. 寫一個父類. 父類中的某個方法要拋出一個異常 NotImplementedError (重點) 2. 抽象類和抽象方法 2. 異常處理. 3. MD5 ...
  • 一、前言 flask中有很多可擴展點(筆者這樣稱呼),其中包含了信號和請求鉤子,這些信號和鉤子有什麼用呢?其主要作用用於幫助我們進行程式的耦合性,當然還可以讓我們自定義一些行為。話不多說,通過閱讀源碼,筆者將這些所有的可擴展點的執行順序進行總結(如下圖),這樣我們更能清楚的知道flask的內部請求流 ...
  • #第一個程式print('SigAi')#python 輸入程式name = input('please enter a name')print(name)#list 是可變有序集合#list之可變L = list(['a','b','c'])print(L)L.append('def')print... ...
  • 最近想做個全文搜索,設想用 ASP.NET Web API + Elasticsearch 6.x 來實現。 網上搜了下 Elasticsearch 的資料,大部分是講 linux 平臺下如何用 java 來開發,有少量講在 windows 平臺下用 c# 開發的,且版本是 Elasticsearc ...
  • 線上報來一個問題,說用戶的數據丟失了。開發經過緊張的調查。終於找到了原因。 問題出在了 if 中的比較上。 values[rowIndex] 中保存的是一個整數,開發認為兩個整數比較實用 == 就可以了。 但是 values[rowIndex] 中的整數經過 GetValue返回後被作為 objec ...
  • 既然標題為後續,就要放一下上一篇文章 "使用.Net Core 2.1開發Captcha圖片驗證碼服務" 繼續挖坑 時隔7個月再次繼續自己在GitHub上挖的坑 "https://github.com/PuzzledAlien/Captcha" 在之前翻譯了一片有關如何在.net core中使用Sy ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...