Почему мое окно не закрывается в Opencv (Python). Он будет загружаться, но не близко [дублировать]

Я думаю, вы упустили, чтобы проинструктировать весну для сканирования классов с аннотацией.

Вы можете использовать @ComponentScan("packageToScan") в классе конфигурации вашего весеннего приложения, чтобы проинструктировать весну для сканирования.

@Service, @Component и т. д. аннотации добавляют мета-описание.

Spring только вводит экземпляры тех классов, которые либо создаются как bean-элементы, либо помечены аннотацией.

Классы, отмеченные аннотацией, должны быть идентифицированы весной перед инъекцией, @ComponentScan указать весну найдите классы, отмеченные аннотацией. Когда Spring находит @Autowired, он ищет связанный компонент и вставляет требуемый экземпляр.

Добавление только аннотации, не исправляет или облегчает инъекцию зависимостей, Spring должна знать, где искать.

26
задан Arthur 24 May 2011 в 21:38
поделиться

10 ответов

Есть несколько особенностей с графическим интерфейсом в OpenCV. В вызове DestroyImage не удается закрыть окно (по крайней мере, в Linux, где бэкендом по умолчанию был Gtk + до 2.1.0), если только WaitKey не был вызван для перекачки событий. Добавление вызова WaitKey(1) сразу после DestroyWindow может работать.

Тем не менее, закрытие не гарантируется; функция WaitKey будет перехвачена только в том случае, если окно имеет фокус, и поэтому, если окно не имело фокуса во время вызова DestroyWindow, скорее всего, он останется видимым до следующего вызова DestroyWindow.

Я предполагаю, что это поведение, которое происходит из Gtk +; функция не вызывала у меня проблем, когда я использовал ее под Windows.

16
ответ дан susmits 23 August 2018 в 01:22
поделиться
  • 1
    Спасибо. В качестве обходного пути, следуя вашим комментариям, я решил просто повторно использовать одно и то же окно без вызова cv.DestroyWindow. – Arthur 11 June 2011 в 18:39

Это решение работает для меня (в Ubuntu 12.04 с открытым python в оболочке):

Повторно вызовите cv.ShowImage после того, как окно «уничтожено».

4
ответ дан Andy Hayden 23 August 2018 в 01:22
поделиться

После открытия окна вам нужно запустить cv.StartWindowThread(). У меня была такая же проблема, и теперь это работает для меня.

Надеюсь, это поможет будущим читателям. И есть также cv2 привязка (я советую использовать это вместо cv).

Этот код работает для меня:

import cv2 as cv
import time

WINDOW_NAME = "win"

image = cv.imread("ela.jpg", cv.CV_LOAD_IMAGE_COLOR)
cv.namedWindow(WINDOW_NAME, cv.CV_WINDOW_AUTOSIZE)
initialtime = time.time()

cv.startWindowThread()

while (time.time() - initialtime < 5):
  print "in first while"
cv.imshow(WINDOW_NAME, image)
cv.waitKey(1000)

cv.waitKey(1)
cv.destroyAllWindows()
cv.waitKey(1)

initialtime = time.time()
while (time.time() - initialtime < 6):
    print "in second while"

То же самое происходит с версия C ++ в Linux: Попытка закрыть окно OpenCV не имеет эффекта

26
ответ дан Community 23 August 2018 в 01:22
поделиться
  • 1
    Это правильный ответ, на самом деле это не имеет значения, когда вы вызываете StartWindowThread(), но его нужно вызвать где-то раньше или сразу после открытия окна. – buergi 10 July 2013 в 10:19
  • 2
    Это сработало для меня следующим образом: 1- созданное окно cv.namedWindow. 2- созданный поток (окно открыто) cv.startWindowThread(). 3- cv2.imshow для обновления изображения. Мне не пришлось использовать cv2.waitKey вообще, и когда я закончил, я просто закрыл окно, нажав кнопку x, и он закрылся нормально. – razzak 10 October 2014 в 01:24
  • 3
    Согласно этот вопрос Github , функция startWindowThread() в значительной степени неиспользована и потенциально устарела. Что касается OpenCV 3, они даже не объясняют заглушку в документации. Кажется, единственное использование - если вы используете GTK для вашего API оконного оформления. – Harris Weinstein 16 April 2018 в 01:47

Вот что сработало для меня:

cv2.namedWindow("image")
cv2.imshow('image', img)
cv2.waitKey(0) # close window when a key press is detected
cv2.destroyWindow('image')
cv2.waitKey(1)
1
ответ дан Hassan Alshehri 23 August 2018 в 01:22
поделиться

Sayem2603

Я попробовал ваше решение, и это сработало для меня - спасибо! Я сделал несколько проб и ошибок и обнаружил, что цикл 4 раза сделал трюк для меня ... или отправил один и тот же код 4 раза точно так же.

Далее, я развернулся до:

cv2.destroyAllWindows()
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)
cv2.waitKey(1)

или просто вызвать DestroyAllWindows, а затем циклически выполнить цикл waitKey () 4 раза:

cv2.destroyAllWindows()
for i in range (1,5):
    cv2.waitKey(1)

Работал также. Я недостаточно сообразителен, чтобы понять, почему это работает точно, хотя я полагаю, что это имеет какое-то отношение к прерыванию и задержке, созданным путем циклирования этого кода (?)

. Маттеус Брандл сказал выше, что третий waitKey () работал на него, так что, возможно, это немного отличается в каждой системе? (Я запускаю Linux Mint с ядром 3.16.1 и python 2.7)

Задержка сама по себе не объясняет это, так как простое увеличение времени задержки на waitKey () не делает этого трюка. (Также зацикленную печать («Hello») 1000 раз вместо использования wiatKey (), чтобы увидеть, помогла ли какая-либо задержка, которая создала, - это не так.) Должно быть, что-то больше связано с тем, как waitKey () взаимодействует с событиями окна.

Документы OpenCV говорят: «Эта функция является единственным методом в HighGUI, который может извлекать и обрабатывать события, поэтому его необходимо периодически вызывать для нормальной обработки событий, если HighGUI не используется в среде, которая занимается обработкой событий .

Возможно, он создает прерывание сорта в графическом интерфейсе, которое позволяет выполнять действие destroyAllWindows ()?

J

15
ответ дан Jay 23 August 2018 в 01:22
поделиться
  • 1
    Как ни странно, это единственное решение, которое сработало для меня. – Ébe Isaac 22 December 2016 в 09:09
  • 2
    Только тот, который работал и на меня. – Zuks 24 May 2017 в 19:52

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

  • выдавая cv2.imshow после cv2.destroyWindow , иногда закрывает окно. Хотя старое окно снова появляется со следующим вызовом highgui, например, cv2.namedWindow
  • , третий вызов cv2.waitKey после cv2.destroyWindow закрывал окно каждый раз, когда я пытался. Кроме того, закрытое окно оставалось закрытым даже при использовании cv2.namedWindow после

Надеюсь, это поможет кому-то.

(я использовал Ubuntu 12.10 с python 2.7.3, но OpenCV 2.4 .2 из резервов 13.04)

1
ответ дан Matthäus Brandl 23 August 2018 в 01:22
поделиться

Если вы используете Spyder (пакет Anaconda), проблема.

Ни один из решений не работал для меня. Я обнаружил, что проблема заключается не в функциях, а в проблеме Spyder. Попытайтесь использовать текстовый редактор плюс запуск на терминале, и вы будете просто использовать просто:

WINDOW_NAME = "win"
image = cv.imread("foto.jpg", 0)
cv.namedWindow(WINDOW_NAME, cv.CV_WINDOW_AUTOSIZE)

cv.startWindowThread()

cv.imshow(WINDOW_NAME, image)
cv.waitKey()
cv.destroyAllWindows()
2
ответ дан Michelcyc 23 August 2018 в 01:22
поделиться

Я решил проблему, вызвав cv2.waitKey(1) в цикле for, я не знаю, почему это сработало, но выполняет мою работу, поэтому я больше не беспокоился о себе.

for i in range(1,10):
    cv2.destroyAllWindows()
    cv2.waitkey(1)

вы можете объяснить.

3
ответ дан Richard 23 August 2018 в 01:22
поделиться
  • 1
    Вы намеренно включали команду destroy в цикле? – Zuks 24 May 2017 в 19:53

После поиска в течение некоторого времени ни одно из предоставленных решений не работало для меня, так как в этой функции есть ошибка, и у меня не было времени исправить ее, мне не нужно было использовать окно cv2 для отображения фреймов. После того, как несколько кадров были сохранены, вы можете открыть файл в другом средстве просмотра, например, VLC или MoviePlayer (для linux).

Вот как я сделал.

 import cv2

 threadDie = True # change this to false elsewhere to stop getting the video
 def getVideo(Message):
          print Message
          print "Opening url"
          video = cv2.VideoCapture("rtsp://username:passwordp@IpAddress:554/axis-media/media.amp")

          print "Opened url"
          fourcc = cv2.cv.CV_FOURCC('X','V','I','D')
          fps = 25.0 # or 30.0 for a better quality stream
          writer = cv2.VideoWriter('out.avi', fourcc,fps, (640,480),1)
          i = 0

          print "Reading frames "
          while threadDie:
                  ret, img = video.read()
                  print "frame number: ",i
                  i=i+1
                  writer.write(img)
          del(video)


          print "Finished capturing video"

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

vlc out.avi #out.avi is my video file being saved by the function above.

Это сработало для меня в arch linux.

1
ответ дан Telewa 23 August 2018 в 01:22
поделиться

Кажется, что ни один из вышеперечисленных решений не работал для меня, если я запустил его на Jupyter Notebook (окно зависает при закрытии, и вам нужно заставить Quit Python закрыть окно).

Я нахожусь на macOS High Sierra 10.13.4, Python 3.6.5, OpenCV 3.4.1.

Ниже приведен код, если вы запустите его как .py-файл (источник: [д0] https://www.learnopencv.com/read-write-and-display-a-video-using-opencv-cpp-python/ [/ д0]). Он открывает камеру, записывает видео, успешно закрывает окно при нажатии «q» и сохраняет видео в формате .avi.

import cv2
import numpy as np

# Create a VideoCapture object
cap = cv2.VideoCapture(0)

# Check if camera opened successfully
if (cap.isOpened() == False): 
  print("Unable to read camera feed")

# Default resolutions of the frame are obtained.The default resolutions are system dependent.
# We convert the resolutions from float to integer.
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# Define the codec and create VideoWriter object.The output is stored in 'outpy.avi' file.
out = cv2.VideoWriter('outpy.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))

while(True):
  ret, frame = cap.read()

  if ret == True: 

    # Write the frame into the file 'output.avi'
    out.write(frame)

    # Display the resulting frame    
    cv2.imshow('frame',frame)

    # Press Q on keyboard to stop recording
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break

  # Break the loop
  else:
    break 

# When everything done, release the video capture and video write objects
cap.release()
out.release()

# Closes all the frames
cv2.destroyAllWindows() 
0
ответ дан yl_low 23 August 2018 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: