Ошибка в полилинии (EMGU C ++ CLI) - PullRequest
0 голосов
/ 11 марта 2020

Добрый день, я хочу сделать машинное зрение на основе открытого cv и нашел код в C#, но мне нужно переписать его в C ++, и тогда у меня возникли трудности с одной функцией, я пытаюсь переписать код From # в C ++. Я использую форму windows и EMGU cv EMGU - это оболочка для opencv Ошибка при использовании функции ломаной линии C# код:

    public static Mat Draw(Mat modelImage, Mat observedImage, out long matchTime, int k, double uniquenessThreshold, double hessianThresh)
        {
            Mat homography;
            VectorOfKeyPoint modelKeyPoints;
            VectorOfKeyPoint observedKeyPoints;
            VectorOfVectorOfDMatch matches = new VectorOfVectorOfDMatch();
            Mat mask;
                Mat result = new Mat();
                FindMatch(modelImage, observedImage, k, uniquenessThreshold, hessianThresh, out matchTime, out modelKeyPoints, out observedKeyPoints, matches,
                   out mask, out homography);
                CvInvoke.CvtColor(observedImage, result, ColorConversion.Gray2Bgr);
                //Draw the matched keypoints
                //   result = observedImage;
                //Features2DToolbox.DrawMatches(modelImage, modelKeyPoints, observedImage, observedKeyPoints,
                //   matches, result, new MCvScalar(142, 142, 255), new MCvScalar(255, 174, 255), mask);

                #region draw the projected region on the image

                if (homography != null)
                {
                    //draw a rectangle along the projected model
                    Rectangle rect = new Rectangle(Point.Empty, modelImage.Size);
                    PointF[] pts = new PointF[]
           {
              new PointF(rect.Left, rect.Bottom),
              new PointF(rect.Right, rect.Bottom),
              new PointF(rect.Right, rect.Top),
              new PointF(rect.Left, rect.Top)
           };
                    pts = CvInvoke.PerspectiveTransform(pts, homography);

                    Point[] points = Array.ConvertAll<PointF, Point>(pts, Point.Round);
                    using (VectorOfPoint vp = new VectorOfPoint(points))
                    {
                        CvInvoke.Polylines(result, points, true, new MCvScalar(255, 144, 125, 132), 5);
                    }

                }

                #endregion
                return result;
                    }

C ++:


       void Framefind(Emgu::CV::Mat^ modelImage, Mat^ observedImage)
   {

        Emgu::CV::Mat^ homography;
                Emgu::CV::Util:: VectorOfKeyPoint^ modelKeyPoints;
                   Emgu::CV::Util::VectorOfKeyPoint^ observedKeyPoints;
                    Emgu::CV::Util::VectorOfVectorOfDMatch^ matches;
                      Emgu::CV::Util::VectorOfPoint^  vp;
                    matches=gcnew  Emgu::CV::Util::VectorOfVectorOfDMatch();
                   Mat^ mask;
                MCvScalar^   Color;     
                Color=  gcnew MCvScalar(255, 144, 125, 132);
                    Mat^ result ;  
                   result = gcnew Mat(); 
                    System::Drawing::Rectangle ^rect;
               homography=gcnew Mat();
                CvInvoke::CvtColor(observedImage, result, ColorConversion::Gray2Bgr,0);
                    if (homography != nullptr)
                      {



                            rect = gcnew System::Drawing::Rectangle(System::Drawing::Point::Empty, modelImage->Size);
                            array <PointF>  ^   pts =  gcnew array<System::Drawing::PointF>
                  {
                       PointF(rect->Left, rect->Bottom),
                     PointF(rect->Right, rect->Bottom),
                     PointF(rect->Right, rect->Top),
                      PointF(rect->Left, rect->Top)
                  };   

                 pts = CvInvoke::PerspectiveTransform(pts, homography);

                array <Point>^  points =Array::ConvertAll(pts, gcnew Converter<PointF, Point>( Point::Round));
                //
        vp = gcnew VectorOfPoint(points);

     CvInvoke::Polylines(result, vp, true, gcnew MCvScalar(255, 144, 125, 132),1,  8,0);

                       }
    }

Я считаю, что я отправляю неверные аргументы в функцию и может также быть проблема с неправильным использованием указателей

...