修复问题

This commit is contained in:
2025-09-28 10:36:29 +08:00
parent b458e754a5
commit 8024f53bce
2 changed files with 56 additions and 3 deletions

View File

@@ -25,6 +25,7 @@ import org.springframework.util.CollectionUtils;
import java.io.ByteArrayOutputStream;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -105,6 +106,7 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
// 解码/推理/发送解耦
private final OpenCVFrameConverter.ToMat toMat = new OpenCVFrameConverter.ToMat();
private final OpenCVFrameConverter.ToMat matToFrameConverter = new OpenCVFrameConverter.ToMat();
private final AtomicReference<Mat> latestFrame = new AtomicReference<>();
private final AtomicReference<List<Detection>> latestDetections =
new AtomicReference<>(java.util.Collections.emptyList());
@@ -442,14 +444,16 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
if (enableDetection) {
Mat src = latestFrame.get();
if (src == null || src.empty()) continue;
if (src == null || src.empty()) {
continue;
}
// 叠加最近一次检测结果
List<Detection> dets = latestDetections.get();
if (!CollectionUtils.isEmpty(dets)) {
Overlay.draw(dets, src);
}
// 更新最近叠好框的帧用于存证
// 更新"最近叠好框的帧"用于存证
updateLatestAnnotated(src);
// 统计(仅窗口巡检时)
@@ -460,7 +464,27 @@ public class MediaTransferFlvByJavacv extends MediaTransfer implements Runnable
finishWindow();
}
frame = toMat.convert(src);
// 完全重新创建Frame避免使用转换器
int width = src.cols();
int height = src.rows();
int depth = src.depth();
int channels = src.channels();
// 创建新的Frame
frame = new Frame(width, height, Frame.DEPTH_UBYTE, channels);
// 将Mat数据复制到Frame
ByteBuffer frameBuffer = (ByteBuffer)frame.image[0];
frameBuffer.clear();
// 确保Mat是连续的
Mat continuous = src.isContinuous() ? src : src.clone();
byte[] matData = new byte[Math.toIntExact(continuous.total() * continuous.elemSize())];
continuous.data().get(matData);
// 复制数据
frameBuffer.put(matData);
frameBuffer.rewind();
} else {
frame = grabber.grab();
}

View File

@@ -0,0 +1,29 @@
package com.ruoyi.video.thread.detector;
import com.ruoyi.video.domain.Detection;
import org.bytedeco.opencv.opencv_core.*;
import java.util.*;
/**
* 空检测器,用于在模型加载失败时提供回退机制
*/
public class DummyDetector implements YoloDetector {
private final String name;
public DummyDetector(String name) {
this.name = name;
System.out.println("警告: 使用DummyDetector替代真实模型 - " + name);
}
@Override
public String name() {
return name;
}
@Override
public List<Detection> detect(Mat bgr) {
// 返回空列表,不进行实际检测
return Collections.emptyList();
}
}