Обнаружение объектов OpenCV с использованием соответствия функций - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в 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()
...