今天讲解的两个函数,可以实现以下样式的翻转。
- 水平翻转:将图像沿Y轴(图像最左侧垂直边缘)翻转的操作。原始图像中位于左侧的内容将移动到目标图像的右侧,原始图像中位于右侧的内容将移动到目标图像的左侧。
- 垂直翻转:将图像沿X轴(图像最下面水平边缘)翻转的操作。原始图像中位于下面的内容将移动到目标图像的上面,原始图像中位于上面的内容将移动到目标图像的下面。
- 转置:逆时针旋转90度,再垂直翻转。
- 顺时针旋转90度。
下面逐个举例,还是以 哈士奇.jpg为例,原始图像宽557,高399,如下:
1、Transpose()转置函数
Transpose()函数是转置函数,可以将图片逆时针旋转90度,再垂直翻转一次。用法非常简单:
Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat();
CvInvoke.Transpose(tempMat, dstMat); // 就是逆时针旋转90度
CvInvoke.Imshow("Result Mat, " + dstMat.Size.ToString(), dstMat);
执行一次Transpose()函数,输出图像如下:
2、Flip()翻转函数
函数的定义如下:
public static void Flip(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
FlipType flipType // 旋转类型
)
注意哈,FlipType反转类型有Vertical、Horizontal、Both三种,也就是可以让图像垂直翻转、水平翻转、垂直+水平同时翻转。
以水平翻转为例,代码如下:
Mat dstMat = srcMat.Clone();
CvInvoke.Flip(dstMat, dstMat, FlipType.Horizontal);
CvInvoke.Imshow("Result Mat,FlipType.Horizontal, " + dstMat.Size.ToString(), dstMat);
翻转后的效果如下图:
垂直翻转和水平+垂直同时翻转的效果,分别是:
3、顺时针旋转90度
刚才讲的Transpose()函数,执行一次的效果是逆时针旋转90度再垂直翻转,那怎么能实现只顺时针旋转90度呢,Emgu CV里面没有直接顺时针旋转90度的函数,但是Transpose()和Flip()函数配合就OK啦。解释起来太空洞,我在PPT里画了一个演示。
- 第一种方式就是用PPT的顺时针旋转功能,一步到胃,顺时针旋转90度。
- 第二种方式就是先用Flip()函数垂直翻转,再用Transpose()转置。
代码就是这样,读者们自己试试吧。
Mat tempMat = srcMat.Clone();
Mat dstMat = new Mat();
CvInvoke.Flip(tempMat, dstMat, FlipType.Vertical);
CvInvoke.Transpose(dstMat, dstMat); // 再转置一下
CvInvoke.Imshow("Result Mat, " + dstMat.Size.ToString(), dstMat);
原创不易,请勿抄袭。共同进步,相互学习。