3

我正在执行对象的运动跟踪,并且我正在尝试识别对象的正面和背面。物体是不对称的,这意味着轮廓的质心更靠近前面而不是后面。使用此信息,我将按以下方式处理此问题:

  1. 绘制物体的轮廓

  2. 寻找质心

    centroidx, centroidy = int(moments['m10']/moments['m00']), int(moments['m10']/moments['m00'])
  3. 绘制边界椭圆

    cv2.fitEllipse(contour)
  4. 计算长轴长度如下(如图所示)

    MAx, MAy = int(0.5 * ellipseMajorAxisx*math.sin(ellipseAngle)), int(0.5 * ellipseMajorAxisy*math.cos(ellipseAngle))
  5. 计算主轴的开始和结束x,y坐标

    MAxtop, MAytop = int(ellipseCentrex + MAx), int(ellipseCentrey + MAy)
    MAxbot, MAybot = int(ellipseCentrex - MAx), int(ellipseCentrey - MAy)
  6. 确定哪些点更接近轮廓的质心

    distancetop = math.sqrt((centroidx - MAxtop)**2 + (centroidy - MAytop)**2)
    distancebot = math.sqrt((centroidx - MAxbot)**2 + (centroidy - MAybot)**2)
    min(distancetop, distancebot)

我遇到的问题是,虽然我得到椭圆的“前端”大部分时间都是正确的,但偶尔点有点偏离。据我观察,这似乎正在发生,x 值是正确的,但 y 值不同(实际上,我认为这表示垂直于我的椭圆的长轴)。我不确定这是否是 opencv 计算角度的问题,或者(很可能)我的计算不正确。我确实意识到这是一个复杂的例子,希望我的数字有所帮助!

位置1 位置2

编辑:当我得到错误的点时,它不是来自垂直椭圆,而是来自我的椭圆的镜像。它也发生在 x 值上,而不仅仅是 y。

在遵循下面 ssm 的建议之后,我大部分时间都得到了想要的点。这点偶尔还是会出错,但很快就会“弹回”到位。例如,这是发生这种情况时的几帧: 改善

顺便说一句,上面的图像是在使用以下代码“校正”角度之后:

        if angle > 90:
            angle = 180 - angle

如果我不进行更正,我会在其他时间得到错误的点,如下所示相同帧。 角度未校正

所以看起来我对某些角度进行了角度校正而其他角度没有校正。如何在这两种情况下获得所有正确的分数?

(椭圆内的白点是轮廓的质心,而椭圆上或椭圆外的点是我得到的点)

4

1 回答 1

1

我认为你唯一的问题是MAytop. 您可以考虑执行以下操作:

if ycen<yc:
    # switch MAytop and MAybot
    temp = MAytop
    MAytop = MAybot
    MAybot = temp

您可能需要在 x 尺度上进行类似的检查

于 2016-01-30T00:54:13.607 回答