У меня странная проблема.
мой код довольно прост, просто прочитайте фрейм из RTSP и выполните некоторую обработку.
for (;;)
{
cap >> frame;
if (frame.empty()) {
break;
}
// heavy_processing(frame) //
imshow("cam",frame);
}
потоковая передача по протоколу RTSP - это веб-камера с разрешением 1920x1080P, сетевой трафик около 4 Мбит / с
без функции heavy_processing (), в основном она работает хорошо. Процессор составляет 45% (i7-7700)
с функцией heavy_processing (), он прочитает пустой кадр через пару секунд, а затем завершится. Я могу видеть скачок процессора до 95% + до его выхода.
Я сам собрал opencv (3.4.3) с опцией по умолчанию.
До сих пор я подозреваю, что устройство видеокап отключено, когда в буфере слишком много кадров, но это не имеет смысла. Разве он не отбрасывает самый ранний кадр? или возможно, что рамка повреждена внутри 'heavy_processing ()'?
ffmpeg, вероятно, 4.0 (встроенный сам), Ubuntu 16.04
функция тяжелой обработки:
void detect(Mat frame,vector<cv::Rect> &face_rects) {
Mat detectFrame;
cv::resize(frame, detectFrame, cv::Size(300, 300), 0, 0, cv::INTER_AREA);
dnn::blobFromImage(detectFrame, blob, 1.0, inpSize, mean, false, false);
// if I return here is good
net.setInput(blob);
Mat detection = net.forward(); // as long as I add the last two line, it will cause read frame empty
ldd результат:
linux-vdso.so.1 => (0x00007ffeb5f9b000)
libopencv_dnn.so.3.4 => /usr/local/lib/libopencv_dnn.so.3.4 (0x00007fe5fd796000)
libprotobuf.so.9 => /usr/lib/x86_64-linux-gnu/libprotobuf.so.9 (0x00007fe5fd454000)
libcppkafka.so.0.2 => /usr/local/lib/libcppkafka.so.0.2 (0x00007fe5fd18c000)
libopencv_highgui.so.3.4 => /usr/local/lib/libopencv_highgui.so.3.4 (0x00007fe5fcf74000)
libopencv_videoio.so.3.4 => /usr/local/lib/libopencv_videoio.so.3.4 (0x00007fe5fcd27000)
libopencv_imgcodecs.so.3.4 => /usr/local/lib/libopencv_imgcodecs.so.3.4 (0x00007fe5fc664000)
libopencv_imgproc.so.3.4 => /usr/local/lib/libopencv_imgproc.so.3.4 (0x00007fe5f9d50000)
libopencv_core.so.3.4 => /usr/local/lib/libopencv_core.so.3.4 (0x00007fe5f8e49000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fe5f8ac7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe5f87bd000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fe5f85a7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe5f81dd000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe5f7fbf000)
/lib64/ld-linux-x86-64.so.2 (0x0000563d8f116000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fe5f7da5000)
librdkafka.so.1 => /usr/local/lib/librdkafka.so.1 (0x00007fe5f7a9d000)
libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007fe5f7451000)
libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007fe5f719c000)
libcairo.so.2 => /usr/lib/x86_64-linux-gnu/libcairo.so.2 (0x00007fe5f6e88000)
libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007fe5f6c65000)
libgobject-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007fe5f6a12000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fe5f6701000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fe5f64f8000)
libdc1394.so.22 => /usr/lib/x86_64-linux-gnu/libdc1394.so.22 (0x00007fe5f6282000)
libavcodec.so.58 => /usr/local/lib/libavcodec.so.58 (0x00007fe5f4d93000)
libavformat.so.58 => /usr/local/lib/libavformat.so.58 (0x00007fe5f494b000)
libavutil.so.56 => /usr/local/lib/libavutil.so.56 (0x00007fe5f46d7000)
libswscale.so.5 => /usr/local/lib/libswscale.so.5 (0x00007fe5f4458000)
libjpeg.so.8 => /usr/lib/x86_64-linux-gnu/libjpeg.so.8 (0x00007fe5f41fe000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007fe5f3fd9000)
libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007fe5f3d65000)
libjasper.so.1 => /usr/lib/x86_64-linux-gnu/libjasper.so.1 (0x00007fe5f3b0f000)