让我成为360°视频流中的w x h帧。
让r是那个框架上的一个红色矩形。R小于图像的宽度。
要计算这个矩形的质心,我们需要区分两种情况:
案例1,R在边缘
案例2,R完全在框架内
algorithm - 如何在360°视频中查找具有相同颜色的像素的质心?-LMLPHP
如你所见,在情况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

但它并不像预期的那样工作问题在哪里,有没有更快的解决方案?

最佳答案

这是一个基于过渡点的解决方案,即当您从红色移动到非红色或以其他方式移动时为了捕捉水平中心,我需要以下信息:
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设置为相应的位置。

07-27 19:48