如何找到动态二值图像中点的中心

1 投票
1 回答
1418 浏览
提问于 2025-04-17 20:37

我已经用Python的opencv库做了两周的项目。我想找到一个移动物体的中心。

我首先对两帧图像进行差分处理,然后用位运算。经过位运算后,结果显示出一群白点,围绕着移动的物体(四旋翼飞行器),就像下面的图片所示。

所以我想问:在这种情况下,我应该用什么方法来找到移动物体(四旋翼飞行器)的中心呢?

我想也许可以找到这些白点的平均中心,但我不知道该怎么做。

这里有一张示例图片

ss

ss2



这是我的代码

import cv2

def diffImg(t0, t1, t2):
    d1 = cv2.absdiff(t2, t1)
    d2 = cv2.absdiff(t1, t0)
return cv2.bitwise_and(d1, d2)

cam = cv2.VideoCapture('track_outdoor.avi')

winName = "Movement Indicator"
cv2.namedWindow(winName, cv2.CV_WINDOW_AUTOSIZE)

# Read three images first:
t_minus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
t = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)
t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)


while True:
    diff_frame=  diffImg(t_minus, t, t_plus)

    cv2.imshow( 'Original', t_plus )
    cv2.imshow( winName, diff_frame )
    # Read next image
    t_minus = t
    t = t_plus
    t_plus = cv2.cvtColor(cam.read()[1], cv2.COLOR_RGB2GRAY)

    key = cv2.waitKey(10)
    if key == 27:
       cv2.destroyWindow(winName)
       break

更新 #1

首先感谢dervish的回答

我尝试了找到质心的方法,虽然有效,但正如dervish所说,结果并不够准确。

所以我想到了另一个主意,如果我增强差分图像的亮度,这样会不会更容易、更准确地使用轮廓或其他方法呢?

1 个回答

0

你可以尝试几种方法,

  • 首先,可以计算所有点的x坐标的平均值,再计算y坐标的平均值,不过这种方法可能不够准确。
  • 接下来,我们需要定义包含这些点的规则轮廓:

    • 三角形 => 找到三角形的中心
    • 圆形 => 找到圆形的中心,甚至是矩形的中心。
    • 关于这部分,我建议你看看这些opencv函数
  • 如果你能找到不规则的形状,可以使用“矩”来计算质心:把你的点放到一个变量里,比如 vector<Points> contour; 然后执行以下操作:

moments mom= moments(Mat(contour));
// 找到质心
Point mc= Point(mom.m10/mom.m00,mom.m01/mom.m00);

撰写回答