c# OpenCvSharp 透视变换 GetPerspectiveTransform WarpPerspective

c# OpenCvSharp 透视变换 GetPerspectiveTransform WarpPerspective

using OpenCvSharp;
using OpenCvSharp.Extensions;
using DlibDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace app
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 透视变换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWarpPerspectiveEasy_Click(object sender, EventArgs e)
        {
            // 加载图像
            Mat src = Cv2.ImRead(@"img\bianxing1.png");
            Cv2.ImShow("原图", src);

            // 透视变换
            List<Point2f> srcContoursPoints = new List<Point2f>();
            srcContoursPoints.Add(new Point2f(138, 60));
            srcContoursPoints.Add(new Point2f(426, 60));
            srcContoursPoints.Add(new Point2f(56, 316));
            srcContoursPoints.Add(new Point2f(521, 316));

            List<Point2f> dstContoursPoints = new List<Point2f>();
            dstContoursPoints.Add(new Point2f(0, 0));
            dstContoursPoints.Add(new Point2f(580, 0));
            dstContoursPoints.Add(new Point2f(0, 380));
            dstContoursPoints.Add(new Point2f(580, 380));

            // 透视变换矩阵
            Mat retImg = new Mat();
            Mat warpMat = Cv2.GetPerspectiveTransform(srcContoursPoints, dstContoursPoints);
            Cv2.WarpPerspective(src, retImg, warpMat, retImg.Size(), InterpolationFlags.Linear);
            Cv2.ImShow("透视变换", retImg);
        }
    }
}

以上仅仅为了便于演示透视变换的效果。实际需要灰度处理、模糊处理、二值处理、形态学操作、按位运算、轮廓发现、轮廓绘制、灰度转换、霍夫变换直线检测等步骤,再计算上下左右4条直线的交点,再进行透视变化矩阵的调整。

其他说明:
两条直线的交点坐标

发表回复

您的电子邮箱地址不会被公开。