经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread
来源:cnblogs  作者:paw5zx  时间:2024/4/15 9:48:25  对本文有异议

简介

本文针对官方例程中的: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个图像数据
  • 停止采集
  • 释放资源
  1. /* SPDX-License-Identifier:Unlicense */
  2. /* Aravis header */
  3. #include <arv.h>
  4. /* Standard headers */
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. /*
  8. * Connect to the first available camera, then acquire 10 buffers.
  9. */
  10. int main (int argc, char **argv)
  11. {
  12. ArvCamera *camera;
  13. GError *error = NULL;
  14. //连接相机
  15. camera = arv_camera_new ("192.168.6.63", &error);
  16. if (ARV_IS_CAMERA (camera)) {
  17. ArvStream *stream = NULL;
  18. printf ("Found camera '%s'\n", arv_camera_get_model_name (camera, NULL));
  19. //设置相机采集模式为连续采集
  20. arv_camera_set_acquisition_mode (camera, ARV_ACQUISITION_MODE_CONTINUOUS, &error);
  21. if (error == NULL)
  22. //创建流对象
  23. stream = arv_camera_create_stream (camera, NULL, NULL, &error);
  24. if (ARV_IS_STREAM (stream)) {
  25. int i;
  26. size_t payload;
  27. //从相机对象中获取图像负载大小(每个图像的字节大小)
  28. payload = arv_camera_get_payload (camera, &error);
  29. if (error == NULL) {
  30. for (i = 0; i < 2; i++)
  31. //在流对象buffer池中插入两个buffer
  32. arv_stream_push_buffer (stream, arv_buffer_new (payload, NULL));
  33. }
  34. if (error == NULL)
  35. //开始采集
  36. arv_camera_start_acquisition (camera, &error);
  37. if (error == NULL) {
  38. for (i = 0; i < 10; i++) {
  39. ArvBuffer *buffer;
  40. //从流对象中获取buffer,此时buffer中已经包含了图像数据
  41. buffer = arv_stream_pop_buffer (stream);
  42. if (ARV_IS_BUFFER (buffer)) {
  43. printf ("Acquired %d×%d buffer\n",
  44. arv_buffer_get_image_width (buffer),
  45. arv_buffer_get_image_height (buffer));
  46. //将buffer放回流对象的buffer池中,而不是销毁
  47. arv_stream_push_buffer (stream, buffer);
  48. }
  49. }
  50. }
  51. if (error == NULL)
  52. //停止采集
  53. arv_camera_stop_acquisition (camera, &error);
  54. g_clear_object (&stream);
  55. }
  56. g_clear_object (&camera);
  57. }
  58. if (error != NULL) {
  59. printf ("Error: %s\n", error->message);
  60. return EXIT_FAILURE;
  61. }
  62. return EXIT_SUCCESS;
  63. }

此例程较为简单,每一步的细节查看注释即可,此处不过多讲解。

运行结果:

函数说明

arv_camera_set_acquisition_mode

简介:设置相机的采集模式

  1. void arv_camera_set_acquisition_mode(
  2. ArvCamera* camera,
  3. ArvAcquisitionMode value,
  4. GError** error
  5. )

其中value是个枚举值,可选的值有:ARV_ACQUISITION_MODE_CONTINUOUSARV_ACQUISITION_MODE_SINGLE_FRAMEARV_ACQUISITION_MODE_MULTI_FRAME分别代表连续采集,单帧采集和多帧采集。

arv_camera_create_stream

简介:创建流对象
注意:最终必须调用g_object_unref()释放内存

  1. ArvStream* arv_camera_create_stream(
  2. ArvCamera* camera,
  3. ArvStreamCallback callback,
  4. void* user_data,
  5. GError** error
  6. )

其中callback是个回调函数,用于数据帧的处理;user_data是向回调函数中传递的用户数据。本例中这两个参数均为NULL,表示不使用回调函数。

Available since: 0.2.0

arv_camera_get_payload

简介:从相机检索一个图像所需的存储空间大小。此值一般用于创建流缓冲区。

  1. guint arv_camera_get_payload(ArvCamera* camera, GError** error)

Available since: 0.8.0

arv_buffer_new

简介:此函数用于创建一个新的缓冲区,专门用来存储视频流图像的数据。函数提供了灵活的内存管理选项,让调用者可以选择预先分配内存(后续可由调用者重新分配)或由函数来分配内存。

  1. ArvBuffer* arv_buffer_new(size_t size, void* preallocated)

其中preallocated指向预分配的内存缓冲区。若此参数不为NULL,则指向的内存将用作缓冲区存储数据;为NULL则由函数分配内存。

Available since: 0.2.0

arv_stream_push_buffer

简介:将一个buffer添加到一个特定的流中。当缓冲区被推送到流中时,流对象接管了该缓冲区对象的所有权。

  1. void arv_stream_push_buffer(ArvStream* stream, ArvBuffer* buffer)

Available since: 0.2.0

arv_camera_start_acquisition

简介:开始采集

  1. void arv_camera_start_acquisition(ArvCamera* camera, GError** error)

Available since: 0.8.0

arv_stream_pop_buffer

简介:从流的输出队列中弹出一个buffer并返回。这个buffer可能包含无效的图像数据,调用者应在使用图像数据前检查其有效性。
若输出队列为空,则阻塞至数据来临。

  1. ArvBuffer* arv_stream_pop_buffer(ArvStream* stream)

Available since: 0.2.0

arv_camera_stop_acquisition

简介:停止采集

  1. void arv_camera_stop_acquisition(ArvCamera* camera, GError** error)

Available since: 0.8.0

原文链接:https://www.cnblogs.com/paw5zx/p/18135154

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号