【问题标题】:Opencv Black Image only on Raspberry仅在覆盆子上的 Opencv 黑色图像
【发布时间】:2020-04-17 13:39:42
【问题描述】:

opencv 的常规检查在 buster 桌面上运行良好

 cv2.imshow('frame',frame)

这段代码在 ubuntu 和 mac 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()

它确实返回了带有 raspian buster 的 rapsberry pi 3 上的黑色 camera.jpeg

有什么可以解释的原因吗?

【问题讨论】:

    标签: python opencv raspberry-pi


    【解决方案1】:

    您的代码中的缩进似乎存在一些问题,并且对 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()
    

    【讨论】:

    • 感谢您的示例。但如前所述,代码本身在其他机器上运行没有任何问题。此外,您的代码仅显示黑色图像。
    • 它从你的 RasPi 相机捕捉到什么尺寸的图像?
    • 我在 Raspberry Pi 上进行了测试,它在带有 Python 3.7 和 Tornado 6.0.4 的 Raspbian Buster 10 下运行良好。
    • 也许尝试在您的 RasPi 上运行 raspistill 以检查摄像头,如果可行,请尝试 cv2.imwrite('result.jpg', frame) 以查看 OpenCV 是否正确抓取帧。
    • 对不起,更不用说我使用了 USB 相机 以为 raspistill 只使用 pi 相机。除了上面代码中提到的以外,我没有配置任何其他解决方案
    猜你喜欢
    • 2015-02-07
    • 2019-07-25
    • 2018-05-31
    • 2015-08-12
    • 1970-01-01
    • 2013-08-21
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多