在视频中测量两个轮廓之间的距离?OpenCV Python

3

我正在尝试使用Python和OpenCV测量视频中两个物体之间的距离(以像素值表示)。目前我的代码可以找到这两个物体并在第一帧中测量它们之间的距离,但无法连续地测量它们在视频中移动时的距离。由于我对OpenCV和Python都很陌生,所以非常感谢任何帮助。

import numpy as np
import cv2
import matplotlib.pyplot as plt

cap = cv2.VideoCapture('new4.avi')
centers=[] 

while(True):

    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    _, thresh = cv2.threshold(gray, 127,255,0)
    im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,
                               cv2.CHAIN_APPROX_SIMPLE)

    for c in contours:
        # If contours are too small or large, ignore them:
        if cv2.contourArea(c)<100:
            continue
        elif cv2.contourArea(c)>2000:
            continue
        cv2.drawContours(frame, [c], -1, (0,255,0), 3)

        # Find center point of contours:
        M = cv2.moments(c)
        cX = int(M['m10'] /M['m00'])
        cY = int(M['m01'] /M['m00'])
        centers.append([cX,cY])

        # Find the distance D between the two contours:
    if len(centers) >=2:
        dx= centers[0][0] - centers[1][0]
        dy = centers[0][1] - centers[1][1]
        D = np.sqrt(dx*dx+dy*dy)
        print(D)

cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
    break 

cap.release()
cv2.destroyAllWindows()

如何在视频中物体移动时连续获取距离D?


你有什么问题?在第一个框架之后,D的值是多少? - Soltius
D值为295,这是第一帧中以像素为单位的距离,但当物体移动时,即使物体已经靠近,D值仍然保持在295不变。 - agrom
我从未涉及过视频处理,所以不知道cap.read()的工作原理,但我猜想每次while循环时都会读取下一帧?你有检查过吗?例如将imshow(frame)移动到循环内部。 - Soltius
不,我想我找到了错误!我会发布一个答案。 - Soltius
1个回答

1
你应该声明变量。
center=[]

在 while 循环中,否则你的行。
centers.append([cX,cY])

保持从上一帧中心点开始添加。
dx= centers[0][0] - centers[1][0]
dy = centers[0][1] - centers[1][1]

始终从第一个从未被替换的帧中获取中心点。

整个过程中

if len(centers) >=2:

东西并不是很好,无论如何你都应该检查确切的相等性,因为如果你有超过2个轮廓,那么你肯定不想只得到前两个findContours给你的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接