이는 RTSP 스트림 및 딥 러닝 프레임워크와 같이 시간이 많이 걸리는 알고리즘에서 알려진 문제입니다. 개별 프레임을 처리하는 데 스트림의 프레임 속도보다 오래 걸리는 경우 동기화가 중단되는 것입니다. 현실과 캡처된 이미지 사이의 지연이 점점 더 커지고 있습니다.
이 문제에 대한 두 가지 가능한 해결책이 있습니다.
코드는 그 자체로 말합니다. FFmpeg의 GStreamer를 사용하여 스트림을 열 수 있습니다.
연결된 카메라 수에는 제한이 없습니다. 단 하나의 카메라일 수도 있습니다.
그러나 카메라가 많을수록 모든 개별 스레드를 방문하는 데 더 많은 CPU 시간이 필요합니다.
애플리케이션을 실행하려면 다음을 수행해야 합니다.
다음과 같이 cmake를 사용하여 빌드 경로를 만들고 프로젝트를 빌드합니다.
rm -rf build && mkdir -p build && cd build
cmake .. && make
또는 설치해야 하는 Code::Blocks를 사용하여 프로젝트를 빌드할 수도 있습니다( $ sudo apt-get install codeblocks
).
RTSP 스트림에는 유선 이더넷 연결만 사용하십시오. Wi-Fi가 불안정할 수 있습니다.
RTSP 프로토콜은 단 하나의 누락된 프레임에도 민감하기 때문에 스트림이 쉽게 중단될 수 있습니다.
딥 러닝 앱에서 스트림을 사용하는 경우 딥 러닝 모델의 요구 사항에 맞게 해상도와 프레임 속도를 조정하세요.
모델에 416x416 입력이 있고 단일 프레임을 처리하는 데 200mSec가 걸리는 경우 30FPS에서 1280x960 스트림을 보내는 것은 좋지 않습니다. 추가 메모리와 처리 능력만 필요합니다.
모든 카메라의 해상도가 동일한지 확인하세요. 이 예에서 OpenCV 연결 알고리즘은 다양한 해상도에 민감합니다. 너비나 높이가 다른 경우 예외가 발생합니다.
카메라는 스레드에 의해 서로 동기화되지 않습니다. 지연이 약간 다를 수 있습니다.
UDP 또는 TCP를 스트리밍하려면 미리 명령줄 프롬프트에서 스트림이 작동하는지 확인하세요. 그렇지 않다면 확실히 OpenCV에서 작동하지 않을 것입니다. 파이프라인의 코딩, 주소 또는 누락된 모듈로 인해 오류가 발생하는 경우가 많습니다. 추가 GStreamer 모듈을 설치해야 하는 경우 OpenCV도 다시 빌드해야 합니다! 자세한 내용은 당사 웹사이트를 참조하세요.
애플리케이션을 실행하려면 Code::Blocks에서 프로젝트 파일 MultiThread.cbp를 로드합니다.
Jetson Nano 를 사용하는 경우 OpenCV가 헤더 파일을 저장한 위치를 /usr/include/opencv4
로 변경해야 합니다.
main.cpp의 23번째 줄에 스트림이 정의되어 있습니다.
Grb1->Init("rtsp://192.168.178.129:8554/test/");
Grb1->Init("udpsrc port=5200 ! application/x-rtp, media=video, clock-rate=90000, payload=96 ! rtpjpegdepay ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
보낸 사람: Raspberry Pi Buster OS가 탑재된 RaspiCam
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
보낸 사람: Raspberry Pi Bullseye OS가 탑재된 RaspiCam
gst-launch-1.0 -v libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
host=192.168.178.84
수신자의 IP 주소입니다.
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
보낸 사람: Raspberry Pi Buster OS가 탑재된 RaspiCam
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
보낸 사람: Raspberry Pi Bullseye OS가 탑재된 RaspiCam
gst-launch-1.0 -v libcamerasrc ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
host=192.168.178.32
발신자의 IP 주소입니다.
Grb1->Init("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init("v4l2src device=/dev/video0 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init(0);
Grb1->Init(0); //if RaspiCam is not connected
Grb2->Init(1); //if RaspiCam is connected