2017-02-03 41 views
0

私はラズベリーパイの視覚処理を行い、グラフィカルインターフェイス上の効果を監視しようとしています。 cv2.imshowを使用すると、実際にはフレームレートが低下するので、代わりにMPEG localserverに操作をストリームし、別のデスクトップのchromeから監視しようとしています。ここで私が開発したコードです:Python MJPEG Server

from http.server import BaseHTTPRequestHandler, HTTPServer 
from socketserver import ThreadingMixIn 
from threading import Thread 
import imutils 
import sys 

class CamHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     print(self.path) 
     if self.path.endswith('/stream.mjpg'): 
      self.send_response(20) 
      self.send_header('Content-type', 'multipart/x-mixed-replace; boundary=--jpgboundary') 
      self.end_headers() 
      while True: 
       try: 

        if(frame != None): 
         pass 
        r, buf = cv2.imencode(".jpg", frame) 
        self.wfile.write("--jpgboundary\r\n".encode()) 
        self.end_headers() 
        self.wfile.write(bytearray(buf)) 
       except KeyboardInterrupt: 
        break 
      return 

     if self.path.endswith('.html') or self.path == "/": 
      self.send_response(200) 
      self.send_header('Content-type', 'text/html') 
      self.end_headers() 
      self.wfile.write('<html><head></head><body>') 
      self.wfile.write('<img src="http://localhost:9090/stream.mjpg" height="240px" width="320px"/>') 
      self.wfile.write('</body></html>') 
      return 

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer): 
    """Handle requests in a separate thread.""" 


class WebcamVideoStream: 
    def __init__(self, src=0): 
     # initialize the video camera stream and read the first frame 
     # from the stream 
     self.stream = cv2.VideoCapture(src) 
     # self.stream.set(3, 1920) 
     # self.stream.set(4, 1080) 
     # self.stream.set(15,-100) 
     (self.grabbed, self.frame) = self.stream.read() 

     # initialize the variable used to indicate if the thread should 
     # be stopped 
     self.stopped = False 

    def start(self): 
     # start the thread to read frames from the video stream 
     Thread(target=self.update, args=()).start() 
     return self 

    def update(self): 
     # keep looping infinitely until the thread is stopped 
     while True: 
      # if the thread indicator variable is set, stop the thread 
      if self.stopped: 
       self.stream.release() 
       return 

      # otherwise, read the next frame from the stream 
      (self.grabbed, self.frame) = self.stream.read() 

    def read(self): 
     # return the frame most recently read 
     return self.frame 

    def stop(self): 
     # indicate that the thread should be stopped 
     self.stopped = True 


def realmain(): 
    global frame 

    ip = 'localhost' 

    try: 
     cap = WebcamVideoStream().start() 
     server = ThreadedHTTPServer((ip, 9090), CamHandler) 
     print("starting server") 
     target = Thread(target=server.serve_forever,args=()) 

     i = 0 
     while True: 

      img = cap.read() 
      img1 = imutils.resize(img, width=600) 
      img2 = cv2.GaussianBlur(img1, (5, 5), 0) 
      #frame = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV) 

      frame = cv2.Canny(img, 35, 125) 
      if(i == 0): 
       target.start() 
      i +=1 

    except KeyboardInterrupt: 
     sys.exit() 

if __name__ == '__main__': 
    realmain() 

を今は、私は自分のデスクトップからサーバーを実行して、私のデスクトップ上にクロムからMPEGの罰金を見るが、私は私のラズベリーパイからサーバを実行することはできませんこのURLにhttp:// "RASPBERRY PI IP":9090/stream.mjpgと入力してアクセスしてください。私がそうするとき、クロムは単にウェブページが利用できないと言っているだけです。 PIでサーバーを実行していても、EpiphanyブラウザでURLを表示することはできません。画像をダウンロードするだけです。誰かがこの問題に対する答えを持っているのだろうかと疑問に思いました。

また、サーバーに送信する前にjpgを解凍して再圧縮する方法がありますか?

+0

* 'localhost' *の代わりに* ip = "" *(空文字列)を作成できますか? – sal

+0

ありがとう、私は実際に私の携帯電話のWiFiホットスポットでサーバーを試して、私は私のデスクトップを介して接続することができました。接続を妨げるいくつかのファイアウォールがあったに違いない –

答えて

0

は、localhostにサーバをバインドする:

ip = 'localhost' 

try: 
    cap = WebcamVideoStream().start() 
    server = ThreadedHTTPServer((ip, 9090), CamHandler) 

'0.0.0.0''localhost'を変更してみてください。サーバーをすべてのネットワークインターフェイスにバインドします。

関連する問題