OpenCVSharp 4.5 单应性矩阵 - 透视校正

用 OpenCVSharp 4.5 跑一遍 OpenCV 官方教程。

原OpenCV官方教程链接:挂啦(2021-7-19)

using System;
using OpenCvSharp;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class tutorial54 : ITutorial
    {


        enum Pattern { CHESSBOARD, CIRCLES_GRID, ASYMMETRIC_CIRCLES_GRID };

        RNG rng = new RNG();

        private Scalar randomColor(RNG rng)
        {
            int icolor = (int)rng;
            return new Scalar(icolor & 255, (icolor >> 8) & 255, (icolor >> 16) & 255);
        }

        private Point2d[] ConvertToPoint2d(Point2f[] input)
        {
            Point2d[] output = new Point2d[input.Length];
            for (int i = 0; i < input.Length; i++)
            {
                output[i] = new Point2d(input[i].X, input[i].Y);
            }
            return output;
        }
        private void perspectiveCorrection(string img1Path, string img2Path, Size patternSize, RNG rng)
        {
            Mat img1 = Cv2.ImRead(img1Path);
            Mat img2 = Cv2.ImRead(img2Path);

            //! [find-corners]
            Point2f[] corners1, corners2;
            //Mat corners_mat1 = new Mat();
            //Mat corners_mat2 = new Mat();
            bool found1 = Cv2.FindChessboardCorners(img1, patternSize, out corners1);
            bool found2 = Cv2.FindChessboardCorners(img2, patternSize, out corners2);
            //! [find-corners]

            if (!found1 || !found2)
            {
                Console.WriteLine("Error, cannot find the chessboard corners in both images.");
                return;
            }
            //! [estimate-homography]
            Mat H = Cv2.FindHomography(ConvertToPoint2d(corners1), ConvertToPoint2d(corners2));
            Console.WriteLine("H:\n", H);
            //! [estimate-homography]

            //! [warp-chessboard]
            Mat img1_warp = new Mat();
            Cv2.WarpPerspective(img1, img1_warp, H, img1.Size());
            //! [warp-chessboard]

            Mat img_draw_warp = new Mat();
            Cv2.HConcat(img2, img1_warp, img_draw_warp);
            Cv2.ImShow("Desired chessboard view / Warped source chessboard view", img_draw_warp);

            //! [compute-transformed-corners]
            Mat img_draw_matches = new Mat();
            Cv2.HConcat(img1, img2, img_draw_matches);
            for (int i = 0; i < corners1.Length; i++)
            {
                Mat pt1 = new Mat(3, 1, MatType.CV_64F, new double[] { corners1[i].X, corners1[i].Y, 1 });
                Mat pt2 = H * pt1;
                pt2 /= pt2.At<double>(2);

                Point end = new Point((int)(img1.Cols + pt2.At<double>(0)), (int)pt2.At<double>(1));
                Cv2.Line(img_draw_matches, (Point)corners1[i], end, randomColor(rng), 2);
            }

            Cv2.ImShow("Draw matches", img_draw_matches);
            Cv2.WaitKey();
            //! [compute-transformed-corners]
        }

        public void Run()
        {
            RNG rng = new RNG(0xFFFFFFFF);
            int width = 9;
            int height = 6;
            string image1 = @"I:\csharp\images\left02.jpg";
            string image2 = @"I:\csharp\images\left01.jpg";
            Size patternSize = new Size(width, height);

            perspectiveCorrection(image1, image2, patternSize, rng);

        }
    }
}

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值