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

标签 python opencv contour ellipse

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

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

Position1 Position2

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

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

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

        if angle > 90:
            angle = 180 - angle

如果我不做校正,其他时候我会得到错误的点,如下图相同的帧。 angle not corrected

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

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

最佳答案

我认为您唯一的问题是 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/

相关文章:

python - 如何在 ClientOSError : [Errno 104] Connection reset by peer? 时重试异步请求

c - 从文件夹加载图像(使用 C、OpenCV、Visual Studio 2008)

ios - 将 UIImage 转换为 OpenCV 中的 cv::Mat 问题

c# - EmguCV C# : FindContours() to detect different shapes

python - 如何在matplotlib中获得平滑的填充轮廓?

python - 彩色 3D 图

Python从字符串中识别时间戳格式

c++ - OpenCV 仅围绕大轮廓绘制矩形?

Python HTTP 错误 429(请求过多)

python - 安装 opencv 后 Numpy.core.multiarray 不再工作