我正在对一个物体进行运动跟踪,我正在尝试识别物体的正面和背面。对象是不对称的,这意味着轮廓的质心比后面更靠近前面。使用此信息,我按如下方式处理此问题:
画出物体的轮廓
寻找质心
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
所以看起来我对某些角度进行了角度校正而对其他角度进行了正确校正而没有进行校正。如何在两种情况下都获得所有正确的分数?
(椭圆内的白点是轮廓的质心,而椭圆上或椭圆外的点是我得到的点)
最佳答案
我认为您唯一的问题是 MAytop
。您可以考虑执行以下操作:
if ycen<yc:
# switch MAytop and MAybot
temp = MAytop
MAytop = MAybot
MAybot = temp
您可能需要对 x 尺度进行类似的检查
关于python - 如何在opencv中获取旋转椭圆主轴的起点和终点坐标(x,y)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35096550/