gpt4 book ai didi

python - 如何跨重叠相机检测物体

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:37 25 4
gpt4 key购买 nike

我有一个多摄像头设置,但为了解决这个问题,我将范围缩小到两个摄像头。两个摄像头对齐,摄像头 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()

所以同一个对象会在两张图片中给我 2 组不同的 (x,y,w,h) 和 cv2.boundingRect。我怎样才能得到对象的“真实”(x,y,w,h)?或者从我的代码:如果对象重叠,如何从 l1l2 创建 result

最佳答案

我知道这已经晚了一年,但其他人可能会发现这很有用。

一个可能的解决方案是:如果您的 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)

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

关于python - 如何跨重叠相机检测物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47909321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com