开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread

本文主要是介绍开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开源相机管理库Aravis例程学习(二)——连续采集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

简介

本文针对官方例程中的:02-multiple-acquisition-main-thread做简单的讲解,并简单介绍其中调用的arv_camera_set_acquisition_mode arv_camera_create_streamarv_camera_get_payloadarv_buffer_new arv_stream_push_bufferarv_camera_start_acquisitionarv_stream_pop_bufferarv_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池中插入两个bufferarv_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_CONTINUOUSARV_ACQUISITION_MODE_SINGLE_FRAMEARV_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

这篇关于开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/907887

相关文章

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程