Я новичок в Python и OpenCV. Я нахожусь в стадии обучения. В настоящее время я работаю над обнаружением объектов, но существует проблема с обнаружением объектов. Проблема в том, что я могу найти только два объекта на изображении, но всего 4 объекта. Я хочу обнаружить 4 из 4 объектов.
Примечание: этот код не мой, я взял его из репозитория github.
Это изображение, которое я хочу обнаружить в другом image
Это изображение, по которому я хочу обнаружить объект по
Это то, что я получаю (результат)
import cv2
import numpy as np
from matplotlib import pyplot as plt
source = cv2.imread("source.jpg")
display_image = source.copy()
target_image = cv2.cvtColor(source, cv2.COLOR_BGR2GRAY)
height, width = target_image.shape
total_area = height * width
template_image = cv2.imread("template.jpg")
orb_target = cv2.ORB_create(nfeatures=400000)
kp2, des2 = orb_target.detectAndCompute(target_image, None)
template_image = cv2.cvtColor(template_image, cv2.COLOR_BGR2GRAY)
orb_template = cv2.ORB_create(nfeatures=25000)
kp1, des1 = orb_template.detectAndCompute(template_image,None)
FLANN_INDEX_LSH = 6
index_params = dict(algorithm = FLANN_INDEX_LSH, table_number = 6, key_size = 12,
multi_probe_level = 1)
search_params = dict(checks = 32)
flann = cv2.FlannBasedMatcher(index_params, search_params)
good = []
MIN_MATCH_COUNT = 10
matches = flann.knnMatch(des1,des2,k=3)
for index in range(0, len(matches[10])):
good = [m[index] for m in matches]
if len(good)>MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
matchesMask = mask.ravel().tolist()
load_img = cv2.imread("template.jpg")
h,w,c = load_img.shape
pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts,M)
xs = [x[0][0] for x in dst]
ys = [x[0][1] for x in dst]
minx = min(xs)
maxx = max(xs)
miny = min(ys)
maxy = max(ys)
cv2.rectangle(display_image, (minx,miny), (maxx,maxy), color=(255,0,0), thickness=5)
#cv2.rectangle(display_image, (minx, miny), (maxx, maxy), 0);
#cv2.polylines(img2,[np.int32(dst)],True,0)
else:
print ("Not enough matches are found - %d/%d" % (len(good),MIN_MATCH_COUNT))
matchesMask = None
plt.imshow(display_image)
plt.show()