You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派5如何将摄像头图像以BufferedImage形式传入Java程序?

解决方案:树莓派5 Debian Bookworm下Java获取摄像头帧为BufferedImage

一、轻量库方案:借助Pi4J调用原生摄像头工具

1. 引入Pi4J核心依赖

Pi4J是针对树莓派的轻量Java控制库,可直接调用系统原生工具获取帧,无需依赖庞大的OpenCV:
如果用Maven管理项目,添加以下依赖:

<dependency>
    <groupId>com.pi4j</groupId>
    <artifactId>pi4j-core</artifactId>
    <version>2.3.0</version>
</dependency>

2. 通过libcamera-still抓取帧并转为BufferedImage

Debian Bookworm默认用libcamera系列工具替代旧版raspistill,可通过Java执行系统命令抓取内存中的帧,直接转为BufferedImage:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

public class CameraFrameCapture {
    public static BufferedImage getSingleFrame() throws Exception {
        // 调用libcamera-still,将帧输出到标准输出
        Process captureProcess = new ProcessBuilder()
                .command("libcamera-still", "-n", "-t", "1", "-o", "-")
                .start();
        
        try (InputStream frameStream = captureProcess.getInputStream()) {
            byte[] frameData = frameStream.readAllBytes();
            return ImageIO.read(new ByteArrayInputStream(frameData));
        } finally {
            captureProcess.destroy();
        }
    }

    public static void main(String[] args) throws Exception {
        BufferedImage currentFrame = getSingleFrame();
        // 此处添加帧处理逻辑
    }
}
  • 说明:该方案适合低帧率需求;若需高帧率,可改用libcamera-vid输出MJPEG流,再解析流中的连续帧。

二、高帧率方案:解析MJPEG流

如果需要实时高帧率采集,可先通过终端启动libcamera-vid输出MJPEG流,再用Java解析流中的帧:

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.net.Socket;

public class MjpegStreamParser {
    public static void main(String[] args) throws Exception {
        // 先在终端执行:libcamera-vid -n -t 0 --codec mjpeg --listen -o tcp://0.0.0.0:8080
        Socket streamSocket = new Socket("localhost", 8080);
        InputStream streamInput = streamSocket.getInputStream();

        while (true) {
            // 简化的MJPEG边界检测(实际需处理完整的HTTP/MJPEG格式)
            byte[] tempBuffer = new byte[1024];
            int readLen;
            // 定位帧起始边界
            while ((readLen = streamInput.read(tempBuffer)) != -1) {
                String chunk = new String(tempBuffer, 0, readLen);
                if (chunk.contains("\r\n\r\n")) {
                    break;
                }
            }
            // 读取并转换帧
            BufferedImage frame = ImageIO.read(streamInput);
            // 此处添加帧处理逻辑
        }
    }
}

三、摄像头更换建议:官方PiCam Module 3

官方PiCam Module 3在Debian Bookworm下的驱动支持更完善,无需额外编译适配,配合上述libcamera工具的方案稳定性更高,能避免第三方摄像头的驱动兼容问题。

四、关键避坑点

  • 确保树莓派已启用摄像头:执行raspi-config进入Interface Options开启Camera,重启后生效。
  • 先验证原生工具可用性:终端执行libcamera-still -n -o test.jpg,检查是否生成正常图片,排除硬件或驱动问题。
  • Sarxos Webcam Capture已停止维护,针对ARM64编译本地库成本高,不建议继续使用。

内容的提问来源于stack exchange,提问作者Spenser Spratlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:43:26