diff --git a/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp b/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp index bd550303..02342f51 100644 --- a/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp +++ b/cmvr-es/devices/camera/uvc_camera/src/uvc_camera.cpp @@ -107,6 +107,9 @@ bool UVCCamera::init() { CMVR_LOG(ERROR) << "[UVCCamera] (init): set fps failed"; return false; } + if (!cap_.set(cv::CAP_PROP_BUFFERSIZE, 1)) { + CMVR_LOG(WARNING) << "[UVCCamera] (init): failed to limit capture buffer size"; + } //初始化编码器 // 初始化RGB编码器(示例参数:640x480,30fps,H.264) if (!CameraStreamEncoder::init(rgbEncoder_, codec_, encode_width_, encode_height_, fps_)) { @@ -169,6 +172,9 @@ bool UVCCamera::start() { CMVR_LOG(ERROR) << "[UVCCamera] (init): set fps failed"; return false; } + if (!cap_.set(cv::CAP_PROP_BUFFERSIZE, 1)) { + CMVR_LOG(WARNING) << "[UVCCamera] (start): failed to limit capture buffer size"; + } state_.is_opened = true; return true; } @@ -224,6 +230,29 @@ void UVCCamera::getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics) { std::lock_guard capture_lock(capture_mutex_); + if (!state_.is_streaming && !state_.is_recording) { + cap_.release(); + if (!cap_.open(serial_, cv::CAP_V4L2)) { + state_.is_error = true; + state_.error_message = "failed to reopen camera for snapshot"; + CMVR_LOG(ERROR) << "[UVCCamera] (getRGBImage): " << state_.error_message; + state_.is_opened = false; + return; + } + + cap_.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G')); + cap_.set(cv::CAP_PROP_FRAME_WIDTH, width_); + cap_.set(cv::CAP_PROP_FRAME_HEIGHT, height_); + cap_.set(cv::CAP_PROP_FPS, fps_); + cap_.set(cv::CAP_PROP_BUFFERSIZE, 1); + + if (!cap_.grab()) { + state_.is_error = true; + state_.error_message = "failed to discard camera startup frame"; + CMVR_LOG(ERROR) << "[UVCCamera] (getRGBImage): " << state_.error_message; + return; + } + } if (!cap_.read(color) || color.empty()) { state_.is_error = true; state_.error_message = "read color image failed";