TM_CCOEFF_NORMED — универсальный, устойчив к яркости. TM_SQDIFF_NORMED — лучший совпадает с минимумом
0.8 Высокий порог (0.9) — строго, низкий (0.5) — больше совпадений с шумом
Ограничение числа найденных совпадений после NMS-фильтрации
Рекомендуется для большинства задач. Отключите для поиска по цвету

Справка

СценарийМетодПорогГрадации серого
Поиск иконки на скриншотеTM_CCOEFF_NORMED0.9Да
Мульти-детекция объектовTM_CCOEFF_NORMED0.8Да
Нестабильное освещениеTM_CCORR_NORMED0.85Да
Поиск по цветуTM_CCOEFF_NORMED0.8Нет

Параметры запроса

ПараметрТипПо умолчаниюОписание
imagefileЦелевое изображение (обязательный)
templatefileШаблон для поиска (обязательный)
methodstringTM_CCOEFF_NORMEDМетод cv2.matchTemplate
thresholdfloat0.8Порог совпадения (0.1–1.0)
max_resultsint20Максимум совпадений (1–1000)
use_grayscalebooltrueКонвертировать в градации серого

Примеры запросов и ответов

# ── Запрос: изображение + шаблон ──
curl -X POST http://localhost:8888/api/v1/match/template \
  -F "image=@screenshot.png" \
  -F "template=@icon.png"

# ── Ответ (201): задача создана ──
# {
#   "uid": "d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f",
#   "status": "queued",
#   "tool": "template",
#   "params": {"method":"TM_CCOEFF_NORMED","threshold":0.8,"max_results":20,"use_grayscale":true},
#   "created_at": "2026-03-25T12:00:00",
#   "input_files": ["uploads/d83ae.../screenshot.png","uploads/d83ae.../icon.png"],
#   "thumbnails": ["thumbnails/d83ae.../screenshot.png","thumbnails/d83ae.../icon.png"],
#   "result_files": [],
#   "result_data": {}
# }

# ── Запрос: получить результат задачи ──
curl http://localhost:8888/api/v1/tasks/d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f

# ── Ответ (200): задача завершена ──
# {
#   "uid": "d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f",
#   "status": "done",
#   "tool": "template",
#   "result_files": ["results/d83ae.../matches.png","results/d83ae.../heatmap.png"],
#   "result_data": {
#     "method": "TM_CCOEFF_NORMED",
#     "matches_found": 3,
#     "best_score": 0.97,
#     "matches": [
#       {"x": 120, "y": 45, "w": 32, "h": 32, "score": 0.97},
#       {"x": 340, "y": 180, "w": 32, "h": 32, "score": 0.92},
#       {"x": 560, "y": 310, "w": 32, "h": 32, "score": 0.85}
#     ]
#   }
# }

# ── Запрос: обновить настройки ──
curl -X PUT http://localhost:8888/api/v1/settings/template \
  -H "Content-Type: application/json" \
  -d '{"method":"TM_CCOEFF_NORMED","threshold":0.9,"max_results":10,"use_grayscale":true}'

# ── Ответ (200) ──
# {
#   "tool": "template",
#   "params": {"method":"TM_CCOEFF_NORMED","threshold":0.9,"max_results":10,"use_grayscale":true}
# }
// ── Запрос: отправка изображений ──
const form = new FormData();
form.append("image", imageInput.files[0]);
form.append("template", templateInput.files[0]);
form.append("method", "TM_CCOEFF_NORMED");
form.append("threshold", "0.8");

const res = await fetch("/api/v1/match/template", {
  method: "POST",
  body: form,
});
const task = await res.json();

// ── Ответ task: ──
// {
//   uid: "d83ae21c-...",
//   status: "queued",
//   tool: "template",
//   params: {method:"TM_CCOEFF_NORMED", threshold:0.8, max_results:20, use_grayscale:true},
//   input_files: ["uploads/d83ae.../screenshot.png", "uploads/d83ae.../icon.png"],
//   result_files: [], result_data: {}
// }

// ── Запрос: получить результат ──
const status = await fetch(`/api/v1/tasks/${task.uid}`);
const result = await status.json();

// ── Ответ result (когда done): ──
// {
//   uid: "d83ae21c-...",
//   status: "done",
//   result_files: ["results/d83ae.../matches.png", "results/d83ae.../heatmap.png"],
//   result_data: {
//     method: "TM_CCOEFF_NORMED", matches_found: 3, best_score: 0.97,
//     matches: [{x:120,y:45,w:32,h:32,score:0.97}, ...]
//   }
// }
import requests

# ── Запрос: отправка изображений ──
files = {
    "image": open("screenshot.png", "rb"),
    "template": open("icon.png", "rb"),
}
data = {
    "method": "TM_CCOEFF_NORMED",
    "threshold": "0.8",
    "max_results": "20",
}
resp = requests.post(
    "http://localhost:8888/api/v1/match/template",
    files=files, data=data,
)
task = resp.json()

# ── Ответ task: ──
# {
#   "uid": "d83ae21c-...",
#   "status": "queued",
#   "tool": "template",
#   "params": {"method":"TM_CCOEFF_NORMED","threshold":0.8,"max_results":20,"use_grayscale":true},
#   "input_files": ["uploads/d83ae.../screenshot.png","uploads/d83ae.../icon.png"],
#   "result_files": [], "result_data": {}
# }

# ── Запрос: получить результат ──
result = requests.get(
    f"http://localhost:8888/api/v1/tasks/{task['uid']}"
).json()

# ── Ответ result (когда done): ──
# {
#   "uid": "d83ae21c-...",
#   "status": "done",
#   "result_files": ["results/d83ae.../matches.png", "results/d83ae.../heatmap.png"],
#   "result_data": {
#     "method": "TM_CCOEFF_NORMED", "matches_found": 3, "best_score": 0.97,
#     "matches": [
#       {"x":120,"y":45,"w":32,"h":32,"score":0.97},
#       {"x":340,"y":180,"w":32,"h":32,"score":0.92},
#       {"x":560,"y":310,"w":32,"h":32,"score":0.85}
#     ]
#   }
# }

Пример результата

Шаблон
Шаблон (template)
Сцена
Целевое изображение (scene)
Результат: совпадения
matches.png — совпадения
Тепловая карта
heatmap.png — тепловая карта

Документация OpenCV →