在图像处理的过程中,这样一类需求:因为拍照角度问题,一个物体因为透视角度的原因,造成了看起来远近两端大小不一致.恰好我手头就有这么个需求,于是看了一下透视变换,并使用OpenCVSharp对图像进行处理,解决了此需求(其他版本的opencv函数类似).

需要用到这么两个函数:

GetPerspectiveTransform     根据四个点的位置变换,来计算透视变换所需要的变换矩阵
WarpPerspective         使用变换矩阵,对图像进行透视变换.

例如如下图像,

从其中取四个点:

然后因为想让前后宽度一直,所以得到对应的变化后的四个点(下边两点不变,上边两点拉到需要的地方).

然后进行透视变换.

/*以下代码只展示变换部分,其中ImageIn为输入图像,ImageOut为输出图像*/
//变换前的四点
var srcPoints = new Point2f[] {
    new Point2f(5, 648),
    new Point2f(751, 643),
    new Point2f(184, 280),
    new Point2f(589, 272),
};
//变换后的四点
var dstPoints = new Point2f[] {
    new Point2f(0, 703),
    new Point2f(524, 703),
    new Point2f(0, 0),
    new Point2f(524, 0),
};
//根据变换前后四个点坐标,获取变换矩阵
Mat mm = Cv2.GetPerspectiveTransform(srcPoints, dstPoints);    
//进行透视变换
Cv2.WarpPerspective(ImageIn, ImageOut, mm, GrayImage.Size());    

变换效果如下:

Last modification:February 15th, 2020 at 09:24 pm
如果觉得我的文章对你有用,请随意赞赏