Получите последнее изображение с IP-камеры в Java - PullRequest
4 голосов
/ 19 февраля 2020

Я работаю над 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, так как это требование для этого проекта. Так есть ли способ получить только последнее изображение с камеры? Что может вызвать ошибку, упомянутую выше?

Спасибо, ребята, за любые советы.

...