IP摄像机类无法正常工作

时间:2015-01-15 18:02:45

标签: python opencv python-imaging-library webcam mjpeg

编辑:我在发布后不久就知道了,如果提问可以帮助你重新检查事情,那就太棒了:-)。我评论了代码中的开关。

我正在研究一个类,每隔几秒就从运动jpeg流中下载单帧。它工作正常,直到我加载一些代码,一旦加载一个jpeg断开流。现在,“记录器”似乎存储了检索到的第一帧,而不是用新内容替换“图像”。我可以每次破坏并重新创建对象来解决这个问题,但这不是一个非常优雅的解决方案。任何帮助将不胜感激!

以下是Recorder类的代码:

import cv2
import urllib2
import threading
from PIL import Image
import numpy as np

class MJpegCam:

    def __init__(self, ip, timeout=5):
        self.ip = ip
        self.bytes= ''
        self.image = ''
        self.stream = None
        self.stopcam = False
        self.timeout = timeout

    def start(self):
        self.stream=urllib2.urlopen(self.ip, timeout=self.timeout)
        def run():
            while True:
                if self.stopcam:
                    self.stopcam = False
                    return
                try:
                    self.bytes+=self.stream.read(1024)
                    a = self.bytes.find('\xff\xd8')
                    b = self.bytes.find('\xff\xd9')
                    if a!=-1 and b!=-1:
                        jpg = self.bytes[a:b+2]
                        self.bytes= self.bytes[b+2:]
                        cv2img = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.CV_LOAD_IMAGE_COLOR)
                        try:
                            cv2RGB = cv2.cvtColor(cv2img,cv2.COLOR_BGR2RGB)
                            self.image = Image.fromarray(cv2RGB)
                            self.stop() #This is where the program was breaking
                            return #
                        except Exception as e:
                            pass
                except AttributeError as e:
                    pass
        thread = threading.Thread(target=run)
        thread.start()

    def stop(self):
        self.stream.close()
        self.stopcam = False #this needed to be switched to False
        self.bytes = ''

    def getImage(self):
        return self.image

在实际程序中,我在不同的进程上运行多个对象,但这是基本的想法:

cam = MJpegCam(ip)
secs = 10

while(i < end):
  cam.start()
  time.sleep(cam.timeout)
  cam.stop()
  time.sleep(secs - cam.timeout)

0 个答案:

没有答案