/// <summary>
/// 图片旋转 --百度 旋转仿射
/// </summary>
/// <param name="modelImage"></param>
/// <param name="degree"></param>
/// <returns></returns>
Image<Bgra, byte> rotateImage1(Image modelImage, int degree)
{
Image<Bgra, byte> modelImage_Emgucv = new Image<Bgra, byte>(new Bitmap(modelImage));
double angle = degree * Math.PI / ; // 弧度
double a = Math.Sin(angle), b = Math.Cos(angle);
int width = modelImage.Width;
int height = modelImage.Height;
int width_rotate = Convert.ToInt32(height * Math.Abs(a) + width * Math.Abs(b));
int height_rotate = Convert.ToInt32(width * Math.Abs(a) + height * Math.Abs(b));
//旋转数组map
// [ m0 m1 m2 ] ===> [ A11 A12 b1 ]
// [ m3 m4 m5 ] ===> [ A21 A22 b2 ]
//float[] map = new float[6];
//此处为修改点,opencv可以直接使用数组,但emgucv似乎不认,所以改为了Matrix。
Matrix<float> map_matrix_temp = new Matrix<float>(, ); // 旋转中心
PointF center = new PointF(width / , height / );
CvInvoke.GetRotationMatrix2D(center, degree, 1.0, map_matrix_temp); map_matrix_temp[, ] += (width_rotate - width) / ;
map_matrix_temp[, ] += (height_rotate - height) / ; Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(width_rotate, height_rotate, new Bgra(0d, 0d, 0d, 0d)); //对图像做仿射变换
//CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。
//如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
//CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,
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)); return img_rotate;
}
         /// <summary>
/// 图像的旋转
/// 在 Image<TColor,TDepth>Rotate 有三个重载函数, 这边简单介绍:
/// public Image<TColor, TDepth> Rotate(double angle, TColor background);
/// public Image<TColor, TDepth> Rotate(double angle, TColor background, boolcrop);
/// public Image<TColor, TDepth> Rotate(double angle, PointF center, Inter interpolationMethod, TColor background, bool crop);
///参数解析:
/// double angle: 顺时针旋转角度。
/// PointF center: 旋转中心, 默认为图像的中心。
/// Inter interpolationMethod: 插值类型表示符, 如表 6.1 所示。
/// TColor background: 背景图像的颜色, TColor 类型与图像的颜色
/// 类型一致。
/// bool crop: 如果 Crop = true, 则图像裁剪到与原来图像一样大,可能会失去边角信息。
///false, 保证不失去边角信息, 但是改变了图像的大小。 默认为 true。
/// </summary>
public Image<Bgra, byte> ImageRotates(Bitmap Map,double Dou,bool Bol=false)
{
Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
//Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol);
// Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new Bgra(0, 0, 0, 0), Bol) 等同于
Image<Bgra, byte> Imga2 = Imga1.Rotate(Dou, new PointF(Imga1.Width / , Imga1.Height / ), Inter.Cubic, new Bgra(, , , ), Bol);
return Imga2; }
 /// <summary>
/// 三点仿射实现代码
/// </summary>
/// <param name="Map"></param>
/// <param name="Dou"></param>
/// <returns></returns>
public Mat ImagePointFs(Bitmap Map, double Dou)
{
Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
//Image<Bgra, byte> Imga2 = new Image<Bgra, byte>(Map);
PointF[] scr = new PointF[] { new PointF(, ), new PointF(, ),new PointF(, ) };//创建用于获取仿射矩阵的原始三个点的坐标。
PointF[] dst = new PointF[] { new PointF(, ), new PointF(, ), new PointF(, ) };//创建用于获取仿射矩阵的目标三个点的坐标。
Mat data = new Mat();//创建矩阵, 用于存储仿射矩阵。 data = CvInvoke.GetAffineTransform(scr, dst);//获取仿射矩阵。 Mat scr_mat = Imga1.Mat;//创建矩阵, 用于存储原始图像(输入图像)。
Mat dst_mat = new Mat();//创建矩阵, 用于存储目标图像(处理后的图像)。
//scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.ImreadModes.AnyColor);//指定目录实例化一张图像。
//Image<Bgra, byte> img_rotate = new Image<Bgra, byte>(Imga1.Width, Imga1.Height, new Bgra(0d, 0d, 0d, 0d));
CvInvoke.WarpAffine(scr_mat, dst_mat, data, new Size(scr_mat.Height, scr_mat.Width));//采用仿射获取目标图像。
//imageBox1.Image = scr_mat;//显示原始图像。
//imageBox2.Image = dst_mat;//显示目标图像。
return dst_mat; }
   /// <summary>
/// 旋转仿射
/// </summary>
/// <param name="Map"></param>
/// <param name="Dou"></param>
/// <returns></returns>
public Mat ImageRume(Bitmap Map, double Dou)
{
Image<Bgra, byte> Imga1 = new Image<Bgra, byte>(Map);
Mat data = new Mat();//创建矩阵, 用于存储旋转矩阵。
//double angle = Dou * Math.PI / 180; // 弧度
CvInvoke.GetRotationMatrix2D(new PointF(Imga1.Width/, Imga1.Height / ), Dou, , data);//以特定的参数获取旋转矩阵。
Mat scr_mat = Imga1.Mat;//创建矩阵, 用于存储原始图像(输入图 像)。
Mat dst_mat = new Mat();//创建矩阵, 用于存储目标图像(处理后的图像)。
//scr_mat = new Mat("flower.jpg",Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定目录实例化一张图像。 //Warp.FillOutliers 向左
//Warp.InverseMap 向右
CvInvoke.WarpAffine(scr_mat, dst_mat, data, scr_mat.Size, Inter.Nearest, Warp.Default, BorderType.Transparent, new MCvScalar(0d, 0d, 0d, 0d));// 采 用 仿射获取目标图像。 return dst_mat; }

方法调用:

  private void button1_Click(object sender, EventArgs e)
{
Image img = bit;
Image<Bgra, byte> Image = null;
if (radioButton1.Checked)
Image = rotateImage1(img, int.Parse(numericUpDown1.Value.ToString()));
if (radioButton2.Checked)
Image = ImageRotates(bit, double.Parse(numericUpDown1.Value.ToString()));
if (radioButton3.Checked)
Image = new Image<Bgra, byte>(ImagePointFs(bit, double.Parse(numericUpDown1.Value.ToString())).Bitmap);
if (radioButton4.Checked)
Image = new Image<Bgra, byte>(ImageRume(bit, double.Parse(numericUpDown1.Value.ToString())).Bitmap); if (Image != null)
{
pictureBox1.Image = Image.Bitmap;
} Image<Bgra, byte> Imae = new Image<Bgra, byte>(bit);
CvInvoke.Imshow("原图", Imae); }

基于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. 光刻技术的原理和EUV光刻技术前景

    本文转载自微信公众号 半导体技术天地, 链接 https://mp.weixin.qq.com/s/EEBkSQ_Yc8RYFO18VpO8ow

  2. luogu P5303 [GXOI/GZOI2019]逼死强迫症

    传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...

  3. 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法

    好久没见了 在项目中遇到一个小小的需求,总结了一下! 详细我就不介绍了,相信大家用过的话,很了解.详见文档-----------> http://element-cn.eleme.io/#/zh ...

  4. git本机服务器配置(二):TortoiseGit的安装

    1. 下载TortoiseGit https://tortoisegit.org/ 1.1 下载安装包 下载对应安装包,如果不知道自己该下载哪个,那就下载32位的. 1.2 下载语言包 下载和安装包相 ...

  5. 支持向量机SVM——专治线性不可分

    SVM原理 线性可分与线性不可分 线性可分 线性不可分-------[无论用哪条直线都无法将女生情绪正确分类] SVM的核函数可以帮助我们: 假设‘开心’是轻飘飘的,“不开心”是沉重的 将三维视图还原 ...

  6. multiwan 脚本

    以下为校区ACM实验室多拨脚本,使用了macvlan模块,具体策略路由和连接标记等思路就不解释了. #! /bin/bash getip() { |grep -o -e 'inet addr:[^ ] ...

  7. activemq之python使用stomp协议

    参考链接: 安装:https://pypi.org/project/stomp.py/4.1.8/#history https://www.cnblogs.com/andylhc/p/9337945. ...

  8. hostapd、/dev/random、/dev/urandom

    在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上 ...

  9. vscode 同步配置插件

    目前所用: 1.25.1版本 1,删除 vscode 客户端, 卸载vscode应用软件删除不了用户配置信息,,下载安装还会发现之前下载的插件和个人配置信息都还会重新加载出来 应先彻底清除已安装的插件 ...

  10. eclipse中jetty插件安装

    注:本文来源于:<eclipse中jetty插件安装> 一.eclipse中jetty插件安装: 打开eclipse,依次点击菜单Help->Eclipse Marketplace, ...