首页 > 其他分享 >开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread

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

时间:2024-04-15 09:33:24浏览次数:30  
标签:multiple thread arv 例程 buffer camera error stream 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池中插入两个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_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

标签:multiple,thread,arv,例程,buffer,camera,error,stream,acquisition
From: https://www.cnblogs.com/paw5zx/p/18135154

相关文章

  • Thread
    螺纹基础知识(五要素)螺纹包括五个要素:牙型、公称直径、线数、螺距(或导程)和旋向。牙型 直径螺纹有大径(d、D)、中径(d2、D2)、小径(d1、D1),在表示螺纹时采用的是公称直径,公称直径是代表螺纹尺寸的直径。普通螺纹的公称直径就是大径。线数沿一条螺旋线形成的螺纹称......
  • 字节面试:ThreadLocal内存泄漏,怎么破?什么是 ITL、TTL、FTL?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • CH582/CH592_EVT中RF_Device(主机)例程详解_底层自动跳频管理_支持一对七通讯
    目标程序路径: 与RF_Device程序相比,RF_Host主要讲解三个地方,其他接口与RF_Device一致,查看这篇博客:CH582/CH592_EVT中RF_Device(从机)例程详解_底层自动跳频管理_支持一对七通讯1、Host配对绑定逻辑:程序中默认逻辑为上电后前三秒钟允许配对绑定新设备,超过三秒钟则从flash中取出......
  • CH582/CH592_EVT中RF_Device(从机)例程详解
    依旧以CH582例程做讲解,CH592与CH582接口部分一致,其他地方大同小异。RF_Device例程路径: 1、main函数初始化配置 2、RF参数初始化 3、上电后启动绑定回连任务  4、RF_DMA初始化  5、RF绑定回调任务  6、数据发送接口 7、定时器测试发送数据到对......
  • 通过实例学C#之Thread类
    构造函数Thread(ThreadStart)该构造函数接受一个不带参数的方法。staticvoidMain(string[]args){Threadt1=newThread(newThreadStart(ThreadMethod1));t1.Start();Console.ReadKey();}staticvoidThreadMethod1(){for(inti=0;i<5......
  • ThreadPoolExecutor线程池解析
    ThreadPoolExecutor线程池解析一、ThreadPoolExecutor常见参数jdk中Executors提供了几种常用的线程池,底层都是ThreadPoolExecutor。publicThreadPoolExecutor(intcorePoolSize,//核心线程数intmaximumPoolSize,//最大线程数......
  • CH573 CH582 CH592外设IAP例程讲解
    一.根据所选芯片型号下载官网最新例程,tips:若使用的是ch571这类codeflash是192k的芯片,需要将iap程序中的宏定义进行修改:源程序是0x0007000(448k),修改为0x0003000(192k)#defineAPP_CODE_END_ADDR0x00030000二.根据所选芯片型号下载对应的程序,三.串口1接usb转......
  • 开源相机管理库Aravis例程学习(一)——单帧采集single-acquisition
    目录简介源码函数说明arv_camera_newarv_camera_acquisitionarv_camera_get_model_namearv_buffer_get_image_widtharv_buffer_get_image_height简介本文针对官方例程中的第一个例程:single-acquisition做简单的讲解,并简单分析其中调用的arv_camera_new,arv_camera_acquisition,ar......
  • 一文详解ThreadLocal与线程间的数据传递
    一.ThreadLocalThreadLocal在并发编程中比较常用,在诸多中间件的源码中都能看到它的身影。对于ThreadLocal的说明先来一段官方解释:ThreadLocal提供的是一种线程局部变量。这些变量不同于其它变量的点在于每个线程在获取变量的时候,都拥有它自己相对独立的变量副本。ThreadLo......
  • JUC:ThreadPoolExecutor线程池的使用方法
    文章目录ThreadPoolExecutor线程池状态构造方法Executors工厂方法newFixedThreadPoolnewCachedThreadPoolnewSingleThreadExecutor提交任务方法关闭任务方法ThreadPoolExecutor线程池状态线程池用高三位表示状态,第一位为符号位。TERMINATED>TIDYING>STOP>......