1

OpenCVで加工した画像をWebインターフェース(CherryPyで作ったもの)で見せたいです。以下のコードは正常に動作します:

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 arry を文字列に変換しても機能しません (エラーは発生しませんが、文字のみが表示されます)。

<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())

このコードは、同じ画像を 2 回表示します。そしてその:

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

コードを毎秒更新します。

于 2013-09-22T18:24:40.410 に答える