66 lines
2.4 KiB
Python
66 lines
2.4 KiB
Python
import cv2
|
||
import numpy as np
|
||
|
||
base = 'c:/Users/27942/Desktop/codes/codex_jxs_code/images/'
|
||
main_img = cv2.imread(base + '1.jpg')
|
||
main_gray = cv2.cvtColor(main_img, cv2.COLOR_BGR2GRAY)
|
||
|
||
def match_template_alpha(main_gray, alpha, name):
|
||
h, w = alpha.shape[:2]
|
||
best = None
|
||
|
||
# 策略1: 直接用alpha通道匹配灰度图
|
||
# 策略2: 用alpha做mask,只比较非透明区域
|
||
# 策略3: 对alpha二值化后匹配
|
||
|
||
_, alpha_bin = cv2.threshold(alpha, 10, 255, cv2.THRESH_BINARY)
|
||
|
||
scales = [1.0] + list(np.linspace(0.65, 1.35, 29))
|
||
for scale in scales:
|
||
rw, rh = int(w * scale), int(h * scale)
|
||
if rh < 10 or rw < 10:
|
||
continue
|
||
if rh > main_gray.shape[0] or rw > main_gray.shape[1]:
|
||
continue
|
||
|
||
resized_alpha = cv2.resize(alpha, (rw, rh))
|
||
resized_bin = cv2.resize(alpha_bin, (rw, rh))
|
||
_, resized_mask = cv2.threshold(resized_bin, 10, 255, cv2.THRESH_BINARY)
|
||
|
||
# 用mask匹配(只看非透明区域)
|
||
res = cv2.matchTemplate(main_gray, resized_alpha, cv2.TM_CCOEFF_NORMED, mask=resized_mask)
|
||
_, max_val, _, max_loc = cv2.minMaxLoc(res)
|
||
|
||
if best is None or max_val > best['conf']:
|
||
best = {
|
||
'x': max_loc[0], 'y': max_loc[1],
|
||
'w': rw, 'h': rh,
|
||
'conf': max_val, 'scale': scale,
|
||
'cx': max_loc[0] + rw // 2,
|
||
'cy': max_loc[1] + rh // 2,
|
||
}
|
||
|
||
return best
|
||
|
||
results = {}
|
||
for name in ['2.png', '3.png', '4.png']:
|
||
template = cv2.imread(base + name, cv2.IMREAD_UNCHANGED)
|
||
alpha = template[:, :, 3]
|
||
best = match_template_alpha(main_gray, alpha, name)
|
||
results[name] = best
|
||
x, y, cx, cy = best['x'], best['y'], best['cx'], best['cy']
|
||
conf, scale = best['conf'], best['scale']
|
||
print(name + ': pos=(' + str(x) + ',' + str(y) + ') center=(' + str(cx) + ',' + str(cy) + ') conf=' + str(round(conf, 4)) + ' scale=' + str(round(scale, 2)))
|
||
|
||
# 可视化
|
||
colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0)]
|
||
vis = main_img.copy()
|
||
for i, name in enumerate(['2.png', '3.png', '4.png']):
|
||
m = results[name]
|
||
cv2.rectangle(vis, (m['x'], m['y']), (m['x'] + m['w'], m['y'] + m['h']), colors[i], 2)
|
||
cv2.putText(vis, name, (m['x'], m['y'] - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, colors[i], 1)
|
||
cv2.circle(vis, (m['cx'], m['cy']), 5, colors[i], -1)
|
||
|
||
cv2.imwrite(base + 'result.jpg', vis)
|
||
print('result saved to images/result.jpg')
|