您的位置:首页 > 其它

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

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

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

OPENCV下的图像旋转可以参考以下博文,
http://blog.csdn.net/garfielder007/article/details/50487654
本文仅对上文中的代码翻译为C#版本

//旋转图像内容不变,尺寸相应变大
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;
}

最终效果图如下:



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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图像处理 Emgucv 旋转