2023年5月30日火曜日

遺物分布図から平面座標を取得するPythonスクリプト

 Python script to get plane coordinates from relic distribution map


I created a Python script to obtain the plane coordinates from the relic distribution map (1/10 actual survey map) created at the site. I created a simple image coordinate acquisition script by asking ChatGPT. ChatGPT is useful for Python beginners.


現場で作成された遺物分布図(1/10実測図)から平面座標を取得するPythonスクリプトを作成しました。単純な画像座標取得スクリプトを素にChatGPTに質問して作成しました。Python初心者にとってChatGPTは有用です。

1 遺物分布図(1/10)から取得したい遺物平面座標

次のような画像に含まれる特定メッシュ遺物分布図に記録されている遺物ポイントの座標を取得したいのです。


遺物分布図の画像

2 画像の座標を取得するPythonスクリプト

これまでのPython学習で画像においてマウスをクリックした場所の座標取得Pythonスクリプトを作って使っています。

画像の座標を取得するPythonスクリプト

……………………………………………………………………

import cv2

def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

       print(x,y)

img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

3 平面座標取得Pythonスクリプトの作成

次図にあるように、遺物分布図メッシュの四隅の座標は既知ですから、知りたい座標と対向四隅2座標の3個所の画像座標がわかれば単純な計算で平面座標を取得できます。


画像座標3点(未知1点、既知2点)から未知点の平面座標を求める原理

2で作成した画像座標取得Pythonスクリプトを拡張すれば簡単に平面座標取得Pythonスクリプトをつくることができるはずです。

しかし、悲しいかな、そのPythonスクリプト拡張記述が判りません。丸1日web検索などで類似事例を探して試みましたが出来そうでできません。初心者のつらい状況です。その時、ChatGPTなら教えてくれるに違いないと気が付きました。そして、確かにその通りとなりました。次はその質問と回答の様子です。

……………………………………………………………………

【ChatGPTに質問】

次のPythonスクリプト(例1)では画像(b6i.png)の任意点をマウスでクリックするとその座標(x.y)を取得します。

……………………………………………………………………

#Pythonスクリプト(例1)

import cv2

def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

       print(x,y)

img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

このPythonスクリプト(例1)を使って、最初にマウスでクリックして取得した座標(x1,y1)と2番目にマウスでクリックして取得した座標(x2,y2)と3番目にマウスでクリックして取得した座標(x3,y3)について、2*(y3-y1)/(y2-y1)の値と 2*(x3-x1)/(x2-x1)の値を求めるPythonスクリプトを教えてください。


【ChatGPTからの回答】

次のようなPythonスクリプトを使用して、指定された計算を行うことができます。

……………………………………………………………………

import cv2


# クリック座標を保存するリスト

click_points = []


def onMouse(event, x, y, flags, params):

    if event == cv2.EVENT_LBUTTONDOWN:

        click_points.append((x, y))

        if len(click_points) >= 3:

            # 計算式の値を求める

            x1, y1 = click_points[0]

            x2, y2 = click_points[1]

            x3, y3 = click_points[2]

            result1 = 2 * (y3 - y1) / (y2 - y1)

            result2 = 2 * (x3 - x1) / (x2 - x1)

            print("2*(y3-y1)/(y2-y1):", result1)

            print("2*(x3-x1)/(x2-x1):", result2)


img = cv2.imread('b6i.png')

cv2.namedWindow('keisokuh22', cv2.WINDOW_NORMAL)

cv2.imshow('keisokuh22', img)

cv2.setMouseCallback('keisokuh22', onMouse)

cv2.waitKey(0)

……………………………………………………………………

このスクリプトでは、クリックされた座標を click_points リストに保存します。リストに3つ以上の座標が保存された時点で、指定された計算を実行し、結果を表示します。


ChatGPTやりとり画面

4 平面座標取得Pythonスクリプトの動作

ChatGPTに教えてもらったPythonスクリプトで求めたい平面座標を取得することができます。


平面座標を取得した様子(コマンドプロンプト画面)

今後このスクリプトを、小数点桁の表示など幾つかの点で、改良して自分好みに使い勝手をよくしていきたいと思います。

5 感想

判らないPythonスクリプトをChatGPTが教えてくれるという状況は、自分にとって「革命的」です。ChatGPTが存在しない過去では、一番の近道はPythonに詳しい人に聞くことです。それができないので自分は(あるいはほとんど全ての人が)苦労して延々と時間をかけて調べるしかないのです。ChatGPTを使うことにより、自分のPython学習・活用が急加速すると予感します。


0 件のコメント:

コメントを投稿