2015-02-18 4 views
4

Я пытаюсь классифицировать объекты с использованием SURF и kNN. Код работает хорошо, но иногда он сбой и показывает «Ошибка сегментации». Я не уверен, что я сделал что-то неправильно, но я уверен, что он исправлен. Вот входной файл в случае, если вы хотите воспроизвести проблему.OpenCV Python: Иногда возникает ошибка сегментации при использовании FlannBasedMatcher

Link to download the dataset

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) 

Спасибо вам большое за помощь.

ответ

1

В том случае, если это не удается, возможно, это пустые изображения или изображение с очень небольшим количеством дескрипторов. Затем матрица дескриптора пуста, и, следовательно, она терпит неудачу.

+0

Я проверил его так: «если d.size == 0 или des.size == 0», но массив никогда не бывает пустым. – PalmRobotZ

Смежные вопросы