1

我想用 Web 界面(用 CherryPy 制作)显示 OpenCV 处理的图像。下面的代码工作正常:

import cherrypy
import cv2


class Picture(object):
def __init__(self):
    self.cam = cv2.VideoCapture(0)

@cherrypy.expose
def index(self):
    _, image = self.cam.read()
    _, data = cv2.imencode('.jpg', image)
    cherrypy.response.headers['Content-Type'] = 'image/jpeg'
    return data.tostring()


if __name__ == '__main__':
    cherrypy.config.update({'server.socket_host': '127.0.0.1', 'server.socket_port': 80, })
    cherrypy.quickstart(Picture())

但是:我想将图像嵌入到 html 中,以便我可以(例如)将另一个图像或其他数据添加到同一页面。

我尝试了以下代码:

import cherrypy
import cv2


class Picture(object):
    def __init__(self):
        self.cam = cv2.VideoCapture(0)

@cherrypy.expose
def index(self):
    _, image = self.cam.read()
    _, data = cv2.imencode('.jpeg', image)

    return """ <html>
    <head>
    <title>CherryPy static imagl</title>
    </head>
    <html>
    <body>
    <img src=" """ + data + """:image/jpeg" />
    </body>
    </html>"""

if __name__ == '__main__':
    cherrypy.config.update({'server.socket_host': '127.0.0.1', 'server.socket_port': 80, })
    cherrypy.quickstart(Picture())

但这会产生以下错误:

 <img src=" """ + data + """:image/jpeg" />
 TypeError: cannot concatenate 'str' and 'numpy.ndarray' objects

使用以下代码将 numpy 数组转换为字符串也不起作用(它没有错误但只显示字符):

<img src=" """ + data.tostring() + """:image/jpeg" />

谁能给我更多的见解?提前致谢!

4

1 回答 1

1

以下代码可以解决问题:)

import cherrypy
import cv2
import base64


class Picture(object):
    def __init__(self):
        self.cam = cv2.VideoCapture(0)

    @cherrypy.expose
    def index(self):
        _, image = self.cam.read()
        _, data = cv2.imencode('.jpg', image)

        jpeg_base64 = base64.b64encode(data.tostring())

        return """
        <html>
        <head>
        <meta http-equiv="refresh" content="1" />
        <title>Cherrypy webcam</title>
        </head>
        <html>
        <body>
        <img src='data:image/jpeg;base64,%s' />
        <img src='data:image/jpeg;base64,%s' />
        </body>
        </html>
        """ % (jpeg_base64, jpeg_base64)

if __name__ == '__main__':
    cherrypy.config.update({'server.socket_host': '127.0.0.1', 'server.socket_port': 80, })
    cherrypy.quickstart(Picture())

此代码显示同一张图片两次。和:

<meta http-equiv="refresh" content="1" />

每秒刷新一次代码。

于 2013-09-22T18:24:40.410 回答