Point vs MCvPoint2D64f, в чем разница между ними? - PullRequest
1 голос
/ 10 февраля 2020

Я кодирую в проекте, который использует метод ConnectedCompnents

Мой код:

temp = img.ThresholdBinary(new Gray(50), new Gray(255));
Mat label=new Mat();
Mat stats = new Mat();
Mat centroid = new Mat();


int nlabels = CvInvoke.ConnectedComponentsWithStats(temp, label, stats, centroid);
MCvPoint2D64f[] centerpoints = new MCvPoint2D64f[nlabels];
Point[] centerpoints2 = new Point[nlabels];
centroid.CopyTo(centerpoints);
centroid.CopyTo(centerpoints2);

foreach (MCvPoint2D64f pt in centerpoints)
{
    textBox1.AppendText($"x : {pt.X}  ,  y : {pt.Y}");
    CvInvoke.Circle(img, new Point((int)pt.X,(int)pt.Y), 10,new MCvScalar(0,0,255),3);
}

foreach (Point pt in centerpoints2)
{
    textBox2.AppendText($"x : {pt.X}  ,  y : {pt.Y}");
    CvInvoke.Circle(img2, new Point(pt.X, pt.Y), 10, new MCvScalar(0, 0, 255), 3);
}

imageBox2.Image = img;
imageBox1.Image = img2;

В centroidPoints есть значения разности с Point и MCvPoint2D64F, когда эти значения отображаются в textboxes.

А с {Point} круги не нарисованы, а с MCvPoint2D64F они нарисованы правильно

В чем разница между ними?

1 Ответ

2 голосов
/ 11 февраля 2020

Разница в том, что MCvPoint2D64F представляет точку, определенную с double координатами x / y, в то время как при условии довольно стандартного набора директив использования Point будет System.Drawing.Point , который представляет каждый указать как пару целых чисел. Из документации CvInvoke.ConnectedComponentsWithStats вы увидите:

центроиды

Тип: Emgu.CV.IOutputArray

выход центроида для каждого метка, включая фоновую метку. Доступ к центроидам осуществляется через центроиды (метка, 0) для х и центроиды (метка, 1) для у. Тип данных CV_64F.

Обозначение 64F для типа данных указывает 64-разрядное значение с плавающей запятой, равное double в C#, поэтому вам следует использовать MCvPoint2D64F. EmguCV не будет пытаться преобразовать значения в выходном массиве, поэтому, когда вы используете Point, он скопирует двоичное представление с плавающей запятой в целые числа, которые не имеют смысла.

...