Добрый день, я хочу сделать машинное зрение на основе открытого 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);
}
}
Я считаю, что я отправляю неверные аргументы в функцию и может также быть проблема с неправильным использованием указателей