开源相机管理库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/ ...
随机推荐
- redis同步锁的真实应用场景
一.问题由来 现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能 有一个用户能够操作.刚开始做的时候,自己的做法是在red ...
- H3C-IP路由器
定义 路由器负责将数据报文在IP网段之间进行转发 路由器负责将数据报文在IP网段之间进行转发 路由是指导路由器如何进行数据转发的路径信息 作用 路由器负责将数据报文在逻辑网段间进行转发 路由器是指导路 ...
- react 修改页面title - react-document-title
安装 cnpm install --save react-document-title 引用 import DocumentTitle from 'react-document-title' 代码 & ...
- Mysql导出导入操作
安装mysql客户端 # 在终端上下载mysql源 wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm ...
- 记录一次运行vue项目一直不成功的经历
参考:https://blog.csdn.net/qq_17162169/article/details/115718002 如果前端项目一直起不来,直接删除扩展文件夹试试 // npm安装vue y ...
- Java双重循环实现任意字符串中提取数字子串
public class Test2{ public static void main(String[] args) { String s = "211ahn678rh2kkk0731 ...
- AOSP下载且编译
一.简介 AOSP:Android Open Source Project 二.环境要求 我们可以先了解官网(https://source.android.com/docs/setup/start/r ...
- 网络流媒体协议的联系与区别 (RTP RTCP RTSP RTMP HLS)(转)
网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) RTP RTCP RTSP RTMP HLS 区别与联系 RTP传输流媒体数据.RTCP对RTP进行控制,同步.RTSP发起 ...
- Linux修改账户密码
打开终端并登录到要修改密码的账户 输入 passwd 命令,然后 Enter 系统会提示你输入 Current password. 如果是第一次登录或者忘记密码,使用 passwd -d userna ...
- WPF自定义Panel:让拖拽变得更简单
在 WPF 应用程序中,拖放操作是实现用户交互的重要组成部分.通过拖放操作,用户可以轻松地将数据从一个位置移动到另一个位置,或者将控件从一个容器移动到另一个容器.然而,WPF 中默认的拖放操作可能并不 ...