zoukankan      html  css  js  c++  java
  • 基于Emgucv,C#的图片旋转方式

     

     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         }

     

     

  • 相关阅读:
    关于基本的线程的生命周期
    HTML Response ContentType 大全
    IE与Firefox的CSS兼容大全
    文件上传代码
    C#.NET里面抽象类和接口有什么区别
    用SQL命令创建数据库
    JS根据生日算岁数
    改变Iframe的Src
    JS做加法精度问题
    真正的问题应该在我身上……
  • 原文地址:https://www.cnblogs.com/motao9527/p/10156713.html
Copyright © 2011-2022 走看看