Raspberry Pi上的硬件加速JPEG压缩

2024-06-16 10:05:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个立体相机连接到一个树莓圆周率。我想从中获取图像,压缩它们,并将它们连续发送到PC。我正试着用MMAL来做这个

我有以下代码来测试它:

from picamera import mmal, mmalobj
import cv2
import io
from threading import Event

finished = Event()  # triggered whenever it finishes compressing an image

image = cv2.imread('image.png')
image = cv2.resize(image, (3200, 1300))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

encoder = mmalobj.MMALImageEncoder()

encoder.inputs[0].format = mmal.MMAL_ENCODING_I420
encoder.inputs[0].framesize = (3200, 1300)
encoder.inputs[0].commit()

encoder.outputs[0].copy_from(encoder.inputs[0])
encoder.outputs[0].format = mmal.MMAL_ENCODING_JPEG
encoder.outputs[0].commit()
encoder.outputs[0].params[mmal.MMAL_PARAMETER_JPEG_Q_FACTOR] = 90


def image_callback(port, buf):
    jpg_data.write(buf.data)

    if bool(buf.flags & mmal.MMAL_BUFFER_HEADER_FLAG_FRAME_END):
        finished.set()
        return True

    return False


# perform compression on the image 100 times
for i in range(100):
    finished.clear()

    encoder.inputs[0].enable(lambda port, buf: True)
    encoder.outputs[0].enable(image_callback)

    jpg_data = io.BytesIO()
    buf = encoder.inputs[0].get_buffer()
    buf.data = image[:]
    encoder.inputs[0].send_buffer(buf)

    finished.wait()

    jpg_data.close()
    encoder.inputs[0].disable()
    encoder.outputs[0].disable()

只有在每次迭代中禁用并重新启用端口时,这才有效。但是,它比仅使用OpenCV慢:

import cv2
import io

image = cv2.imread('image.png')
image = cv2.resize(image, (3200, 1300))
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# perform compression on the image 100 times
for i in range(100):
    success, buffer = cv2.imencode(".jpg", image)
    io_buffer = io.BytesIO(buffer)
    data = io_buffer.read()

此外,我发现禁用和重新启用占用了大约一半的时间。有人知道为什么会这样吗?有没有更快的方法?谢谢


Tags: fromioimageimportencoderdatabufferoutputs