经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
基于Emgucv,C#的图片旋转方式
来源:cnblogs  作者:C#爆破  时间:2018/12/24 10:43:18  对本文有异议

 

  1. 1 /// <summary>
  2. 2 /// 图片旋转 --百度 旋转仿射
  3. 3 /// </summary>
  4. 4 /// <param name="modelImage"></param>
  5. 5 /// <param name="degree"></param>
  6. 6 /// <returns></returns>
  7. 7 Image<Bgra, byte> rotateImage1(Image modelImage, int degree)
  8. 8 {
  9. 9 Image<Bgra, byte> modelImage_Emgucv = new Image<Bgra, byte>(new Bitmap(modelImage));
  10. 10 double angle = degree * Math.PI / 180; // 弧度
  11. 11 double a = Math.Sin(angle), b = Math.Cos(angle);
  12. 12 int width = modelImage.Width;
  13. 13 int height = modelImage.Height;
  14. 14 int width_rotate = Convert.ToInt32(height * Math.Abs(a) + width * Math.Abs(b));
  15. 15 int height_rotate = Convert.ToInt32(width * Math.Abs(a) + height * Math.Abs(b));
  16. 16 //旋转数组map
  17. 17 // [ m0 m1 m2 ] ===> [ A11 A12 b1 ]
  18. 18 // [ m3 m4 m5 ] ===> [ A21 A22 b2 ]
  19. 19 //float[] map = new float[6];
  20. 20 //此处为修改点,opencv可以直接使用数组,但emgucv似乎不认,所以改为了Matrix。
  21. 21 Matrix<float> map_matrix_temp = new Matrix<float>(2, 3);
  22. 22
  23. 23 // 旋转中心
  24. 24 PointF center = new PointF(width / 2, height / 2);
  25. 25 CvInvoke.GetRotationMatrix2D(center, degree, 1.0, map_matrix_temp);
  26. 26
  27. 27 map_matrix_temp[0, 2] += (width_rotate - width) / 2;
  28. 28 map_matrix_temp[1, 2] += (height_rotate - height) / 2;
  29. 29
  30. 30 Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(width_rotate, height_rotate, new Bgra(0d, 0d, 0d, 0d));
  31. 31
  32. 32 //对图像做仿射变换
  33. 33 //CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。
  34. 34 //如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
  35. 35 //CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,
  36. 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. 37
  38. 38 return img_rotate;
  39. 39 }

 

  1. 1 /// <summary>
  2. 2 /// 图像的旋转
  3. 3 /// 在 Image<TColor,TDepth>Rotate 有三个重载函数, 这边简单介绍:
  4. 4 /// public Image<TColor, TDepth> Rotate(double angle, TColor background);
  5. 5 /// public Image<TColor, TDepth> Rotate(double angle, TColor background, boolcrop);
  6. 6 /// public Image<TColor, TDepth> Rotate(double angle, PointF center, Inter interpolationMethod, TColor background, bool crop);
  7. 7 ///参数解析:
  8. 8 /// double angle: 顺时针旋转角度。
  9. 9 /// PointF center: 旋转中心, 默认为图像的中心。
  10. 10 /// Inter interpolationMethod: 插值类型表示符, 如表 6.1 所示。
  11. 11 /// TColor background: 背景图像的颜色, TColor 类型与图像的颜色
  12. 12 /// 类型一致。
  13. 13 /// bool crop: 如果 Crop = true, 则图像裁剪到与原来图像一样大,可能会失去边角信息。
  14. 14 ///false, 保证不失去边角信息, 但是改变了图像的大小。 默认为 true。
  15. 15 /// </summary>
  16. 16 public Image<Bgra, byte> ImageRotates(Bitmap Map,double Dou,bool Bol=false)
  17. 17 {
  18. 18 Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
  19. 19 //Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol);
  20. 20 // Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol) 等同于
  21. 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. 22 return Imga2;
  23. 23
  24. 24 }
  1. 1 /// <summary>
  2. 2 /// 三点仿射实现代码
  3. 3 /// </summary>
  4. 4 /// <param name="Map"></param>
  5. 5 /// <param name="Dou"></param>
  6. 6 /// <returns></returns>
  7. 7 public Mat ImagePointFs(Bitmap Map, double Dou)
  8. 8 {
  9. 9 Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
  10. 10 //Image<Bgra, byte> Imga2 = new Image<Bgra, byte>(Map);
  11. 11 PointF[] scr = new PointF[] { new PointF(0, 0), new PointF(90, 0),new PointF(0, 90) };//创建用于获取仿射矩阵的原始三个点的坐标。
  12. 12 PointF[] dst = new PointF[] { new PointF(0, 0), new PointF(0, 90), new PointF(90, 0) };//创建用于获取仿射矩阵的目标三个点的坐标。
  13. 13 Mat data = new Mat();//创建矩阵, 用于存储仿射矩阵。
  14. 14
  15. 15 data = CvInvoke.GetAffineTransform(scr, dst);//获取仿射矩阵。
  16. 16
  17. 17 Mat scr_mat = Imga1.Mat;//创建矩阵, 用于存储原始图像(输入图像)。
  18. 18 Mat dst_mat = new Mat();//创建矩阵, 用于存储目标图像(处理后的图像)。
  19. 19 //scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.ImreadModes.AnyColor);//指定目录实例化一张图像。
  20. 20 //Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(Imga1.Width, Imga1.Height, new Bgra(0d, 0d, 0d, 0d));
  21. 21 CvInvoke.WarpAffine(scr_mat, dst_mat, data, new Size(scr_mat.Height, scr_mat.Width));//采用仿射获取目标图像。
  22. 22 //imageBox1.Image = scr_mat;//显示原始图像。
  23. 23 //imageBox2.Image = dst_mat;//显示目标图像。
  24. 24 return dst_mat;
  25. 25
  26. 26 }
  1. 1 /// <summary>
  2. 2 /// 旋转仿射
  3. 3 /// </summary>
  4. 4 /// <param name="Map"></param>
  5. 5 /// <param name="Dou"></param>
  6. 6 /// <returns></returns>
  7. 7 public Mat ImageRume(Bitmap Map, double Dou)
  8. 8 {
  9. 9 Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
  10. 10 Mat data = new Mat();//创建矩阵, 用于存储旋转矩阵。
  11. 11 //double angle = Dou * Math.PI / 180; // 弧度
  12. 12 CvInvoke.GetRotationMatrix2D(new PointF(Imga1.Width/2, Imga1.Height / 2), Dou, 1, data);//以特定的参数获取旋转矩阵。
  13. 13 Mat scr_mat = Imga1.Mat;//创建矩阵, 用于存储原始图像(输入图 像)。
  14. 14 Mat dst_mat = new Mat();//创建矩阵, 用于存储目标图像(处理后的图像)。
  15. 15 //scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定目录实例化一张图像。
  16. 16
  17. 17 //Warp.FillOutliers 向左
  18. 18 //Warp.InverseMap 向右
  19. 19 CvInvoke.WarpAffine(scr_mat, dst_mat, data, scr_mat.Size, Inter.Nearest, Warp.Default, BorderType.Transparent, new MCvScalar(0d, 0d, 0d, 0d));// 采 用 仿射获取目标图像。
  20. 20
  21. 21 return dst_mat;
  22. 22
  23. 23 }

 

方法调用:

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

 

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号