Image 旋转方法

/// <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 / 180; // 弧度
            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>(2, 3);

            // 旋转中心
            PointF center = new PointF(width / 2, height / 2);
            CvInvoke.GetRotationMatrix2D(center, degree, 1.0, map_matrix_temp);

            map_matrix_temp[0, 2] += (width_rotate - width) / 2;
            map_matrix_temp[1, 2] += (height_rotate - height) / 2;

            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 / 2, Imga1.Height / 2), Inter.Cubic, new Bgra(0, 0, 0, 0), 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(0, 0), new PointF(90, 0),new PointF(0, 90) };//创建用于获取仿射矩阵的原始三个点的坐标。
            PointF[] dst = new PointF[] { new PointF(0, 0), new PointF(0, 90), new PointF(90, 0) };//创建用于获取仿射矩阵的目标三个点的坐标。
            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/2, Imga1.Height / 2), Dou, 1, 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;

        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值