fix(camera): flush UVC frames before snapshot

This commit is contained in:
linbo 2026-08-12 10:02:36 +08:00
parent 2c5855a497
commit e94db8b66c

View File

@ -107,6 +107,9 @@ bool UVCCamera::init() {
CMVR_LOG(ERROR) << "[UVCCamera] (init): set fps failed"; CMVR_LOG(ERROR) << "[UVCCamera] (init): set fps failed";
return false; 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) // 初始化RGB编码器(示例参数:640x480,30fps,H.264)
if (!CameraStreamEncoder::init(rgbEncoder_, codec_, encode_width_, encode_height_, fps_)) { 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"; CMVR_LOG(ERROR) << "[UVCCamera] (init): set fps failed";
return false; 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; state_.is_opened = true;
return true; return true;
} }
@ -224,6 +230,29 @@ void UVCCamera::getRGBImage(cv::Mat& color, Rs2Intrinsics& intrinsics)
{ {
std::lock_guard capture_lock(capture_mutex_); 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()) { if (!cap_.read(color) || color.empty()) {
state_.is_error = true; state_.is_error = true;
state_.error_message = "read color image failed"; state_.error_message = "read color image failed";