如何跨重叠相机检测物体

时间:2017-12-20 15:22:51

标签: python python-2.7 opencv computer-vision

我有一个多摄像头设置,但我正在将它缩小到两个摄像头来解决这个问题。两个摄像机对齐,摄像机1的右侧与摄像机2的左侧重叠,以确保没有区域远离视线。 Camera layout 两个相机共享一个共同的参考系统,即:图像2中的x轴是图像1中x轴的连续性。

当对象完全包含在一个图像中时,对于像下图这样的简单场景我没有问题:scenario 1

我的问题:

当对象穿过这个重叠区域时,我不知道如何继续进行,如下图所示。scenario 2对于我的应用程序,我需要为每个检测对象返回:中心点(x,y),边界框的高度和边界框的宽度。

到目前为止我的方法:

我正在使用图片cv2.findContourscv2.boundingRect。如果对象接触图像的任一侧,我将根据矩形的大小和图像的大小进行计算。如果他们不这样做是很容易的部分,但如果他们这样做的话,我现在就被卡住了。我不知道如何处理两个图像的值并从两个轮廓创建唯一的(x,y,w,h)点。

我目前有代码:

import numpy as np
import cv2

img1 = cv2.imread('image_from_cam1.png')
img2 = cv2.imread('image_from_cam2.png')
gray1= cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2= cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
img1_width = img1.shape[1]
img2_width = img2.shape[1]

#Thresholds on both images then find the contours
ret1, thresh1 = cv2.threshold(gray1, 127, 255, 1)
ret2, thresh2 = cv2.threshold(gray2, 127, 255, 1)
cnts1, _ = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts2, _ = cv2.findContours(thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

result = [] #result list that will contain [(x1,y1,w1,h1), ...]
overlap = False #is the object overlapping across several images
l1 = [] #storage list for sub-results in image1
l2 = [] #storage list for sub-results in image2

#loop over contours of image1 to draw rectangles and check if they touch either left of right border
for cnt in cnts1:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img1, (x,y), (x+w, y+h), (0,255,0), 2)
    #Test if the bounding box touches the border of the screen
    if x<2 or (x+w)>(img1_width - 2):
        overlap = True
        l1.append((x,y,w,h))
    else:
        #the object is fully contained in image1
        result.append((x,y,w,h))

#loop over contours of image2 to draw rectangles and check if they touch either left of right border
for cnt in cnts2:
    x,y,w,h = cv2.boundingRect(cnt)
    cv2.rectangle(img2, (x,y), (x+w, y+h), (0,255,0), 2)
    #Test if the bounding box touches the border of the screen
    if x<2 or (x+w)>(img2_width - 2):
        overlap = True
        l2.append((x,y,w,h))
    else:
        #the object is fully contained in image2
        result.append((x,y,w,h))

cv2.imshow('cam1',img1)
cv2.imshow('cam2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

因此,同一个对象将在两个图像中为我提供两组不同的(x,y,w,h)和cv2.boundingRect。如何获得对象的“真实”(x,y,w,h)?或者从我的代码:如果对象重叠,如何从resultl1创建l2

1 个答案:

答案 0 :(得分:1)

我知道这已经晚了一年,但是其他人可能会觉得有用。

一种可能的解决方案是: 如果您的Y轴将始终对齐,则使用单个X和Y轴定义一个新的坐标系。因此,对于任何一对图像,您始终只有两个轴。

从左框中获取相应的X值,然后减去重叠的像素。 假设从左开始x = 0。 大概是:

if x_main <= x_left_max:
    x_main = x_left
else:
    x_main = x_left_max + (x_right - overlap)

创建转换器函数,并始终在自定义坐标空间中处理对象。