2024年4月21日日曜日

手書き遺物分布図画像から座標計測する方法

 How to measure coordinates from a handwritten artifact distribution map image


As the future of digitizing antiquities registers has become brighter, I have considered a method for measuring planar coordinates from images of handwritten artifact distribution map image. By effectively using BlenderPython, measurements can be performed comfortably. However, measuring 63,000 relics requires considerable labor.


遺物台帳電子化の先行きが明るくなりましたので、手書き遺物分布図画像から平面座標を計測する方法を検討しました。BlenderPythonを効果的に使うことにより、快適操作で計測できます。ただ63000遺物計測はかなりの力仕事になります。

1 手書き遺物分布図画像から座標計測する方法

1-1 事例グリッド(Ⅱ-58)の場所


事例グリッド(Ⅱ-58)の場所

1-2 手書き遺物分布図画像のグリッド別切り抜き


手書き遺物分布図スキャン画像(Ⅱ-48及びⅡ-58グリッド)

手書き遺物分布図スキャン画像の傾きを補正して正立させ、グリッド単位で正確に切り抜きます。(Photoshop作業)


グリッド切り抜き画像(Ⅱ-58グリッドの例)


拡大図

1-3 グリッド切り抜き画像のBlenderプロットとグリッド位置正置

グリッド切り抜き画像を「画像を平面で」でBlenderにインポートし、寸法をX:2m、Y:2mに変更し、X軸とY軸が合うように回転させ(この場合Z:90°)ます。

画像を選択した状態で、オブジェト→原点を設定→原点を3Dカーソルへ移動をクリックして、画像の中央に原点を設定します。

画像位置を当該グリッドに移動します。(Ⅱ-58グリッドの場合、Ⅹ:11m、Y:27m)

1-4 CUBEを生成し遺物番号位置に配置する

「カーソル位置にCUBEを生成するBlenderPythonスクリプト」をテキストエディターに読み込みます。

カーソル位置にCUBEを生成するBlenderPythonスクリプト(ChatGPT支援により作成)

  1. import bpy

  2. # カーソルの位置を取得

  3. cursor_location = bpy.context.scene.cursor.location

  4. # 新しい立方体を作成

  5. bpy.ops.mesh.primitive_cube_add(size=0.01, location=cursor_location)

  6. # 作成した立方体を選択

  7. new_cube = bpy.context.active_object

  8. # マテリアルを作成

  9. material = bpy.data.materials.new(name="Red")

  10. material.diffuse_color = (1.0, 0.0, 0.0, 1.0) # 赤色

  11. # 立方体にマテリアルを適用

  12. if new_cube.data.materials:

  13. # マテリアルが既に存在する場合、最初のスロットに新しいマテリアルを挿入

  14. new_cube.data.materials[0] = material

  15. else:

  16. # マテリアルが存在しない場合、新しいマテリアルを追加

  17. new_cube.data.materials.append(material)

ギズモのZをクリックして上から画像を見下ろします(上からオルソ投影にします)。

遺物位置にカーソルを移動し、テキストエディターのスクリプト実行ボタン(黒い三角)をクリックします。遺物位置にCUBE(赤い0.01m×0.01m×0.01mのCUBE)が生成しますので、アウトライナーの当該CUBE欄で名称を当該遺物番号に変更します。

同様に、遺物毎にカーソル位置変更→スクリプト実行→名称変更を繰り返します。


幾つかの遺物位置に赤CUBEを生成した様子(オルソ投影)


斜め表示

1-4 CUBEの名称と座標をファイル出力する

「CUBEの名称と座標をファイル出力するBlenderPythonスクリプト」をテキストエディターに読み込みます。

CUBEの名称と座標をファイル出力するBlenderPythonスクリプト(ChatGPT支援により作成)

  1. import bpy
  2.  
  3. # 出力ファイルのパス
  4. output_file = "E:/test/text.txt"
  5.  
  6. # 選択されたオブジェクトを取得
  7. selected_objects = bpy.context.selected_objects
  8.  
  9. # 出力用のテキストを準備
  10. output_text = ""
  11.  
  12. # オブジェクトごとに名前と座標を取得してテキストに追加
  13. for obj in selected_objects:
  14. name = obj.name
  15. location = obj.location
  16. x, y, z = location
  17. output_text += f"{name},{x},{y},{z}\n"
  18.  
  19. # テキストファイルに書き込み
  20. with open(output_file, 'w') as file:
  21. file.write(output_text)
  22.  
  23. print(f"Output written to {output_file}")

全てのCUBEを選択し、スクリプト実行ボタンをクリックします。遺物番号とⅩ座標、Y座標がファイル出力されます。(スクリプトは汎用性をもたせるためにここではZ座標も一緒に出力していますが、Z座標は不用です。)


ファイル出力した様子

参考 aaaはグリッド左上頂点のデータ、bbbはグリッド右下頂点のデータです。

今後、スクリプトを調整して桁数を実用レベルに(見やすく)するために減じる予定です。

2 遺物の3D座標

1の方法で取得したⅩ座標、Y座標データと遺物台帳から取得したZ座標データを遺物毎に合わせると遺物の3D座標となります。遺物毎に2つのデータを合わせる作業はPythonスクリプトで行います。

3 感想

遺物分布図から遺物平面座標を求める具体的で確かな方法を構築できました。作業したBlenderファイルを保存しておくことで、どの遺物の座標を読み取ったのかという状況が後からチェックできます。作業操作感も自分は快適に感じるのでとても実用的であると考えます。あとは63000件を力仕事として処理するだけです。

遺物台帳入力完遂のメドがたってきましたので、試行的に特定グリッドの遺物分布図から座標を読み取り、遺物台帳座標とあわせて、遺物3D分布モデルを作成してみることにします。


0 件のコメント:

コメントを投稿