In [2]:
# 座標四点を指定するプログラム
# 実行後謎のウィンドウが残るかもしれません...
import tkinter as tk
import cv2
import yolov5

root = tk.Tk()
root.withdraw()
root.destroy()
from tkinter import messagebox 
# 画像を表示する際の倍率です。お好みの大きさに変更してください
img_size = 0.8

window_name = 'img'
before = []
img = cv2.imread(r'practice_exercise_data\img\opencv_img\demoimg_0000.jpg')
weapons = [["左上"], ["右上"], ["右下"], ["左下"]]

def onMouse(event, x, y, flags, params):
    if event == cv2.EVENT_LBUTTONDOWN:
        x = int(x / img_size)
        y = int(y / img_size)
        before.append([x,y])
        cv2.destroyAllWindows()
        if len(before) == 4:
            cv2.destroyAllWindows()
            
for weapon in weapons:
    ok = ""
    ok = messagebox.showinfo("確認", str(weapon) + "をクリックしてください")
    if ok=="ok":
        cv2.imshow(window_name, cv2.resize(img, (int(1920 * img_size), int(1080 * img_size))))
        cv2.setMouseCallback(window_name, onMouse)

        cv2.waitKey(0)
        cv2.destroyAllWindows()

# 確認用に赤線を描画しています。マッピングと直接関係はないので気にしなくて大丈夫です。
if len(before) == 4:
    cv2.line(img, before[0], before[1], (0, 0, 255), thickness=5)
    cv2.line(img, before[1], before[2], (0, 0, 255), thickness=5)
    cv2.line(img, before[2], before[3], (0, 0, 255), thickness=5)
    cv2.line(img, before[3], before[0], (0, 0, 255), thickness=5)

    cv2.imshow(window_name, cv2.resize(img, (int(1920 * img_size), int(1080 * img_size))))
    print(before) # クリックした座標を格納している配列を表示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
else:
    print("四点をクリックするまではキーを押さないでください。使いにくくてすみませんm(__)m")
[[960, 646], [956, 657], [941, 645], [941, 621]]