Я работаю над Java APP, которое будет обрабатывать поток с IP-камеры (Milesight MS-C2682-P), расположенной в локальной сети. Он будет обнаруживать объекты и запускать действия в зависимости от того, что на изображении (допустим, он подаст сигнал тревоги при обнаружении человека) - для этого мне нужно, чтобы это было с минимальной задержкой.
У меня есть RTSP-ссылка «rtsp: // username:password@ip_addr: rtsp_port / main» для доступа к потоку с моей IP-камеры, но в моем приложении JAVA задержка составляет 12 секунд (и она увеличивается ). Это происходит, когда изображения обрабатываются недостаточно быстро, поэтому они буферизируются. Есть «хаки» и «обходные пути» ( OpenCV VideoCapture с задержкой из-за буфера захвата ), но я считаю, что должно быть более красивое решение.
Другая ссылка, на которую я смог get - это HTTP, который также использует код H.264 c (может использоваться с 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: не удается найти начальный номер (в имени файла): HTTP_URL в функции 'cv :: icvExtractPattern'
Обе ссылки работают без сбоев в VL C.
Итак, сеть не является проблемой (потому что VL C обрабатывает поток с минимальной задержкой), и Python с использованием OpenCV также хорошо работает. Все сводится к Java реализации OpenCV .. Я думаю.
Вот код 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, так как это требование для этого проекта. Так есть ли способ получить только последнее изображение с камеры? Что может вызвать ошибку, упомянутую выше?
Спасибо, ребята, за любые советы.