fix(camera): flush UVC frames before snapshot
This commit is contained in:
parent
2c5855a497
commit
e94db8b66c
@ -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";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user