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 }
原文地址:https://www.cnblogs.com/lonelyxmas/p/10159212.html
时间: 2024-10-09 01:08:19