基于Emgucv,C#的图片旋转方式

原文:基于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         }

原文地址:https://www.cnblogs.com/lonelyxmas/p/10159212.html

时间: 2024-10-09 01:08:19

基于Emgucv,C#的图片旋转方式的相关文章

基于HTML5+CSS3的图片旋转、无限滚动、文字跳动特效

本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: <style type="text/css"> #liu{ width:280px; height: 279px; background: url(shishi.png) no-repeat; border-radius:140px; -webkit-animation:run 6s

网页中图片旋转的几种实现方式

网页中图片旋转一般有下面三种常见的实现方式: 一. ie 滤镜 IE的图形旋转滤镜,通过指定BasicImage滤镜的rotation值旋转元素,旋转方向为顺时针,旋转的中心点为元素的左上角.rotation可以有4个旋转值:0, 1, 2,和3分别表示将元素旋转0度.90度.180度.270度. 浏览器支持: IE5.5+ CSS代码: .rotate{ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); } JS

【图像处理】基于OpenCV底层实现的图片旋转

image processing 系列 [图像处理]直方图匹配 [图像处理]高斯滤波.中值滤波.均值滤波 图片旋转,本质上是对旋转后的图片中每一个像素点计算在原图的位置.然后照搬过来就好. (多说一句.假设计算出来在原图中的位置不是整数而是小数,由于像素点个数都是整数,就须要小数到整数的转换. 这个转换过程是有讲究的,须要用到插值:近期邻插值.双线性插值等等.这里我使用的是最简单的近期邻插值.即对小数四舍五入成整数.C/C++ 实现四舍五入见这里) 完整 github 代码:image-proc

C# - 图片旋转和Base64处理

旋转 (1)按角度旋转 /// <summary> /// 根据角度旋转图标 /// </summary> /// <param name="img"></param> public Image RotateImg(Image img, float angle) { //通过Png图片设置图片透明,修改旋转图片变黑问题. int width = img.Width; int height = img.Height; //角度 Matrix

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B

【js】js 让图片旋转

 转http://www.cnblogs.com/ustcyc/p/3760116.html 核心: canvas.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11=" + costheta + ",M12=" + (-sintheta) + ",M21=" + sintheta + ",M22=" + costheta + ",SizingMe

js无刷新上传图片,服务端有生成缩略图,剪切图片,iphone图片旋转判断功能

html: <form action="<{:AppLink('circle/uploadimg')}>" id="imageform" method="post" enctype="multipart/form-data">     <input name="photoimg" type="file" id="xwzx_f" style

图片上传,图片旋转,拖拽

能够支持IE,谷歌,火狐浏览器(兼容多浏览器不容易啊) 下面仅提供核心思想和部分代码:  拖拽:是使用网上现成的JS代码,在此基础上进行适当的修改即可满足自己的需求,最主要的就是判定拖拽的范围,上传的图片不能给拖没了,所以加上个范围限定,判断超出了这个范围便拖拽无效果. 旋转与缩放要区分浏览器.. 旋转:IE浏览器下想要实现图片的旋转很简单只要调用IE提供的滤镜filter参数为一个旋转矩阵即可.谷歌和火狐浏览器图片显示用的是canvas标签而不是img标签所以图片的旋转需要用canvas标签相

IE下及标准浏览器下的图片旋转(一)——滤镜,CSS3

关于图片的旋转,一般来说有3种解决方案:(1)滤镜 (2)css3 (3)canvas.接下来逐一讲解. 为了方便理解,我们主要以90度整倍数讲解,兼顾其他角度. 1. 滤镜(IE专属) 1.1 旋转滤镜 语法如下: filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=i); rotation取值0(0或360度),1(90度),2(180度),3(270度).取其他数无效. 旋转90度示例: css: #box {