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


    简介

    本文针对官方例程中的: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 
    /* Standard headers */
    #include 
    #include 
    
    /*
     * 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

  • 相关阅读:
    操作系统:计算机系统概述
    龙芯中科科创板上市:市值357亿 成国产CPU第一股
    《Deep learning for fine-grained image analysis: A survey》阅读笔记
    Pytorch使用torchvision.datasets.ImageFolder读取数据集,数据集的内容排列状况
    零基础学摄影 || 曝光三要素
    IDEA插件开发(21)--List and Tree Controls
    迎战秋招计划
    孙子兵法_00000
    华测监测预警系统 2.2 存在任意文件读取漏洞
    第 125 场 LeetCode 双周赛题解
  • 原文地址:https://www.cnblogs.com/paw5zx/p/18135154