- 簡介
- 例程程式碼
- 函式說明
- 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_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