이는 RTSP 스트림 및 딥 러닝 프레임워크와 같이 시간이 많이 걸리는 알고리즘에서 알려진 문제입니다. 개별 프레임을 처리하는 데 스트림의 프레임 속도보다 오래 걸리는 경우 동기화가 중단되는 것입니다. 현실과 캡처된 이미지 사이의 지연이 점점 더 커지고 있습니다.
이 문제에 대한 두 가지 가능한 해결책이 있습니다.
코드는 그 자체로 말합니다.
GStreamer 또는 FFmpeg를 사용하여 스트림을 열 수 있습니다.
RTSP 스트림은 일반적으로 H264로 압축됩니다. 따라서 압축 해제는 한동안 중단된 스레드와 같은 타이밍 문제에 민감합니다.
애플리케이션을 실행하려면 다음을 수행해야 합니다.
$ sudo apt-get install codeblocks
) RTSP 스트림에는 유선 이더넷 연결만 사용하십시오. Wi-Fi가 불안정할 수 있습니다.
RTSP 프로토콜은 단 하나의 누락된 프레임에도 민감하기 때문에 스트림이 쉽게 중단될 수 있습니다.
딥 러닝 앱에서 스트림을 사용하는 경우 딥 러닝 모델의 요구 사항에 맞게 해상도와 프레임 속도를 조정하세요.
모델에 416x416 입력이 있고 단일 프레임을 처리하는 데 200mSec가 걸리는 경우 30FPS에서 1280x960 스트림을 보내는 것은 좋지 않습니다.
추가 메모리와 처리 능력만 필요합니다.
UDP 또는 TCP를 스트리밍하려면 미리 명령줄 프롬프트에서 스트림이 작동하는지 확인하세요. 그렇지 않다면 확실히 OpenCV에서 작동하지 않을 것입니다. 파이프라인의 코딩, 주소 또는 누락된 모듈로 인해 오류가 발생하는 경우가 많습니다. 추가 GStreamer 모듈을 설치해야 하는 경우 OpenCV도 다시 빌드해야 합니다! 자세한 내용은 당사 웹사이트를 참조하세요.
애플리케이션을 실행하려면 Code::Blocks에서 프로젝트 파일 RTSPcam.cbp를 로드합니다.
Jetson Nano 를 사용하는 경우 OpenCV가 헤더 파일을 저장한 위치를 /usr/include/opencv4
로 변경해야 합니다.
main.cpp의 라인 16에서 스트림이 열립니다.
cam.Open("rtsp://192.168.178.129:8554/test/");
cam.Open("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 주소입니다.
cam.Open("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 주소입니다.
cam.Open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
cam.Open("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);
cam.Open(0);
cam.Open(0); //if RaspiCam is not connected
cam.Open(1); //if RaspiCam is connected
cam.Open("James.mp4");
cam.Open("/home/pi/Pictures/Plants");
cam.Open("/home/pi/Pictures/Garden.jpg");
int main ()
{
cv::Mat frame;
RTSPcam cam;
cv::namedWindow ( " Camera " , cv::WINDOW_AUTOSIZE);
cam. Open ( " rtsp://192.168.178.129:8554/test/ " ); // you can dump anything OpenCV eats. (cv::CAP_ANY) BTW,OpenCV first tries FFmpeg
while ( true )
{
if (!cam. GetLatestFrame (frame)){
cout << " Capture read error " << endl;
break ;
}
// place here your time consuming algorithms
// cout << cam.CurrentFileName << endl;
// show frame
cv::imshow ( " Camera " ,frame);
char esc = cv::waitKey ( 2 );
if (esc == 27 ) break ;
}
cv::destroyAllWindows () ;
return 0 ;
}