OpenCV destroyallWindow функция не должна работать? - PullRequest
0 голосов
/ 02 марта 2020
import cv2
img = cv2.imread('lena.jpg', -1)
cv2.imshow('image', img)
k = cv2.waitKey(0) & 0xFF
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('lena_copy.png', img)

Я новичок в OpenCV. Пока я играл с функциями, я заметил эту ошибку. Этот скрипт, если я правильно понимаю, должен сначала показать изображение, а затем либо будет уничтожен, либо сохранен в зависимости от того, нажму ли я клавишу выхода или клавишу s. Но дело в том, какую клавишу я нажал, окно разрушается. Как будто мне не нужна функция destroyAllWindows(), чтобы уничтожить все мое окно, все, что мне нужно, - это нажать случайную клавишу. Это потому, что я неправильно понимаю назначение функции destroyAllWindows() или это из-за чего-то другого?

Ответы [ 2 ]

2 голосов
/ 02 марта 2020

Когда вы нажимаете клавишу выхода, она явно вызывает destroyAllWindows. Когда вы нажимаете s, он сначала сохраняет образ, а затем операционная система уничтожает все windows при выходе. Если вы нажмете любую другую клавишу, снова ОС закроется и освободит все windows при выходе.

С OpenCV docs :

Вы можете позвонить destroyWindow() или destroyAllWindows(), чтобы закрыть окно и отменить выделение памяти. Для простой программы вам не нужно вызывать эти функции, потому что все ресурсы и windows приложения автоматически закрываются операционной системой при выходе.

0 голосов
/ 02 марта 2020

Проблема с waitKey, а не destroyAllWindow. Последний работает нормально и делает то, что должен делать.

Вы должны понимать, что при отображении окна (по imshow()) ваше приложение должно иметь основные события l oop, в которых все события, связанные с взаимодействием с windows, такие как нажатие, изменение размера, двигаясь, показывая et c. обрабатываются. Это основное приложение oop из GUI создается и обрабатывается при вызове функции waitKey().

Ваш текущий поток выглядит следующим образом:

  1. показать окно
  2. нажать любую клавишу
  3. все windows закрыты независимо от того, какая клавиша была нажмите, потому что вы не позвонили waitKey снова для k == 's'

.

if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('lena_copy.png', img)
    cv2.waitKey(0)

, добавив последнюю строку, вы начинаете новые события l oop и windows все еще видны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...