我正在为OpenCV使用EmguCV包装器,并且正在纠正这种形状:

在此代码的帮助下:

 public Image<Bgr,byte> Rectify()
    {
        try
        {
            Image<Bgr, byte> warped_Image = new Image<Bgr, byte>(input_Image.Width, input_Image.Height);

            MCvScalar s = new MCvScalar(0, 0, 0);

            PointF[] dsts = new PointF[4];
            dsts[0] = new PointF(0, 0);
            dsts[2] = new PointF(0, input_Image.Height);
            dsts[3] = new PointF(input_Image.Width, input_Image.Height);
            dsts[1] = new PointF(input_Image.Width, 0);

            HomographyMatrix mywarpmat = CameraCalibration.GetPerspectiveTransform(pnts, dsts);

            Image<Bgr, byte> warped_Image2 = warped_Image.WarpPerspective(mywarpmat, Emgu.CV.CvEnum.INTER.CV_INTER_NN, Emgu.CV.CvEnum.WARP.CV_WARP_FILL_OUTLIERS, new Bgr(0, 0, 0));

            CvInvoke.cvWarpPerspective(input_Image, warped_Image2, mywarpmat, (int)Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR, s);

            Image<Bgr, byte> fixedImg = new Image<Bgr, byte>((int)warped_Image2.Width, (int)(warped_Image2.Width / aspectRatio));

            CvInvoke.cvResize(warped_Image2.Ptr, fixedImg.Ptr, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);

            return fixedImg;
        }

我得到这个结果(矫正形状):

我知道角落会同时校正这两个图像(校正前后)。
在校正之前,我知道形状内部的白线的坐标。
知道纠正后如何获得该白线的坐标吗?

先感谢您!

最佳答案

具有单应矩阵,这非常容易。如您所知,单应矩阵将直线映射为直线,因此您可以简单地投影输入图像线的端点
这是一些普通的伪代码:

 PointF[] pts = new PointF[] {
                new PointF(startingLinePoint.x, startingLinePoint.y),
                new PointF(endingLinePoint.x, endingLinePoint.y)
        };

 mywarpmat.ProjectPoints(pts);

点将包含您要在投影中搜索的线的起点和终点,然后您只需定义穿过它们的线即可。

关于.net - 形状校正后如何获取像素坐标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16589713/

10-10 14:10