2017-01-28 16 views
0

Я пытаюсь отображать изображение веб-камеры через HTTP с помощью сокета Python и OpenCV, но это работает неправильно. Сервер не обслуживает соответствующий JPEG-образ, захваченный с веб-камеры. Он отображает только некоторые двоичные массивы.Сервер изображений Python для веб-камеры по HTTP, не отображающий изображение

import io 
import socket 
import atexit 
from cv2 import * 
from PIL import Image 

def camServer(): 
    while True: 
     print("wait...") 
     conn, addr = server_socket.accept() 
     if conn: 
      print(conn) 
      print(addr) 
      connection = conn.makefile('wb') 
      break 

    print("Connecting") 
    try: 
     cam = VideoCapture(0) 
     s, imgArray = cam.read() 
     if s: 
      atexit.register(onExit) 
      img = io.BytesIO() 
      imgPIL = Image.fromarray(imgArray) 
      imgPIL.save(img, format="jpeg") 
      img.seek(0) 
      connection.write(img.read()) 
      img.seek(0) 
      img.truncate() 
    finally: 
     print("close connection") 
     connection.close() 

def onExit(): 
    connection.close() 
    server_socket.close() 
    print("exit") 

server_socket = socket.socket() 
server_socket.bind(('0.0.0.0', 8000)) 
server_socket.listen(0) 
server_socket.setblocking(1) 

while True: 
    camServer() 

Я нашел исходный код здесь: Python socket server to send camera image to client и я изменил использовать OpenCV вместо PICamera.

Served HTML Server Log

+2

Вы не используете HTTP! Прямо сейчас, только сырое изображение подано, вы должны отправить все, что необходимо для http, например, заголовки HTTP, а также правильно отформатированный ответ. –

ответ

0

Если вам нужна возможность видеть изображение в браузере, отправить Content-Type:

atexit.register(onExit) 
img = io.BytesIO() 
imgPIL = Image.fromarray(imgArray) 
imgPIL.save(img, format="jpeg") 
img.seek(0) 

connection.write('HTTP/1.0 200 OK\n') 
connection.write('Content-Type: image/png\n') 
connection.write('\n') 
connection.write(img.read()) 

img.seek(0) 
img.truncate()