2014-05-07 2 views
3

Я использую библиотеку сторожевого таймера для обнаружения, когда новые изображения создаются в определенной папке. Когда сторожевой таймер обнаруживает недавно созданное изображение, я запускаю некоторые функции обработки изображений с помощью SimpleCV/OpenCV.Обработка изображений с Watchdog в Python

Однако снимки берутся из камеры малины Pi, и из приведенной ниже ошибки я не верю, что все изображение сохраняется, когда оно впервые появляется в каталоге. (По сути, файл сохраняется в «кусках» или многообразно).

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

Спрашивать: Есть ли способ начать обработку изображения только после того, как полностью сохранен файл?

import time 
from SimpleCV import Image 
from watchdog.observers import Observer 
from watchdog.events import FileSystemEventHandler 

class ExampleHandler(FileSystemEventHandler): 
    def on_created(self, event): 
     image = Image(event.src_path) 
     do image processing stuff 
     print "Got event for file %s" % event.src_path 

observer = Observer() 
event_handler = ExampleHandler() # create event handler 
observer.schedule(event_handler, path='/path/to/images') # set observer to use created handler in directory 
observer.start() 

# sleep until keyboard interrupt, then stop + rejoin the observer 
try: 
    while True: 
     time.sleep(1) 
except KeyboardInterrupt: 
    observer.stop() 

observer.join() 

самосвал Ошибки:

Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/api.py", line 241, in run 
    self.dispatch_events(self.event_queue, self.timeout) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/api.py", line 408, in dispatch_events 
    self._dispatch_event(event, watch) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/observers/api.py", line 403, in _dispatch_event 
    handler.dispatch(event) 
    File "/usr/local/lib/python2.7/dist-packages/watchdog/events.py", line 361, in dispatch 
    _method_map[event_type](event) 
    File "picture_classifier_cube.py", line 11, in on_created 
    image = Image(event.src_path) 
    File "/usr/local/lib/python2.7/dist-packages/SimpleCV/ImageClass.py", line 1073, in __init__ 
    self._pil = pil.open(self.filename).convert("RGB") 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1980, in open 
    raise IOError("cannot identify image file") 
IOError: cannot identify image file 

Редактировать После обновления обработчика спать несколько секунд после распознавания нового файла, я получаю другую ошибку.

class ExampleHandler(FileSystemEventHandler): 
    def on_created(self, event): 
     time.sleep(3) 
     cans = Image(event.src_path) 

Ошибка

IOError: [Errno 2] No such file or directory: '/path/to/images/test.jpg~' 

Обратите внимание, что я захвата изображения с помощью следующей команды Pi: raspistill -o 'test.jpg'

+0

Или, вы можете просто сделать Try/Catch ... Если вы не заботитесь о других ошибках. –

ответ

1

Хотя там не может быть способ узнать для определенного, если а файл заканчивается, записывается без изменения программы, выполняющей запись, вы можете контролировать размер файла:

from os import stat 
from time import sleep 

def wait_for_write_finish(filename): 
    last_size, size= -1, 0 
    while size!=last_size: 
     sleep(1) 
     last_size, size= size, stat(filename).st_size 

Вы можете сделать это с помощью соответствующей резьбы

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