如何在形状修正后得到像素坐标?

时间:2013-05-16 14:09:07

标签: .net opencv image-processing computer-vision emgucv

我正在为OpenCV使用EmguCV包装器,我正在纠正这种形状: enter image description here

借助此代码:

 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;
        }

我得到了这个结果(整形后):

enter image description here

我知道角落协调两个图像(整流前后)。 在整改之前,我知道形状内的上白线的坐标。 任何想法如何在整改后得到这条白线的坐标?

提前谢谢!

2 个答案:

答案 0 :(得分:2)

你已经有了单应矩阵,所以为了获得线上的点,只需使用单应性从第一张图像(整流前)转换点。这将为您提供经过校正的图像中的坐标。

有关详细信息,请查看homography的数学定义。基本上,您需要在线上(或线的两个端点)找到点,并在齐次坐标中表示它们,类似于文章中定义的p_a的方式。然后使用单应性变换这些点并通过Z坐标进行归一化以获得变换点的图像坐标。这在文章中被定义为p_b。

希望这有帮助。

答案 1 :(得分:1)

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

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

 mywarpmat.ProjectPoints(pts);

Pts 将包含您在投影中搜索的线的起点和终点,然后您必须简单地定义通过它们的线。