import cv2
import numpy as np
# 元画像とテンプレート画像のパス
image_path = "checkerboard.png"
# 元画像を読み込む
img = cv2.imread(image_path)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# テンプレート画像として使用する部分を指定して切り取る(例: 画像の左上を30%の範囲で切り取る)
height, width = gray_img.shape
cut_width = int(width * 0.30)
cut_height = int(height * 0.30)
template = gray_img[0:cut_height, 0:cut_width]
# テンプレートマッチングを実行
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)
# マッチングのしきい値を0.99に設定
threshold = 0.99
loc = np.where(result >= threshold)
# 初期化
min_y_when_x_zero = float('inf')
min_x_when_y_zero = float('inf')
# 見つかった場所をチェック
for pt in zip(*loc[::-1]):
if pt[0] == 0 and pt != (0, 0):
min_y_when_x_zero = min(min_y_when_x_zero, pt[1])
if pt[1] == 0 and pt != (0, 0):
min_x_when_y_zero = min(min_x_when_y_zero, pt[0])
# 結果をプリント
print(f"Xがゼロのときの最小Yの座標 (excluding (0, 0)): {min_y_when_x_zero}")
print(f"Yがゼロのときの最小Xの座標 (excluding (0, 0)): {min_x_when_y_zero}")
# 指定された範囲を元画像から切り取る
if min_x_when_y_zero != float('inf') and min_y_when_x_zero != float('inf'):
cropped_img = img[0:min_y_when_x_zero - 1, 0:min_x_when_y_zero - 1]
# 切り取った画像を保存
output_cropped_path = "output_cropped.png"
cv2.imwrite(output_cropped_path, cropped_img)
print(f"切り取った画像を保存しました: {output_cropped_path}")
# 見つかった場所を赤い矩形で囲む
for pt in zip(*loc[::-1]):
if pt != (0, 0):
cv2.rectangle(img, pt, (pt[0] + cut_width, pt[1] + cut_height), (0, 0, 255), 2)
# 結果を保存
output_path = "output_detected.png"
cv2.imwrite(output_path, img)
print(f"結果を保存しました: {output_path}")
ディスカッション
コメント一覧
まだ、コメントがありません