如何在libuvc中获取相机全部像素格式及分辨率并进行设置?
关于libuvc的两个操作问题解答
1. 获取相机支持的全部像素格式与分辨率
要获取相机支持的所有像素格式及对应分辨率,核心是遍历设备的格式描述符和帧描述符:
- 先通过
uvc_find_device、uvc_open等API枚举并打开目标UVC设备 - 获取设备的格式描述符链表,每个格式描述符对应一种像素格式
- 在每个格式描述符下,遍历帧描述符,每个帧描述符对应一组分辨率和帧率参数
关键代码示例:
// 假设已成功打开设备,得到uvc_device_handle_t *devh uvc_format_desc_t *format_desc; uvc_frame_desc_t *frame_desc; // 遍历所有格式描述符 for (format_desc = devh->dev->first_format; format_desc != NULL; format_desc = format_desc->next) { // 打印像素格式名称(如YUYV、MJPG等) printf("像素格式: %s\n", uvc_format_name(format_desc->bDescriptorSubtype, format_desc->guidFormat)); // 遍历当前格式下的所有分辨率与帧率配置 for (frame_desc = format_desc->frame_descs; frame_desc != NULL; frame_desc = frame_desc->next) { printf(" 分辨率: %dx%d, 帧率范围: %d-%d fps\n", frame_desc->wWidth, frame_desc->wHeight, frame_desc->dwMinFrameInterval / 10000, frame_desc->dwMaxFrameInterval / 10000); } }
2. 为相机设置指定的像素格式与分辨率
设置指定参数需先匹配对应的格式和帧描述符,再调用API完成配置并启动流:
- 遍历格式描述符,找到目标像素格式对应的
uvc_format_desc_t - 在该格式下遍历帧描述符,找到目标分辨率对应的
uvc_frame_desc_t - 调用
uvc_set_format设置格式,再通过uvc_start_streaming启动视频流
关键代码示例:
// 目标参数:像素格式YUYV,分辨率640x480 uvc_format_desc_t *target_format = NULL; uvc_frame_desc_t *target_frame = NULL; // 查找目标格式与分辨率 for (format_desc = devh->dev->first_format; format_desc != NULL; format_desc = format_desc->next) { if (uvc_format_match(format_desc, UVC_FRAME_FORMAT_YUYV)) { // 匹配YUYV格式 target_format = format_desc; for (frame_desc = format_desc->frame_descs; frame_desc != NULL; frame_desc = frame_desc->next) { if (frame_desc->wWidth == 640 && frame_desc->wHeight == 480) { target_frame = frame_desc; break; } } if (target_frame != NULL) break; } } if (target_format && target_frame) { // 设置格式 uvc_error_t ret = uvc_set_format(devh, target_format, target_frame, UVC_FMT_FLAG_NONE); if (ret == UVC_SUCCESS) { // 启动流(示例用回调方式,也可使用阻塞方式) ret = uvc_start_streaming(devh, 0, uvc_frame_callback, NULL, 0); if (ret == UVC_SUCCESS) { printf("已成功设置640x480 YUYV格式并启动流\n"); } } }
内容的提问来源于stack exchange,提问作者Wunian
相关产品推荐
相关产品推荐

