Я пытаюсь классифицировать объекты с использованием SURF и kNN. Код работает хорошо, но иногда он сбой и показывает «Ошибка сегментации». Я не уверен, что я сделал что-то неправильно, но я уверен, что он исправлен. Вот входной файл в случае, если вы хотите воспроизвести проблему.OpenCV Python: Иногда возникает ошибка сегментации при использовании FlannBasedMatcher
import numpy as np
import cv2
import sys
trainfile = ['/home/nuntipat/Documents/Dataset/Bank/Training/15_20_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/15_50_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/15_100_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/15_500_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/15_1000_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/16_20_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/16_50_front.jpg'
, '/home/nuntipat/Documents/Dataset/Bank/Training/16_500_front.jpg']
testfile = '/home/nuntipat/Documents/Dataset/Bank/20_1.jpg'
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)
# Initiate FLANN matcher
flann = cv2.FlannBasedMatcher(index_params, search_params)
# Initiate SURF detector
surf = cv2.xfeatures2d.SURF_create(500)
# Create list of describtor
descriptor = []
for file in trainfile:
img = cv2.imread(file)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kp, des = surf.detectAndCompute(gray, None)
descriptor.append(des)
# Clasify using test file
img = cv2.imread(testfile)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kp1, des = surf.detectAndCompute(gray, None)
maxCount = 0
for i, d in enumerate(descriptor):
matches = flann.knnMatch(d, des, k=2)
count = 0
# ratio test as per Lowe's paper
for (m,n) in matches:
if m.distance < 0.7 * n.distance:
count += 1
if count > maxCount:
maxCount = count
maxMatch = i
print maxMatch
Прежде чем я писал этот код, я попытался создать модель Knn, которые содержат каждые обучающие данные и сделать матч только один раз. Однако он всегда терпит неудачу и вызывает ошибку сегментации в «flann.add (дескрипторы)».
import numpy as np
import cv2
trainfile = ['/home/nuntipat/Documents/Dataset/Bank/100_1.jpg', '/home/nuntipat/Documents/Dataset/Bank/100_2.jpg', '/home/nuntipat/Documents/Dataset/Bank/100_3.jpg']
testfile = '/home/nuntipat/Documents/Dataset/Bank/100_1.jpg'
# FLANN parameters
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
# Initiate FLANN matcher
flann = cv2.FlannBasedMatcher(index_params, search_params)
# Initiate SURF detector
surf = cv2.xfeatures2d.SURF_create()
# Train FLANN
for file in trainfile:
img = cv2.imread(file)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
keypoints, descriptors = surf.detectAndCompute(gray, None)
flann.add(descriptors)
Спасибо вам большое за помощь.
Я проверил его так: «если d.size == 0 или des.size == 0», но массив никогда не бывает пустым. – PalmRobotZ