Я думаю, вы упустили, чтобы проинструктировать весну для сканирования классов с аннотацией.
Вы можете использовать @ComponentScan("packageToScan")
в классе конфигурации вашего весеннего приложения, чтобы проинструктировать весну для сканирования.
@Service, @Component
и т. д. аннотации добавляют мета-описание.
Spring только вводит экземпляры тех классов, которые либо создаются как bean-элементы, либо помечены аннотацией.
Классы, отмеченные аннотацией, должны быть идентифицированы весной перед инъекцией, @ComponentScan
указать весну найдите классы, отмеченные аннотацией. Когда Spring находит @Autowired
, он ищет связанный компонент и вставляет требуемый экземпляр.
Добавление только аннотации, не исправляет или облегчает инъекцию зависимостей, Spring должна знать, где искать.
Есть несколько особенностей с графическим интерфейсом в OpenCV. В вызове DestroyImage
не удается закрыть окно (по крайней мере, в Linux, где бэкендом по умолчанию был Gtk + до 2.1.0), если только WaitKey
не был вызван для перекачки событий. Добавление вызова WaitKey(1)
сразу после DestroyWindow
может работать.
Тем не менее, закрытие не гарантируется; функция WaitKey
будет перехвачена только в том случае, если окно имеет фокус, и поэтому, если окно не имело фокуса во время вызова DestroyWindow
, скорее всего, он останется видимым до следующего вызова DestroyWindow
.
Я предполагаю, что это поведение, которое происходит из Gtk +; функция не вызывала у меня проблем, когда я использовал ее под Windows.
Это решение работает для меня (в Ubuntu 12.04 с открытым python в оболочке):
Повторно вызовите cv.ShowImage
после того, как окно «уничтожено».
После открытия окна вам нужно запустить 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 не имеет эффекта
StartWindowThread()
, но его нужно вызвать где-то раньше или сразу после открытия окна.
– buergi
10 July 2013 в 10:19
cv.namedWindow
. 2- созданный поток (окно открыто) cv.startWindowThread()
. 3- cv2.imshow
для обновления изображения. Мне не пришлось использовать cv2.waitKey
вообще, и когда я закончил, я просто закрыл окно, нажав кнопку x, и он закрылся нормально.
– razzak
10 October 2014 в 01:24
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)
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
Вокруг этой проблемы в консоли 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)
Если вы используете 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()
Я решил проблему, вызвав cv2.waitKey(1)
в цикле for, я не знаю, почему это сработало, но выполняет мою работу, поэтому я больше не беспокоился о себе.
for i in range(1,10):
cv2.destroyAllWindows()
cv2.waitkey(1)
вы можете объяснить.
После поиска в течение некоторого времени ни одно из предоставленных решений не работало для меня, так как в этой функции есть ошибка, и у меня не было времени исправить ее, мне не нужно было использовать окно 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.
Кажется, что ни один из вышеперечисленных решений не работал для меня, если я запустил его на 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()