从Java中的IP摄像头获取最新图像

2024-05-19 00:40:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发Java应用程序,它将处理来自本地网络上IP摄像头(Milesight MS-C2682-p)的流。它将根据图像中的内容检测对象并触发动作(比如说,当检测到一个人时,它将启动警报)——为此,我需要它具有最小的延迟

我有一个RTSP链接“rtsp://username:password@ip_addr:rtsp_port/main”,从我的ip摄像头访问流,但在我的JAVA应用程序中有12秒的延迟(并且正在增加)。当图像处理速度不够快时,就会发生这种情况,因此会对图像进行缓冲。有“黑客”和“变通办法”(OpenCV VideoCapture lag due to the capture buffer),但我认为必须有一个更漂亮的解决方案

我能得到的另一个链接是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:错误:(-5:错误参数)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实现,因为这是这个项目的一个需求。 那个么,有并没有办法只从相机上获取最新的图像呢? 什么可能导致上述错误

谢谢你们的建议


Tags: 图像imageiphttpurlnew链接错误

热门问题