Кажется, что в вашем коде есть некоторые проблемы с отступами, а также излишняя зависимость от PIL / Pillow и от BytesIO, поэтому я удалил это и добавил некоторые подсказки по проверке ошибок и отладке, и это, кажется, работает нормально - возможно, вы можете иметь еще одна попытка:
#!/usr/bin/env python3
import cv2
import numpy as np
import tornado.httpserver
import tornado.web
from tornado.ioloop import IOLoop
from tornado.options import define, options
class HandlerCameraIMG(tornado.web.RequestHandler):
def get(self):
cap = cv2.VideoCapture(0)
if (cap.isOpened()== False):
print("Error opening video stream or file")
ret, frame = cap.read()
if not ret:
print("Error reading video")
else:
print(f"Frame size: {frame.shape}")
_, JPEG = cv2.imencode('.jpeg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])
self.set_header('Content-type', 'image/jpeg')
self.set_header('Content-length', len(JPEG))
self.write(JPEG.tobytes())
return
html_index = """<html><body><p>Camera</p>
<img src="/img/camera.jpeg"/>
</body></html>"""
class IndexPageHandler(tornado.web.RequestHandler):
def get(self):
self.write(html_index)
class WebApplication(tornado.web.Application):
def __init__(self):
handlers = [
(r"/", IndexPageHandler),
(r'/img/camera.jpeg', HandlerCameraIMG)
]
settings = {'debug': True}
tornado.web.Application.__init__(self, handlers, **settings)
def main():
define('port', default=6502, help='port to listen on')
ws_app = WebApplication()
server = tornado.httpserver.HTTPServer(ws_app)
server.listen(options.port)
print(f'Listening on http://localhost:{options.port}')
IOLoop.instance().start()
if __name__ == "__main__":
main()