Point vs MCvPoint2D64f,它们之间有什么区别?

问题描述 投票:0回答:1

我正在使用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;

当此值显示在文本框中时,在带有PointMCvPoint2D64F的质心点中存在差异值。

并且使用{Point},没有绘制圆,但是使用MCvPoint2D64F,它正确绘制了

它们之间有什么区别?

c# emgucv
1个回答
0
投票

[不同之处在于MCvPoint2D64F代表用double x / y坐标定义的点,而假设使用指令Point的标准集是System.Drawing.Point,则将每个点表示为一对整数。从CvInvoke.ConnectedComponentsWithStats文档中,您将看到:

质心

类型:Emgu.CV.IOutputArray

每个标签的中心输出,包括背景标签。通过x的质心(label,0)和y的质心(label,1)访问质心。数据类型CV_64F。

数据类型上的64F指示符表示64位浮点值,在C#中为double,因此您应该使用MCvPoint2D64F。 EmguCV不会尝试转换输出数组中的值,因此当您使用Point时,它将把二进制浮点表示形式复制为没有意​​义的整数。

© www.soinside.com 2019 - 2024. All rights reserved.