我有一个多摄像头设置,但我正在将它缩小到两个摄像头来解决这个问题。两个摄像机对齐,摄像机1的右侧与摄像机2的左侧重叠,以确保没有区域远离视线。 两个相机共享一个共同的参考系统,即:图像2中的x轴是图像1中x轴的连续性。
当对象完全包含在一个图像中时,对于像下图这样的简单场景我没有问题:
我的问题:
当对象穿过这个重叠区域时,我不知道如何继续进行,如下图所示。对于我的应用程序,我需要为每个检测对象返回:中心点(x,y),边界框的高度和边界框的宽度。
到目前为止我的方法:
我正在使用图片cv2.findContours
和cv2.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)?或者从我的代码:如果对象重叠,如何从result
和l1
创建l2
?
答案 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)
创建转换器函数,并始终在自定义坐标空间中处理对象。