/
Dev_Devil
/
ComputerVision
Обзор
Документация
Войти
/
Dev_Devil
/
ComputerVision
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
Klette_Computer_Vision_2019/part9/CodPython.py
184 строки
6 KB
Geek_bro
part9
02 дек 2025, 20:55
02 дек 2025, 20:55
51e9140
Код
Авторство
О чём код?
# -*- coding: utf-8 -*- """Untitled0.ipynb Automatically generated by Colab. Original file is located at https://colab.research.google.com/drive/10Wxwz-mo4T1jUGGqfY6eS9r9GgweXcRS """ from google.colab import drive drive.mount('/content/drive') import os os.listdir('/content') # ============================================================ # ============== ЕДИНЫЙ КОД (ГЛАВА 9 — ПРИЗНАКИ) ============= # ============== ОБНАРУЖЕНИЕ, СОВПАДЕНИЕ, ТРЕКИНГ =========== # ============================================================ !pip install opencv-contrib-python >/dev/null import cv2 import numpy as np import matplotlib.pyplot as plt # -------------------------- # CONFIG — УКАЗЫВАЕШЬ СВОИ ФАЙЛЫ # -------------------------- IMG1_PATH = "/content/image1.png" IMG2_PATH = "/content/image2.png" VIDEO_PATH = "/content/video.mp4" # если нет видео → оставь пустым "" # каждые сколько кадров показывать результат LK LK_SHOW_EVERY = 10 # -------------------------- # Вспомогательные функции # -------------------------- def show_img(img, title="Image", size=(8,6)): plt.figure(figsize=size) if img.ndim == 2: plt.imshow(img, cmap='gray') else: plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.title(title) plt.axis('off') plt.show() def load_gray(path): img = cv2.imread(path, cv2.IMREAD_GRAYSCALE) if img is None: raise FileNotFoundError(path) return img # -------------------------- # ORB: детекция и описание # -------------------------- def detect_orb(img, n_features=1000): orb = cv2.ORB_create(nfeatures=n_features) kp, desc = orb.detectAndCompute(img, None) return kp, desc def draw_keypoints(img, kp, title): out = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) show_img(out, title) # -------------------------- # Сопоставление дескрипторов # -------------------------- def match_descriptors(desc1, desc2, ratio=0.75): bf = cv2.BFMatcher(cv2.NORM_HAMMING) pairs = bf.knnMatch(desc1, desc2, k=2) good = [m for m, n in pairs if m.distance < ratio * n.distance] return good def draw_matches(img1, kp1, img2, kp2, matches, max_draw=50): matches = sorted(matches, key=lambda m: m.distance)[:max_draw] out = cv2.drawMatches(img1, kp1, img2, kp2, matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) show_img(out, "ORB Matches") # -------------------------- # Lucas–Kanade трекинг (Colab-friendly) # -------------------------- def lucas_kanade_colab(video_path, show_every=10): cap = cv2.VideoCapture(video_path) ret, old = cap.read() if not ret: print("Не удалось открыть видео") return old_gray = cv2.cvtColor(old, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, maxCorners=300, qualityLevel=0.01, minDistance=7) # LK параметры lk_params = dict( winSize=(15, 15), maxLevel=3, criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 30, 0.01) ) mask = np.zeros_like(old) frame_id = 0 results = [] while True: ret, frame = cap.read() if not ret: break frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) if p1 is None: break good_new = p1[st == 1] good_old = p0[st == 1] for (x_new, y_new), (x_old, y_old) in zip(good_new, good_old): x_new, y_new = int(x_new), int(y_new) x_old, y_old = int(x_old), int(y_old) mask = cv2.line(mask, (x_new, y_new), (x_old, y_old), (0,255,0), 2) frame = cv2.circle(frame, (x_new, y_new), 3, (0,0,255), -1) combined = cv2.add(frame, mask) # Для COLAB — выводим изображение каждые N кадров if frame_id % show_every == 0: results.append(cv2.cvtColor(combined, cv2.COLOR_BGR2RGB)) old_gray = frame_gray.copy() p0 = good_new.reshape(-1, 1, 2) frame_id += 1 cap.release() # Показываем результаты print("Показ кадров LK (каждый N-й):") for i, img in enumerate(results): plt.figure(figsize=(8,6)) plt.imshow(img) plt.title(f"LK frame {i}") plt.axis('off') plt.show() # ============================================================ # ======================= MAIN PART =========================== # ============================================================ # 1. Загружаем изображения img1 = load_gray(IMG1_PATH) img2 = load_gray(IMG2_PATH) show_img(img1, "Image 1") show_img(img2, "Image 2") # 2. ORB признаки kp1, desc1 = detect_orb(img1) kp2, desc2 = detect_orb(img2) print(f"Image1 ORB keypoints: {len(kp1)}") print(f"Image2 ORB keypoints: {len(kp2)}") draw_keypoints(img1, kp1, "ORB Keypoints (Image 1)") draw_keypoints(img2, kp2, "ORB Keypoints (Image 2)") # 3. Сопоставление matches = match_descriptors(desc1, desc2) print(f"Good matches: {len(matches)}") draw_matches(img1, kp1, img2, kp2, matches) # 4. Трекинг LK (опционально) if VIDEO_PATH.strip(): lucas_kanade_colab(VIDEO_PATH, show_every=LK_SHOW_EVERY) else: print("Видео для LK не указано — трекинг пропущен.")