开源相机管理库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
开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread的更多相关文章
- Git---初入开源代码管理库的学习过程003
Git常用命令总结 上接<Git 初入开源代码管理库的学习过程>学了一周Git,基本有了个认识.每一位比我厉害的,都是大牛,网上找了几篇博客和教材(感谢你们),边学习边实践用了四天,写笔记 ...
- 网页3D效果库Three.js学习[二]-了解照相机
camera 上篇大致了解了three.js ,并可以创建一个简单的可动的立方体.下来我们着重了解下camera (照相机),照相机其实就是视角,就像你的眼睛.Three.js有两种不同的相机模式:直 ...
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...
- Android Fresco (Facebook开源的图片加载管理库)
Fresco是Facebook开源的一个图片加载和管理库. 这里是Fresco的GitHub网址. 同类型的开源库市面有非常多,比如Picasso, Universal Image Loader, G ...
- C++的开源跨平台日志库glog学习研究(三)--杂项
在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...
- 值得学习的C语言开源项目和库
收集一些C/C++相关的源码,如有更高效的库,请提醒我 补充上去 C/C++相关交流Q群 1414577 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具. ...
- 一起学习PHP中GD库的使用(二)
在日常的开发过程中,GD 库最常用的功能就是帮我们对图片进行一些处理,当然,除了处理已有的图片之外,它也可以直接来画图,就像我们最常见的图片验证码.今天的内容主要就是和画图有关,所以最后我们也会做一个 ...
- 59.Android开源项目及库 (转)
转载 : https://github.com/Tim9Liu9/TimLiu-Android?hmsr=toutiao.io&utm_medium=toutiao.io&utm_so ...
- iOS、mac开源项目及库汇总
原文地址:http://blog.csdn.net/qq_26359763/article/details/51076499 iOS每日一记------------之 中级完美大整理 iOS.m ...
- Android开源项目及库搜集
TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...
随机推荐
- mysql-添加、删除索引
-- 添加联合唯一索引 alter table b_report_file add unique index nc (name, code, org_id); -- 删除索引 ALTER TABLE ...
- Jmeter Jsonpath 语法你了解多少?
- UI自动化测试中图片验证码的处理?
首先定位验证码image的元素,然后通过element.screenshot('a.png')截图保存到本地,通过第三方接口识别本地图片验证码
- C# 课堂管理系统(火影忍者界面!!!)
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...
- Java实现书城项目(增删)
书城项目 登录 dao 接口:UserDao Users login(String username,String password); 实现:UserDaoImpl QueryRunner quer ...
- mysql中where条件查询
#进阶2:条件查询 /* 语法: SELECT 查询列表 FROM 表名 WHERE 筛选条件: 分类: 一.按条件表达式筛选 条件运算符:> < = <> >= < ...
- hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here
hesitation 单词学习 犹豫 hes 就是 her 粘 助记单词 here hes + itation(ite + ate + ion) hesitation 美: [ˌhezɪˈteɪʃ(ə ...
- javascript之call用法实例
call方法: 调用一个对象的一个方法,以另一个对象替换当前对象. 直接上代码: js例子:在A类中调用B类数据 function ClassA(){ this.name = 'ClassA' ...
- 单目测距那些事儿(上) | 从MobileEye谈起
单目测距那些事儿(上) | 从MobileEye谈起 全面专业的自动驾驶学习资料:链接 前言 在ADAS领域,有个功能叫自适应巡航控制(Adaptive Cruise Control, ACC). A ...
- 可视化学习:WebGL实现缩放平移
前言 在上篇文章中,我们使用WebGL实现了网格背景,当时有提到说使用WebGL来实现的好处之一,是网格背景可以与画布上的其他元素更好地融合,比如一起缩放平移,那么在WebGL中怎么实现缩放和平移呢? ...