图像处理(旋转)_基于EMGUCV(一)

EMGUCV操作图像处理已经封装的很好,但应付日常操作还是略有不怠,比如这次工作中遇到的透明和旋转操作。

EMGUCV作为OPENCV的C#变种,理论上后者能实现的功能,EMGUCV中应该都能实现,但大多数人往往由于数据类型的问题会卡住,本文就是这么一个例子。

OPENCV下的图像旋转可以参考以下博文,

http://blog.csdn.net/garfielder007/article/details/50487654

本文仅对上文中的代码翻译为C#版本

	//旋转图像内容不变,尺寸相应变大
        Image rotateImage1(Image modelImage, int degree)
        {
            Image modelImage_Emgucv = new Image(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 map_matrix_temp = new Matrix(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 img_rotate = new Image(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;
        }

最终效果图如下:

图像处理(旋转)_基于EMGUCV(一)_第1张图片



初开博客,目的是交流与合作,本人QQ:273651820。




你可能感兴趣的:(图像处理(旋转)_基于EMGUCV(一))