我正在执行对象的运动跟踪,并且我正在尝试识别对象的正面和背面。物体是不对称的,这意味着轮廓的质心更靠近前面而不是后面。使用此信息,我将按以下方式处理此问题:
绘制物体的轮廓
寻找质心
centroidx, centroidy = int(moments['m10']/moments['m00']), int(moments['m10']/moments['m00'])
绘制边界椭圆
cv2.fitEllipse(contour)
计算长轴长度如下(如图所示)
MAx, MAy = int(0.5 * ellipseMajorAxisx*math.sin(ellipseAngle)), int(0.5 * ellipseMajorAxisy*math.cos(ellipseAngle))
计算主轴的开始和结束x,y坐标
MAxtop, MAytop = int(ellipseCentrex + MAx), int(ellipseCentrey + MAy) MAxbot, MAybot = int(ellipseCentrex - MAx), int(ellipseCentrey - MAy)
确定哪些点更接近轮廓的质心
distancetop = math.sqrt((centroidx - MAxtop)**2 + (centroidy - MAytop)**2) distancebot = math.sqrt((centroidx - MAxbot)**2 + (centroidy - MAybot)**2) min(distancetop, distancebot)
我遇到的问题是,虽然我得到椭圆的“前端”大部分时间都是正确的,但偶尔点有点偏离。据我观察,这似乎正在发生,x 值是正确的,但 y 值不同(实际上,我认为这表示垂直于我的椭圆的长轴)。我不确定这是否是 opencv 计算角度的问题,或者(很可能)我的计算不正确。我确实意识到这是一个复杂的例子,希望我的数字有所帮助!
编辑:当我得到错误的点时,它不是来自垂直椭圆,而是来自我的椭圆的镜像。它也发生在 x 值上,而不仅仅是 y。
在遵循下面 ssm 的建议之后,我大部分时间都得到了想要的点。这点偶尔还是会出错,但很快就会“弹回”到位。例如,这是发生这种情况时的几帧:
顺便说一句,上面的图像是在使用以下代码“校正”角度之后:
if angle > 90:
angle = 180 - angle
如果我不进行更正,我会在其他时间得到错误的点,如下所示相同帧。
所以看起来我对某些角度进行了角度校正而其他角度没有校正。如何在这两种情况下获得所有正确的分数?
(椭圆内的白点是轮廓的质心,而椭圆上或椭圆外的点是我得到的点)