Я написал код, чтобы иметь возможность идентифицировать аналогичные/те же объекты. У нас есть набор хранимых изображений, и мы вводим изображение объекта, поэтому код должен варить все похожие совпадения внутри каждого изображения.
Это в моем коде: < /p>
import cv2
import numpy as np
import pathlib
import os
import sys
from PIL import Image
from sklearn.cluster import DBSCAN
def is_image(path):
if not os.path.exists(path):
sys.exit("\n\nThe path does not exist")
try:
with Image.open(path) as img:
img.verify()
print('\n\nThe path is valid, looking for similar images')
return True
except (IOError, SyntaxError):
sys.exit("\n\nFile exists but is not a valid image.")
# Image directory
img_path = 'pics/same'
data_dir = pathlib.Path(img_path)
extensions = ('.jpg', '.jpeg', '.png')
img_tpl = tuple(path for path in data_dir.rglob('*') if path.suffix.lower() in extensions)
print(img_tpl)
# Input image
input_img = input('\n\nEnter the image path: ')
is_image(input_img)
# Initialize ORB detector
ORB = cv2.ORB_create(nfeatures=2000)
# Read and resize input image
img1 = cv2.imread(input_img)
img1 = cv2.resize(img1, (250, 250)) # Resize to approximate logo size
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
kp1, desc1 = ORB.detectAndCompute(gray1, None)
if desc1 is None or len(desc1) == 0:
print("No descriptors found in input image.")
sys.exit()
# Matcher
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False)
# Matching with each stored image
for i in img_tpl:
img2 = cv2.imread(str(i))
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
kp2, desc2 = ORB.detectAndCompute(gray2, None)
if desc2 is None or desc1 is None:
print(f"Skipping {i}, no descriptors found.")
continue
matches = bf.knnMatch(desc1, desc2, k=2)
# Ratio test
good_matches = [m for m, n in matches if m.distance < 0.80 * n.distance]
if len(good_matches) < 4:
print(f"Not enough matches for {i} - {len(good_matches)}/4")
continue
#DBSCAN
matched_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches])
clustering = DBSCAN(eps=40, min_samples=2).fit(matched_pts)
labels = clustering.labels_
img_with_boxes = img2.copy()
h, w = gray1.shape
box_template = np.float32([[0, 0], [0, h], [w, h], [w, 0]]).reshape(-1, 1, 2)
for cluster_id in set(labels):
if cluster_id == -1:
continue
cluster_matches = [m for idx, m in enumerate(good_matches) if labels[idx] == cluster_id]
imges = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [cluster_matches], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow("Matches", imges)
cv2.waitKey(0)
if len(cluster_matches) < 4:
continue
#Homography
pts1 = np.float32([kp1[m.queryIdx].pt for m in cluster_matches]).reshape(-1, 1, 2)
pts2 = np.float32([kp2[m.trainIdx].pt for m in cluster_matches]).reshape(-1, 1, 2)
H, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0)
if H is not None:
box_transformed = cv2.perspectiveTransform(box_template, H)
img_with_boxes = cv2.polylines(img_with_boxes, [np.int32(box_transformed)], True, (255, 0, 0), 3)
else:
print(f"Homography failed for cluster {cluster_id} in image {i}")
cv2.imshow("Detected Matches", img_with_boxes)
cv2.waitKey(0)
cv2.destroyAllWindows()
Я использовал orb , чтобы найти все клавиши и сочетание BruteForce для соответствия клавишам и тестируемому коэффициенту бумажного соотношения , чтобы отфильтровать шум в определенную диск. Шум. Программа на самом деле не работала, как и ожидалось. Я также попытался изменить аргументы по умолчанию orb / dbscan и другие. Но это было безрезультатно. Я подтвердил, что вскоре после этого, и они были идентифицированы, что я подтвердил с помощью кода на GitHub также для того же самого, что и я (они использовали sift , flann matchter , meanshift для кластера и гомографии)
, но я был в стороне. Удовлетворительные результаты (имели некоторые проблемы, а также это работало)
Поэтому я думаю, что проблема (вероятно) с моим кодом, но я не могу понять, может ли кто -нибудь помочь мне? />
Это 2 из изображений, а что касается вывода, которые он соответствует.>
Я написал код, чтобы иметь возможность идентифицировать аналогичные/те же объекты. У нас есть набор хранимых изображений, и мы вводим изображение объекта, поэтому код должен варить все похожие совпадения внутри каждого изображения. Это в моем коде: < /p> [code]import cv2 import numpy as np import pathlib import os import sys from PIL import Image from sklearn.cluster import DBSCAN
def is_image(path): if not os.path.exists(path): sys.exit("\n\nThe path does not exist") try: with Image.open(path) as img: img.verify() print('\n\nThe path is valid, looking for similar images') return True except (IOError, SyntaxError): sys.exit("\n\nFile exists but is not a valid image.")
# Image directory img_path = 'pics/same' data_dir = pathlib.Path(img_path) extensions = ('.jpg', '.jpeg', '.png') img_tpl = tuple(path for path in data_dir.rglob('*') if path.suffix.lower() in extensions) print(img_tpl)
# Matching with each stored image for i in img_tpl: img2 = cv2.imread(str(i)) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) kp2, desc2 = ORB.detectAndCompute(gray2, None)
if desc2 is None or desc1 is None: print(f"Skipping {i}, no descriptors found.") continue
matches = bf.knnMatch(desc1, desc2, k=2)
# Ratio test good_matches = [m for m, n in matches if m.distance < 0.80 * n.distance]
if len(good_matches) < 4: print(f"Not enough matches for {i} - {len(good_matches)}/4") continue
#DBSCAN matched_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]) clustering = DBSCAN(eps=40, min_samples=2).fit(matched_pts) labels = clustering.labels_
for cluster_id in set(labels): if cluster_id == -1: continue
cluster_matches = [m for idx, m in enumerate(good_matches) if labels[idx] == cluster_id] imges = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [cluster_matches], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) cv2.imshow("Matches", imges) cv2.waitKey(0)
if len(cluster_matches) < 4: continue
#Homography pts1 = np.float32([kp1[m.queryIdx].pt for m in cluster_matches]).reshape(-1, 1, 2) pts2 = np.float32([kp2[m.trainIdx].pt for m in cluster_matches]).reshape(-1, 1, 2)
H, mask = cv2.findHomography(pts1, pts2, cv2.RANSAC, 5.0) if H is not None: box_transformed = cv2.perspectiveTransform(box_template, H) img_with_boxes = cv2.polylines(img_with_boxes, [np.int32(box_transformed)], True, (255, 0, 0), 3) else: print(f"Homography failed for cluster {cluster_id} in image {i}")
[/code] Я использовал orb , чтобы найти все клавиши и сочетание BruteForce для соответствия клавишам и тестируемому коэффициенту бумажного соотношения , чтобы отфильтровать шум в определенную диск. Шум. Программа на самом деле не работала, как и ожидалось. Я также попытался изменить аргументы по умолчанию orb / dbscan и другие. Но это было безрезультатно. Я подтвердил, что вскоре после этого, и они были идентифицированы, что я подтвердил с помощью кода на GitHub также для того же самого, что и я (они использовали sift , flann matchter , meanshift для кластера и гомографии) , но я был в стороне. Удовлетворительные результаты (имели некоторые проблемы, а также это работало) Поэтому я думаю, что проблема (вероятно) с моим кодом, но я не могу понять, может ли кто -нибудь помочь мне? /> Это 2 из изображений, а что касается вывода, которые он соответствует.>
Я тестирую версию Rapids на dbscan, которая работает с графическим процессором.
Я написал короткий код на Python, который находит кластеры в трехмерных случайно сгенерированных точках, и когда я играл с кодом, я понял, что процессор работает...
Я написал код, чтобы иметь возможность идентифицировать Силилар/те же объекты. У нас есть набор хранимых изображений, и мы вводим изображение объекта, поэтому код должен варить все похожие совпадения внутри каждого изображения.
Это в моем коде:...
Я написал код, чтобы иметь возможность идентифицировать аналогичные/те же объекты. У нас есть набор хранимых изображений, и мы вводим изображение объекта, поэтому код должен варить все похожие совпадения внутри каждого изображения.
Это в моем коде:...
I have a list of points I wish to make as core points for DBSCAN. I am aware that I can subclass sklearn DBSCAN to explicitly set my core points similar to the first comment here: How to provide core points in DBSCAN?