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 / ; // 弧度
  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>(, );
  22.  
  23. // 旋转中心
  24. PointF center = new PointF(width / , height / );
  25. CvInvoke.GetRotationMatrix2D(center, degree, 1.0, map_matrix_temp);
  26.  
  27. map_matrix_temp[, ] += (width_rotate - width) / ;
  28. map_matrix_temp[, ] += (height_rotate - height) / ;
  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 / , Imga1.Height / ), Inter.Cubic, new Bgra(, , , ), 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(, ), new PointF(, ),new PointF(, ) };//创建用于获取仿射矩阵的原始三个点的坐标。
  12. PointF[] dst = new PointF[] { new PointF(, ), new PointF(, ), new PointF(, ) };//创建用于获取仿射矩阵的目标三个点的坐标。
  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/, Imga1.Height / ), Dou, , 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. if (Image != null)
  15. {
  16. pictureBox1.Image = Image.Bitmap;
  17. }
  18.  
  19. Image<Bgra, byte> Imae = new Image<Bgra, byte>(bit);
  20. CvInvoke.Imshow("原图", Imae);
  21.  
  22. }

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

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

    本文分享几种基于HTML5+CSS3实现的一些动画特效:图片旋转.无限滚动.文字跳动;实现起来均比较容易,动手来试试! 一.图片旋转 效果图如下: 这个效果实现起来其实并不困难.代码清单如下: < ...

  2. IE8 下面通过滤镜的方式进行图片旋转

    首先,为什么我会提出这样的方式来进行操作呢?原因还是需求导致: 在做项目中,有这样一个需求,在进行网页中图片查看的时候,需要对图片的操作有支持旋转和缩放这些操作,看似这样的网上插件有很多,对!但是对于 ...

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

    image processing 系列 [图像处理]直方图匹配 [图像处理]高斯滤波.中值滤波.均值滤波 图片旋转,本质上是对旋转后的图片中每一个像素点计算在原图的位置.然后照搬过来就好. (多说一句 ...

  4. H5 拍照图片旋转、压缩和上传

    原文地址:github.com/whinc/blog/… 最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论.需要同时在 H5 和小程序两端实现,该需求处理图 ...

  5. 自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)

    using System; using System.Drawing; using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; na ...

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

    html: <form action="<{:AppLink('circle/uploadimg')}>" id="imageform" me ...

  7. 【js】js 让图片旋转

     转http://www.cnblogs.com/ustcyc/p/3760116.html 核心: canvas.style.filter = "progid:DXImageTransfo ...

  8. flex 图片旋转(解决公转和自转问题)

    在Flex中图片的旋转是既有公转和自转的.这样在图片旋转的时候就有一定小麻烦: 为了更好地说明问题,先引入两个概念:“自转”和“公转”.想象一下,地球在绕着太阳公转的同时,它自己也在自转.Flash应 ...

  9. 一款基于css3鼠标经过圆形旋转特效

    今天给大家分享一款基于css3鼠标经过圆形旋转特效.当鼠标经过的时候图片边框颜色旋转,图片显示详情.该实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗 ...

随机推荐

  1. Vue学习笔记一:初识Vue

    目录 什么是Vue? 为什么要学习前端框架? MVC,MVP 和 MVVM 最简单的入门小案例 下载Vue.js 新建文件结构 写一个html 运行 可笑的小报错 Vue和MVVM 什么是Vue? V ...

  2. python之路(10)类的内置函数

    目录 isinstance()和issubclass() __setitem__.__getitem__和__delitem__ __str__和__reper__ __format__ __slot ...

  3. HTTPS加密那点事-对称、非对称加密、数字证书

    转自:[漫画]https 加密那点事 首先,HTTP协议的缺点:没有对数据进行加密,都是明文传输的.如果要改进这种明文传输的协议,该如何做呢? 对称加密: 在每次发送真实数据之前,服务器先生成一把密钥 ...

  4. andriod webview和h5

    1.WebBrowserActivity extends BaseActivity 2.setContentView(R.layout.activity_web_html); <WebView ...

  5. 入坑DL CV 一些基础技能学习

    进入实验室学习了一个月左右,记录一下新手入门所学的基本知识,都是入门级别的教程 1.Python 快速入门:廖雪峰Python教程--> https://www.liaoxuefeng.com/ ...

  6. JS判断数组的值出现的次数,以及去重

    var arr = ["曹阳","曹阳","曹阳","张三","张三","张三" ...

  7. BUGKU login3

    先看的wp,呢么来复现一遍,emmmmmm,尝试一波,用户名输入admin后,密码随便输,发现提示password error,呢么填其他用户名的话,发现提示username does not exi ...

  8. No grammar constraints (DTD or XML Schema) referenced in the document.

    问题描述 web.xml 使用 Servlet4.0 版本,No grammar constraints (DTD or XML Schema) referenced in the document. ...

  9. iOS UINavigationController Class Translation

    类   UINavigationController 一个容器视图控制器,定义了用于导航分层内容的基于堆栈的方案.   概述   导航控制器是一个在导航界面中,管理一个或多个子视图控制器的容器视图控制 ...

  10. Hadoop第一式:配置Linux环境之免密配置及SSH原理

    一.配置SSH免密登录 进入/.ssh目录,执行密钥生成指令 ssh-keygen -t rsa (rsa为默认加密格式) 然后会出现四个提示,让你选择密钥保存路径.指纹.拍照啥的,不用管它直接回车过 ...