首页 > 解决方案 > 从 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 实现,因为它是这个项目的要求。那么有没有办法只从相机中获取最新图像?什么可能导致上述错误?

谢谢你们的任何建议。

标签: javapythonopencvip-camera

解决方案


推荐阅读