Opencv Black Изображение только на Raspberry - PullRequest
1 голос
/ 17 апреля 2020

Обычная проверка на opencv отлично работает на рабочем столе buster с

 cv2.imshow('frame',frame)

Этот код также отлично работает на ubuntu и ma c os

import cv2
import io
import numpy as np
import tornado.httpserver
import tornado.web

from PIL import Image, ImageDraw
from tornado.ioloop import IOLoop

class HandlerCameraIMG(tornado.web.RequestHandler):

    byte_io = io.BytesIO()

    def get(self):
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    jpg = Image.fromarray(img_rgb)
    self.byte_io.seek(0)
    jpg.save(self.byte_io, format="JPEG")
    s = self.byte_io.getvalue()
    self.set_header('Content-type', 'image/jpeg')
    self.set_header('Content-length', len(s))
    self.write(s)
    return

html_index = """<html><body><p>Camera</p>
            <img src="/img/camera.jpeg" style="width:50px;height:50px;"/>
            </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():
    ws_app = WebApplication()
    server = tornado.httpserver.HTTPServer(ws_app)
    server.listen(9090)
    IOLoop.instance().start()

if __name__ == "__main__":
    main()

Он возвращает черный camera.jpeg на rapsberry pi 3 с распиан-бастером

1 Ответ

2 голосов
/ 17 апреля 2020

Кажется, что в вашем коде есть некоторые проблемы с отступами, а также излишняя зависимость от 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...