首页 文章

如何在opencv中获取旋转椭圆长轴的起点和终点坐标(x,y)?

提问于
浏览
2

我正在执行对象的运动跟踪,我正在尝试识别对象的正面和背面 . 物体是不对称的,这意味着轮廓的质心比背部更接近前部 . 使用这些信息,我接近这个如下:

  • 绘制物体的轮廓

  • 查找质心

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计算角度的问题还是(很可能)我的计算不正确 . 我确实意识到这是一个复杂的例子,希望我的数字有所帮助!

Position1

Position2

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

按照下面的ssm建议,我大部分时间都得到了理想的点 . 这个问题偶尔会出现问题,但很快就会出现.850586_ . 例如,发生这种情况时会出现几帧:
improved

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

if angle > 90:
            angle = 180 - angle

如果我不进行校正,我会在其他时间得到错误的点,如下所示,相同的帧 .
angle not corrected

所以看起来我对于角度校正的某些角度和没有校正的其他角度都是正确的 . 如何在两种情况下获得所有正确的分数?

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

1 回答

  • 1

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

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

    您可能需要对x级进行类似的检查

相关问题