开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread
简介
本文针对官方例程中的:02-multiple-acquisition-main-thread做简单的讲解,并简单介绍其中调用的arv_camera_set_acquisition_mode
,arv_camera_create_stream
,arv_camera_get_payload
,arv_buffer_new
,arv_stream_push_buffer
,arv_camera_start_acquisition
,arv_stream_pop_buffer
,arv_camera_stop_acquisition
函数。
aravis版本:0.8.31
操作系统:ubuntu-20.04
gcc版本:9.4.0
例程代码
这段代码使用Aravis的API,控制相机连续采集,并在主线程中从缓冲区获取前10帧图像(假设不丢帧),主要操作步骤如下:
- 连接相机
- 设置采集模式为连续采集
- 创建流对象,并向流对象的buffer池中添加buffer
- 开始采集
- 从buffer池中获取10个图像数据
- 停止采集
- 释放资源
/* SPDX-License-Identifier:Unlicense */ /* Aravis header */ #include <arv.h> /* Standard headers */ #include <stdlib.h> #include <stdio.h> /* * Connect to the first available camera, then acquire 10 buffers. */ int main (int argc, char **argv) { ArvCamera *camera; GError *error = NULL; //连接相机 camera = arv_camera_new ("192.168.6.63", &error); if (ARV_IS_CAMERA (camera)) { ArvStream *stream = NULL; printf ("Found camera '%s'\n", arv_camera_get_model_name (camera, NULL)); //设置相机采集模式为连续采集 arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_CONTINUOUS, &error); if (error == NULL) //创建流对象 stream = arv_camera_create_stream (camera, NULL, NULL, &error); if (ARV_IS_STREAM (stream)) { int i; size_t payload; //从相机对象中获取图像负载大小(每个图像的字节大小) payload = arv_camera_get_payload (camera, &error); if (error == NULL) { for (i = 0; i < 2; i++) //在流对象buffer池中插入两个buffer arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL)); } if (error == NULL) //开始采集 arv_camera_start_acquisition (camera, &error); if (error == NULL) { for (i = 0; i < 10; i++) { ArvBuffer *buffer; //从流对象中获取buffer,此时buffer中已经包含了图像数据 buffer = arv_stream_pop_buffer (stream); if (ARV_IS_BUFFER (buffer)) { printf ("Acquired %d×%d buffer\n", arv_buffer_get_image_width (buffer), arv_buffer_get_image_height (buffer)); //将buffer放回流对象的buffer池中,而不是销毁 arv_stream_push_buffer (stream, buffer); } } } if (error == NULL) //停止采集 arv_camera_stop_acquisition (camera, &error); g_clear_object (&stream); } g_clear_object (&camera); } if (error != NULL) { printf ("Error: %s\n", error->message); return EXIT_FAILURE; } return EXIT_SUCCESS; }
此例程较为简单,每一步的细节查看注释即可,此处不过多讲解。
运行结果:
函数说明
arv_camera_set_acquisition_mode
简介:设置相机的采集模式
void arv_camera_set_acquisition_mode( ArvCamera* camera, ArvAcquisitionMode value, GError** error )
其中value是个枚举值,可选的值有:ARV_ACQUISITION_MODE_CONTINUOUS
,ARV_ACQUISITION_MODE_SINGLE_FRAME
,ARV_ACQUISITION_MODE_MULTI_FRAME
分别代表连续采集,单帧采集和多帧采集。
arv_camera_create_stream
简介:创建流对象
注意:最终必须调用g_object_unref()释放内存
ArvStream* arv_camera_create_stream( ArvCamera* camera, ArvStreamCallback callback, void* user_data, GError** error )
其中callback是个回调函数,用于数据帧的处理;user_data是向回调函数中传递的用户数据。本例中这两个参数均为NULL,表示不使用回调函数。
Available since: 0.2.0
arv_camera_get_payload
简介:从相机检索一个图像所需的存储空间大小。此值一般用于创建流缓冲区。
guint arv_camera_get_payload(ArvCamera* camera, GError** error)
Available since: 0.8.0
arv_buffer_new
简介:此函数用于创建一个新的缓冲区,专门用来存储视频流图像的数据。函数提供了灵活的内存管理选项,让调用者可以选择预先分配内存(后续可由调用者重新分配)或由函数来分配内存。
ArvBuffer* arv_buffer_new(size_t size, void* preallocated)
其中preallocated指向预分配的内存缓冲区。若此参数不为NULL,则指向的内存将用作缓冲区存储数据;为NULL则由函数分配内存。
Available since: 0.2.0
arv_stream_push_buffer
简介:将一个buffer添加到一个特定的流中。当缓冲区被推送到流中时,流对象接管了该缓冲区对象的所有权。
void arv_stream_push_buffer(ArvStream* stream, ArvBuffer* buffer)
Available since: 0.2.0
arv_camera_start_acquisition
简介:开始采集
void arv_camera_start_acquisition(ArvCamera* camera, GError** error)
Available since: 0.8.0
arv_stream_pop_buffer
简介:从流的输出队列中弹出一个buffer并返回。这个buffer可能包含无效的图像数据,调用者应在使用图像数据前检查其有效性。
若输出队列为空,则阻塞至数据来临。
ArvBuffer* arv_stream_pop_buffer(ArvStream* stream)
Available since: 0.2.0
arv_camera_stop_acquisition
简介:停止采集
void arv_camera_stop_acquisition(ArvCamera* camera, GError** error)
Available since: 0.8.0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具