2

opencv と Python でステッチを作成しています。結果の画像の正確な最終サイズを計算することができません。私の画像は常に大きすぎて、黒い枠があります。また、写真同士が合体したところに黒い線が入っているのでオフセットが合っていないようです。

ここに私の機能があります:

    def calculate_size(size_image1, size_image2, homography):

      ## Calculate the size and offset of the stitched panorama.

      offset = abs((homography*(size_image2[0]-1,size_image2[1]-1,1))[0:2,2]) 
      print offset
      size   = (size_image1[1] + int(offset[0]), size_image1[0] + int(offset[1]))
      if (homography*(0,0,1))[0][1] > 0:
        offset[0] = 0
      if (homography*(0,0,1))[1][2] > 0:
        offset[1] = 0

      ## Update the homography to shift by the offset
      homography[0:2,2] +=  offset

      return (size, offset)


## 4. Combine images into a panorama. [4] --------------------------------
def merge_images(image1, image2, homography, size, offset, keypoints):

  ## Combine the two images into one.
  panorama = cv2.warpPerspective(image2,homography,size)
  (h1, w1) = image1.shape[:2]

  for h in range(h1):
    for w in range(w1):
        if image1[h][w][0] != 0 or image1[h][w][3] != 0 or image1[h][w][4] != 0:
            panorama[h+offset[1]][w + offset[0]] = image1[h][w]

  ## TODO: Draw the common feature keypoints.

  return panorama

そして私の結果:

1枚目の画像:最初の画像

2枚目の画像:2 番目の画像

ステッチ画像:ステッチ結果

私は何を間違っていますか?

4

3 に答える 3

2
if (homography*(0,0,1))[0][1] > 0:
    offset[0] = 0
if (homography*(0,0,1))[1][2] > 0:
    offset[1] = 0

あなたのコードは間違っています.次のように正しいもの:

if (homography*(0,0,1))[0][2] > 0:
    offset[0] = 0
if (homography*(0,0,1))[1][2] > 0:
    offset[1] = 0
于 2014-07-05T11:07:55.497 に答える
0

ステッチによると、すべてのプロセスは正しいです。結果は、元の画像によるものです。

for h in range(h1):
  for w in range(w1):
    if image1[h][w][0] != 0 or image1[h][w][3] != 0 or image1[h][w][4] != 0:
        panorama[h+offset[1]][w + offset[0]] = image1[h][w]

この操作は、色がゼロのピクセルのみをフィルタリングします。実際、一部のピクセルは黒のように見えますが、純粋な黒ではなく、黒に非常に近いものです。したがって、これらはプログラムによって除外されないように見える黒いピクセルです。

于 2014-06-29T04:10:17.853 に答える