これは、この質問の続きです: Finding Squares in Image
そこでの回答の手順に従いました: https://dsp.stackexchange.com/a/7526/818、以下のような回答を得ました:
しかし、その答えの最後で、私は問題を説明しました。それが私の質問です。
説明 :
前のリンクのステップ 1 で検出された四角形の重心は既にあります (これらの検出された四角形は、以下の mask_image でマークされています)。
以下のようにグリッド画像を作成しました(重心値も知っています):
また、グリッド イメージのどの点を mask_image の対応する点にマッピングするかを調べました。
その情報を使用して、scipy.interpolate.griddata()を適用し、次に OpenCV の cv2.remap() 関数を適用しました。
その結果を以下に示します。
ご覧のとおり、中央の 2 つを除くすべての正方形が切り取られています。これは、出力に mask_image のすべての重心を結んで描かれた境界内の領域のみが含まれているようなものです。
シーンは以下でさらに悪化します:
最後の正方形 (黄色) または四隅の他の正方形が最初のステップで検出されない場合、状況はさらに悪化します。最後のものが検出されないことを考慮してください。次に、私が得た結果を以下に示します。下部に斜めのカットが表示されます (黄色でマークされています)。
質問 :
私が与えたポイントを超えてリマップ機能が機能しないのはなぜですか? クリッピングせずに再マップするにはどうすればよいですか?
エッジではないいくつかのポイントを指定しても、画像全体で機能すると思いました。
期待される出力:
以下は、操作の最後に期待した出力です。(赤枠内が実際に取得したものです)
いくつかの良い提案を探しています...
アップデート :
ここにもコードを追加します。リマッピング部分コードのみ追加。完全なコードは大きすぎてここに追加できません:
# ideal - the grid image - http://i.stack.imgur.com/3QudG.png
# centroids - list of centroids of the squares in mask_image - http://i.stack.imgur.com/jh6bQ.png
# match_pts - list of centroids of the squares in grid image corresponding to squares in mask_image
# warped - the final image obtained after remap - http://i.stack.imgur.com/O26ZA.png
grid_x,grid_y = np.meshgrid(np.arange(ideal.shape[1]),np.arange(ideal.shape[0]))
dst = np.array(centroids)
src = np.array(match_pts)
grid_z = griddata(dst,src,(grid_x,grid_y),method='cubic')
map_x_32 = grid_z[:,:,0].astype('float32')
map_y_32 = grid_z[:,:,1].astype('float32')
warped = cv2.remap(ideal, map_x_32, map_y_32, cv2.INTER_CUBIC)
また、centroids、match_pts などのデータを追加して、誰かが試してみたい場合に、イメージからデータを見つける代わりにデータを直接使用できるようにしました: gist.github.com/4540887