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";
|
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";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user