WaitKey требует, чтобы я продолжал нажимать, и я хочу просто нажать один раз - PullRequest
0 голосов
/ 21 июня 2019

Я запускаю некоторый код с именем bcf.py, он очень длинный и запутанный, но вкратце он извлекает 300 характерных точек из каждого изображения из группы папок.Так что потенциально могут быть сотни изображений.

Когда я запускаю сценарий, все работает, за исключением того, что я должен продолжать нажимать кнопку возврата, чтобы извлечь все характерные точки, и повторять эту кнопку, нажимая для каждого изображения, что разочаровывает.

Почему это происходит, и как мне это исправить?Цель состоит в том, чтобы нажать клавишу ожидания один раз и извлечь функции.

Спасибо

Я не знаю, как это называется, чтобы иметь возможность искать ответ.

def _svm_classify_test(self):
    clf = self._load_classifier()
    label_to_cls = self._load_label_to_class_mapping()
    testing_data = []
    labels = []
    for (cls, idx) in self.data.keys():
        testing_data.append(self.data[(cls, idx)]['spp_descriptor'])
        labels.append(hash(cls))
    predictions = clf.predict(testing_data)
    correct = 0
    for (i, label) in enumerate(labels):
        if predictions[i] == label:
            correct += 1
        else:
            print("Mistook %s for %s" % (label_to_cls[label], label_to_cls[predictions[i]]))
    print("Correct: %s out of %s (Accuracy: %.2f%%)" % (correct, len(predictions), 100. * correct / len(predictions)))

def show(self, image):
    cv2.imshow('image', image)
    _ = cv2.waitKey()

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

1 Ответ

1 голос
/ 21 июня 2019

Функция cv.waitKey([, delay]), как объясняется в документации , может принимать значение, которое вы можете считать тайм-аутом.Это означает, что вы можете передать 10 и заблокировать функцию на 10 миллисекунд для ввода с клавиатуры.

Для вашего случая я не вижу, где в коде вы используете свою функцию show, поэтому я могуЯ не знаю точно, как вы должны сделать это, чтобы иметь такое поведение, но в качестве псевдокода для вас, чтобы получить идею, это будет что-то вроде:

filenames = [] #lets assume your filenames are here
for f in filenames:
  img = cv2.imread(f)
  cv2.imshow("image", img)
  cv2.waitKey(10)

Если вы хотите сделать паузу в начале, вы можетесделать imshow вне цикла и ждать ключ с 0 после него.Кроме того, вы можете играть с количеством времени, например, 5000, чтобы отобразить его в течение 5 секунд, прежде чем продолжить.

Но если обработка занимает слишком много времени, вы можете подумать о том, чтобы поместить часть imshow в поток, так как окно может не отвечать на запросы после waitKey, пока оно ожидает завершения процесса извлечения объектов.Кроме того, было бы хорошо добавить что-то вроде 'q' для выхода из приложения или что-то в этом роде ... Это всего лишь несколько советов:)

...