0

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

私はこの結果(修正された形状)を取得します:

ここに画像の説明を入力

角が両方の画像(修正前と修正後)の座標であることはわかっています。修正する前に、形状の内側にある上部の白い線の座標を知っていました。修正後にこの白い線の座標を取得するにはどうすればよいですか?

前もって感謝します!

4

2 に答える 2

2

ホモグラフィ行列は既にあるので、線上の点を取得するには、ホモグラフィを使用して最初の画像 (修正前) から点を変換するだけです。これにより、修正された画像の座標が得られます。

詳細については、ホモグラフィの数学的定義を確認してください。基本的に、この記事で p_a が定義されている方法と同様に、直線上の点 (または直線の 2 つの端点) を見つけて、同次座標で表現する必要があります。次に、ホモグラフィを使用してこれらの点を変換し、Z 座標で正規化して、変換された点の画像座標を取得します。これは、記事では p_b として定義されています。

お役に立てれば。

于 2013-05-16T14:12:11.363 に答える
1

ホモグラフィ行列を使用するのは非常に簡単です。ご存じのように、ホモグラフィ行列は直線を直線にマッピングするため、入力画像ラインの端点を単純に投影できます。バニラの疑似コードを次に示します。

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

 mywarpmat.ProjectPoints(pts);

ポイントには、投影で検索している線の開始点と終了点が含まれているため、それらを通過する線を定義するだけです。

于 2013-05-16T15:25:32.153 に答える