用AI为工业装上“智能眼”:图像识别与实时视频流的融合实践

一、引言:工业自动化的“智能眼睛”

随着智能制造、工业4.0的持续推进,计算机视觉逐渐取代人眼,成为工业自动化场景中不可替代的“感知系统”。
从生产线上的缺陷检测,到仓储机器人中的定位与导航,再到高危场所的远程识别与告警,图像识别技术已经从实验室走向生产线核心。

但现实问题是,工业视觉系统在部署时往往面临三大难点:

  1. 📡 视频源复杂:设备支持 RTSP/RTMP/USB 不一,接入不统一;

  2. 实时要求高:必须边播边识别,毫秒级延迟控制;

  3. 🧠 AI模型计算重:嵌入式、ARM端资源有限,难以大模型推理。

如何在“稳定接入工业视频流”的基础上,高效对接图像识别模型,成为构建智能工业视觉系统的关键一环。


二、整体方案设计:视频输入 × 机器学习模型融合

本方案采用如下架构组合:

  • 🎬 大牛直播SDK:负责 RTSP/RTMP 摄像头流的实时接入与解码;

  • 🧠 OpenCV + AI 模型(如 ONNXRuntime):进行图像识别任务;

  • ⚙️ 业务处理模块:如结果上报、告警触发、界面显示、PLC对接等。

数据链路流程如下:


三、基于大牛直播SDK的视频接入与回调实现

✅ Step 1:接入 RTSP/RTMP 工业摄像头

通过大牛直播SDK提供的接口,一行代码即可接入 RTSP/RTMP 视频流:

/*
 * SmartPlayer.java
 * Created by daniusdk.com
 * WeChat: xinsheng120
 */
 
private void InitAndSetConfig() {
	openPlayer();

	if (playerHandle == 0) {
		Log.e(TAG, "playerHandle 创建失败");
		return;
	}

	configurePlayerOptions();
	setPlaybackUrl();
}

private void openPlayer() {
	playerHandle = libPlayer.SmartPlayerOpen(myContext);
	if (playerHandle != 0) {
		libPlayer.SetSmartPlayerEventCallbackV2(playerHandle, new EventHandlerV2Impl(handler, this));
	}
}

private void configurePlayerOptions() {
	libPlayer.SmartPlayerSetBuffer(playerHandle, playBuffer);

	//设置实时回调下载速度
	libPlayer.SmartPlayerSetReportDownloadSpeed(playerHandle, 1, 2);

	libPlayer.SmartPlayerSetFastStartup(playerHandle, isFastStartup ? 1 : 0);

	libPlayer.SmartPlayerSaveImageFlag(playerHandle, 1);

	int is_using_tcp = 1;   //设置RTSP TCP/UDP模式(默认UDP模式)
	libPlayer.SmartPlayerSetRTSPTcpMode(playerHandle, is_using_tcp);

	int rtsp_timeout = 10;  //设置RTSP超时时间, timeout单位为秒,必须大于0
	libPlayer.SmartPlayerSetRTSPTimeout(playerHandle, rtsp_timeout);

	libPlayer.SmartPlayerSetRTSPAutoSwitchTcpUdp(playerHandle, 1);
}

private void setPlaybackUrl() {
	//playbackUrl = "rtmp://192.168.0.101:1935/hls/stream1";
	//playbackUrl = "rtsp://192.168.1.4:18554/stream1";

	Log.i(TAG, "setPlaybackUrl: " + playbackUrl);

	if (playbackUrl == null || playbackUrl.isEmpty()) {
		Log.e(TAG, "playbackUrl is NULL");
		return;
	}
	libPlayer.SmartPlayerSetUrl(playerHandle, playbackUrl);
}

支持工业设备中常见的:

  • RTSP拉流(安防摄像头)

  • RTMP推流(边缘设备、编码器)

  • 本地文件/USB摄像头等拓展


✅ Step 2:开启 YUV 或 RGB 图像帧回调

在播放过程中,启用帧数据回调,将视频帧送入图像识别模块,以回调RGB数据为例:

private static class RGBAExternalRender implements NTExternalRender {
	// public static final int NT_FRAME_FORMAT_RGBA = 1;
	// public static final int NT_FRAME_FORMAT_ABGR = 2;
	// public static final int NT_FRAME_FORMAT_I420 = 3;

	private final String image_path_;
	private long last_save_image_time_ms_;

	private int width_;
	private int height_;
	private int row_bytes_;

	private ByteBuffer rgba_buffer_;

	public RGBAExternalRender(String image_path) {
		this.image_path_ = image_path;
	}

	@Override
	public int getNTFrameFormat() {
		Log.i(TAG, "RGBAExternalRender::getNTFrameFormat return " + NT_FRAME_FORMAT_RGBA);
		return NT_FRAME_FORMAT_RGBA;
	}

	@Override
	public void onNTFrameSizeChanged(int width, int height) {
		width_ = width;
		height_ = height;

		row_bytes_ = width_ * 4;
		rgba_buffer_ = ByteBuffer.allocateDirect(row_bytes_ * height_);

		Log.i(TAG, "RGBAExternalRender::onNTFrameSizeChanged width_:" + width_ + " height_:" + height_);
	}

	@Override
	public ByteBuffer getNTPlaneByteBuffer(int index) {
		if (index == 0)
			return rgba_buffer_;

		Log.e(TAG, "RGBAExternalRender::getNTPlaneByteBuffer index error:" + index);
		return null;
	}

	@Override
	public int getNTPlanePerRowBytes(int index) {
		if (index == 0)
			return row_bytes_;

		Log.e(TAG, "RGBAExternalRender::getNTPlanePerRowBytes index error:" + index);
		return 0;
	}

	public void onNTRenderFrame(int width, int height, long timestamp) {
		if (rgba_buffer_ == null)
			return;

		rgba_buffer_.rewind();

		// copy buffer

		// test
		// byte[] test_buffer = new byte[16];
		// rgba_buffer_.get(test_buffer);

		Log.i(TAG, "RGBAExternalRender:onNTRenderFrame " + width + "*" + height + ", t:" + timestamp);

		// Log.i(TAG, "RGBAExternalRender:onNTRenderFrame rgba:" +
		// bytesToHexString(test_buffer));
	}
}

四、图像识别模块:AI模型 + OpenCV 工业场景实战

🔍 常见识别任务:

场景目标
生产质检裂痕识别、缺件检测
工厂监控人员识别、工服识别
工业装配零件识别、条码识别
危险区域区域入侵检测、姿态识别

🤖 示例:ONNX格式模型的推理处理流程

伪代码如下:

public void process(Mat frame, long timestamp) {
    // 前处理:尺寸、归一化、通道变换
    Mat resized = new Mat();
    Imgproc.resize(frame, resized, new Size(224, 224));
    resized.convertTo(resized, CvType.CV_32F, 1.0 / 255);

    // 模型推理(ONNXRuntime、NCNN等)
    float[] inputData = matToCHW(resized);
    float[] output = aiModel.run(inputData);

    // 后处理:结果解码 + 可视化
    List<Rect> results = decodeBoxes(output);
    for (Rect r : results) {
        Imgproc.rectangle(frame, r.tl(), r.br(), new Scalar(0, 255, 0), 2);
    }

    // 可视化/输出
    renderer.drawFrame(frame);
}

五、边缘部署优化建议

  • 🧩 帧率控制:可选每秒处理2~5帧即可满足大多数识别任务;

  • 💡 轻量模型:推荐使用 MobileNet、YOLOv8-n、ResNet18 等结构;

  • ⚙️ 异步线程处理:回调中不要阻塞,图像处理用独立线程池;

  • 🔄 模型热切换:不同工位/任务可支持动态替换推理模型;

  • 📤 识别结果回传:MQTT、Modbus、TCP 上报识别结果/坐标/截图;


六、典型应用案例

工业质检

  • 相机通过 RTSP 推流检测产品表面;

  • OpenCV识别裂纹、划痕、偏位;

  • 异常帧保存为图片并上报服务器。

智能安全生产

  • 工厂内 RTMP 视频流实时分析;

  • 检测是否佩戴安全帽、是否误入危险区域;

  • 未合规人员触发声光报警。

自动分拣系统

  • 机械臂前端通过摄像头识别零件类型;

  • 用 AI 模型判断形状、标签、颜色;

  • 识别后控制下游执行动作。


七、总结:AI识别从不只是模型,更是系统

在工业自动化落地过程中,图像识别的价值不在于“看得见”,而在于“看得准 + 反应快 + 接得上”

大牛直播SDK 提供稳定、标准化的视频流输入接口,
OpenCV 提供灵活而强大的图像处理能力,
AI 模型提供智能识别大脑,
三者融合构建起一套真正可部署、可扩展、可维护的智能视觉系统。

posted @ 2025-07-09 12:27  音视频牛哥  阅读(15)  评论(0)    收藏  举报  来源