如何找到动态二值图像中点的中心
我已经用Python的opencv库做了两周的项目。我想找到一个移动物体的中心。
我首先对两帧图像进行差分处理,然后用位运算。经过位运算后,结果显示出一群白点,围绕着移动的物体(四旋翼飞行器),就像下面的图片所示。
所以我想问:在这种情况下,我应该用什么方法来找到移动物体(四旋翼飞行器)的中心呢?
我想也许可以找到这些白点的平均中心,但我不知道该怎么做。
这里有一张示例图片
这是我的代码
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);