java - 从 Java 中的 IP 摄像机获取最新图像
问题描述
我正在开发 Java APP,它将处理来自本地网络上的 IP 摄像机(Milesight MS-C2682-P)的流。它将根据图像中的内容检测对象并触发动作(假设它会在检测到人时启动警报) - 因为我需要它以最小的延迟。
我有一个 RTSP 链接“rtsp://username:password@ip_addr:rtsp_port/main”,可以从我的 IP 摄像机访问流,但在我的 JAVA 应用程序中有 12 秒的延迟(而且它正在增加)。当图像处理速度不够快时会发生这种情况,因此它们被缓冲。有“hacks”和“workarounds”(OpenCV VideoCapture 由于捕获缓冲区而滞后),但我相信必须有一个更漂亮的解决方案。
我能够获得的另一个链接是 HTTP 链接,它也使用 H.264 编解码器(如果有可能有效地使用它们,可以与 MJPEG 和 MPEG4 一起使用)。“ http://username:password@ip_addr:http_port/ipcam/mjpeg.cgi ” - 在 Python 和浏览器中就像一个魅力...... 但是,它在 Java 中不起作用,会引发错误:
OpenCV(4.2.0) C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: 找不到起始编号(在文件名中):函数 'cv::icvExtractPattern' 中的 HTTP_URL
两个链接在 VLC 中都能顺利运行。
因此,网络不是问题(因为 VLC 以最小的延迟处理流)并且使用 OpenCV 的 Python 也做得很好。这一切都归结为 OpenCV 的 Java 实现。我猜。
这是一个Java代码:
VideoPlayer videoPlayer = new VideoPlayer(); // My Class, just creates and updates JFrame, works like a charm with laptop's webcam, so certainly no issues here
Mat image = new Mat();
VideoCapture ipCamera = new VideoCapture(RTSP_URL);
// or the HTTP link
// VideoCapture ipCamera = new VideoCapture(HTTP_URL);
// verify if u got access to camera
if (!ipCamera.isOpened()) {
System.out.println("ERROR: Camera isn't working !!! ");
return;
}
System.out.println("OK: Connected to camera.");
while (true) {
ipCamera.read(image);
videoPlayer.updateVideo_MatImage(image);
}
这是我正在使用的 Python 代码:
import cv2
cap = cv2.VideoCapture(RTSP_URL)
# or the HTTP link
# cap = cv2.VideoCapture(HTTP_URL)
while True:
ret, image = cap.read()
cv2.imshow("Test", image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
发出请求时,我只需要获取最新图像。所以我需要避免任何类型的缓冲。它必须用 Java 实现,因为它是这个项目的要求。那么有没有办法只从相机中获取最新图像?什么可能导致上述错误?
谢谢你们的任何建议。
解决方案
推荐阅读
- java - Propagation REQUIRED 如何在 Spring Boot 中工作?
- c++ - 构造二维数组向量的好方法
- excel - 将 MailMerge 从一个 Excel 按钮自动填充到 Word 模板中
- tensorflow - ResNet 图像分割错误:形状不兼容
- php - 是否可以将元数据添加到 MongoDB 操作以进行日志记录?
- ruby-on-rails - BCrypt::Errors::InvalidSalt on Rails db:reset
- sql-server - 安装期间和之后启动数据库引擎的问题:Windows 2019 Server 上的 MS SQL Server 2019
- python - 有没有办法让 Spyder 在 Anaconda 上导入 numpy?
- openlayers - 如何在openlayers中设置绘图圆半径的限制?
- linux - 在 Heroku 中使用 Wine