方法調用: ...
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 }