我正在开发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实现,因为这是这个项目的一个需求。 那个么,有并没有办法只从相机上获取最新的图像呢? 什么可能导致上述错误
谢谢你们的建议
目前没有回答
相关问题 更多 >
编程相关推荐