使用像素距离计算现实世界距离

Loo*_*ers 5 python opencv computer-vision opencv3.0

我有两张图像,此处为车辆进入该区域的图像,另一张图像为此处车辆退出该区域的图像

我使用安装在道路上的单个闭路电视摄像机拍摄了这些图像。

现在我想计算它在现实世界中行驶的距离以找到车辆的速度。我使用对象检测来获取两个图像中车牌号的边界框,然后我可以计算像素距离。仅当图像平面和道路平面彼此平行时,我才能将像素距离映射到现实世界(我正在使用这种技术,但它没有给出准确的结果)。由于我的相机与道路倾斜,因此我无法使用该技术。

我尝试了一些研究论文,但找不到与我的问题相关的任何有用信息。有人请分享这样做的见解,这会有所帮助。

fla*_*ite 3

在这个问题中,我们有单个摄像机视图,因此您无法使用摄像机视图几何体找到对象之间的真实世界距离。尽管我们可以通过考虑具有已知现实世界单位长度值的某些参考对象,将图像像素转换为现实世界单位。

在捕获的示例图像中,您可以识别道路车道标记,如下图所示,并了解它们以现实世界单位表示的长度,您可以找到与现实世界距离的像素。

下面是道路车道标记检测方法的快速且基本的实现。这还将为您提供图像中汽车、自行车等物体的轮廓,但一旦您知道这些物体的物体边界框,您就可以通过在这些物体上应用蒙版来删除这些轮廓。

img = cv2.imread("road_lane.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.blur(gray, (3, 3))
# Find Canny edges
edged = cv2.Canny(blur, 30, 200)

# Finding Contours
contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
boundRect = []
for i, c in enumerate(contours):
    #ignore large and small contours
    if len(c) < 300 and len(c) > 100 :
        box = cv2.boundingRect(c)
        #check for vertical rectangles
        if box[2] < box[3]:
           boundRect.append(box)

for i in range(len(boundRect)):
    cv2.rectangle(img, (int(boundRect[i][0]), int(boundRect[i][1])), (int(boundRect[i][0] + boundRect[i][2]), int(boundRect[i][1] + boundRect[i][3])), (255, 0, 0), 5)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述