如何在360°视频中查找具有相同颜色的像素的质心?

时间:2018-07-30 08:20:43

标签: algorithm math computer-vision 360-degrees

成为来自360°视频流的w x h帧。 令 R 为该框架上的红色矩形。 R 小于图像的宽度。

要计算此矩形的质心,我们需要区分两种情况:

  • 情况1,其中 R 位于边缘
  • 情况2,其中 R 完全在框架内

Case 1 and 2 illustrated

如您所见,在案例1中,用经典方法计算质心会出现问题。请注意,我只关心水平重叠。

目前,我正在这样做。首先,我们检测到找到的第一个点并将其用作参考,然后归一化dx(这是一个点与参考之间的差异),然后进行累加:

width = frame.width
rectangle_pixel = (255,0,0)
first_found_coord = (-1,-1)
centroid = (0,0)
centroid_count = 0

for pixel, coordinates in image:
  if(pixel != rectangle_pixel): 
    continue
  if(first_found_coord == (-1,-1)):
    first_found_coord = coordinates 
    centroid = coordinates
    continue

  dx = coordinates.x - first_found_coord.x
  if(dx > width/2):
    dx -= width
  else if(dx < - width/2):
    dx -= width

  centroid += (dx, coordinates.y)
  centroid_count++


final_centroid = centroid / centroid_count 

但是它没有按预期工作。问题出在哪里,有没有更快的解决方案?

2 个答案:

答案 0 :(得分:0)

这是基于过渡点的解决方案,即当您从红色变为非红色时,或者以其他方式转换时。要捕获水平中心,我需要以下信息:

gridSize.x:矩形可以居住的空间的宽度。 w:矩形的宽度。

伪代码:

redPixel = (255,0,0);

transitionPoints = [];
betweenTransitionsColor = -1;

// take i and i+1 pixel+position, increment i by one at each step. 
for (pixel1, P1), (pixel1, P2) in gridX : // horizontal points for a fixed `y` 
  if pixel1 != pixel2: // one is red, the other white
     nonRedPosition = (pixel1 != redPixel ? P1 : P2)
     transitionPoints.append(nonRedPosition)
     continue
  if(transitionPoints.length == 1 && betweenTransitionsColor == -1):
     betweenTransitionsColor = pixel2

  if transitionPoints.length == 2:
      break

//Case where your rectangle is on the edge (left or right)
if(transitionPoints.length == 1):
  if(abs(transitionPoints[0].x - w) < 2):
    xCenter = w/2
  else:
    xCenter = gridSize.x - w/2

else:
  [tP1, tP2] = transitionPoints

  // case 1 : The rectangle is splitted
  if betweenTransitionsColor != redPixel:
    xCenter = (tP2.x - gridSize.x + tP1.x)/2
  else:
    xCenter = (tP1.x + tP1.x)/2

注意:

您必须从y位置开始,该位置可能会出现红色像素。这应该不是很难实现的。如果您的rectangle's height大于gridSize.y/2,则可以从gridSize.y/2开始。否则,您可以搜索第一个红色像素,并将y设置为相应的位置。

答案 1 :(得分:0)

由于我正在计算同一范围内的边界框,因此分两步进行。 首先,我要累积感兴趣像素的坐标。然后,当我检查重叠的边框时,我将图像右半部分的每种重叠颜色的和减去。所以我最终得到了一个完整但可滑动的矩形。

最后,我除以每种颜色找到的点数。如果结果是负数,则将其移动图像宽度的大小。


或者:

def get_centroid(image, interest_color):
    acc_x = 0
    acc_y = 0
    count = 0
    first_pixel = (0,0)

    for (x,y, color) in image:
      if(color not in interest_color):
        continue

      if(count == 0):
        first_pixel = (x,y)

      dx = x - first_pixel.x

      if(dx > L/2)
        dx -= L
      else if (dx < -L/2)
        dx += L

      acc_x += x
      acc_y += y
      count++

    non_scaled_result = acc_x / count, acc_y / count
    result = non_scaled_result + first_pixel

    return result