開源相機管理庫Aravis例程學習(二)——連續採集multiple-acquisition-main-thread

paw5zx發表於2024-04-15

目錄
  • 簡介
  • 例程程式碼
  • 函式說明
    • 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池中插入兩個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

相關文章