找回密码
 立即注册
查看: 3772|回复: 0

Tizen设备相机:控制摄像头设备代码

[复制链接]
发表于 2015-10-1 23:18:42 | 显示全部楼层 |阅读模式
本教程演示了如何开始相机预览和拍照。 本教程还演示了如何配置一个摄像机通过设置选择的属性。

热身
熟悉摄像头API通过学习基本知识:

初始化摄像头
初始化摄像头使用。

拍照
开始一个相机预览和拍照。

设置相机属性
设置相机预览、缩放和亮度的属性。

释放资源
停止相机,注销回调函数,并摧毁相机处理并释放其所有资源。

初始化摄像头
1.之前您可以启动一个相机预览或拍照:1.使用相机的功能和数据类型的API(在 mobile wearable 应用程序),包括 < camera.h > 头文件在您的应用程序:
  1. #include <camera.h>
复制代码

2.创建一个处理的相机,和配置的相机。
3.注册回调函数来处理相机预览和相机自动对焦。
创建和配置一个相机
  • 创建一个全局数据结构来存储有关相机处理。 在本教程中, camdata 用于存储结构 g_camera 变量,这是相机处理。
    1. <font size="3">typedef struct _camdata
    2. {
    3.    Evas_Object *win;
    4.    Evas_Object *rect;
    5.    Evas *evas;
    6.    camera_h g_camera; // Camera handle
    7. }
    8. camdata;

    9. static camdata cam_data;</font>
    复制代码


2.创建两个辅助变量来控制是否拍照( g_enable_shot )和自动聚焦( g_enable_focus )是允许的。 这些变量中使用 _camera_preview_cb () 和 _camera_focus_cb () 功能。
  1. <font size="3">static bool g_enable_shot = false;
  2. static bool g_enable_focus = true;</font>
复制代码
3.创建一个处理的相机使用 camera_create () 功能:
  1. <font size="3">int error_code = 0;

  2. // Create camera handle
  3. error_code = camera_create(CAMERA_DEVICE_CAMERA0, &cam_data.g_camera);
  4. if (error_code == CAMERA_ERROR_NONE)
  5. {
  6.    dlog_print(DLOG_INFO, LOG_TAG , "error code = %d", error_code);
  7. }
  8. else
  9. {
  10.    dlog_print(DLOG_ERROR, LOG_TAG , "error code = %d", error_code);
  11. }</font>
复制代码

CAMERA_DEVICE_CAMERA0 意味着当前激活相机传感器是0,2可选择的设备。 这些值中定义 camera_device_e 枚举(在 移动 和 可穿戴 应用程序)。

4.检查相机使用的当前状态 camera_get_state () 功能:
  1. <font size="3">camera_state_e state;

  2. // Check camera state after create
  3. error_code = camera_get_state(cam_data.g_camera, &state);</font>
复制代码

返回的状态中定义的值之一 camera_state_e 枚举(在 移动 和 可穿戴 应用程序)。 如果政府不是 CAMERA_STATE_CREATED ,重新启动相机。

5.设置图像质量使用 camera_attr_set_image_quality () 功能:
  1. <font size="3">error_code = camera_attr_set_image_quality(cam_data.g_camera, 100);</font>
复制代码

所支持的图像质量值的边界从1到100。

6.设置显示显示预览图像通过使用 camera_set_display () 函数1的相机显示类型( CAMERA_DISPLAY_TYPE_EVAS 或 CAMERA_DISPLAY_TYPE_OVERLAY 中定义) camera_display_type_e 枚举(在 移动 和 可穿戴 应用程序):
注意:
这取决于设备,应用程序必须设置显示偏好使用 elm_config_accel_preference_set () 函数。

例如:设置显示根据 camera_display_type_e 枚举器:
  1. <font size="3">int error_code = CAMERA_ERROR_NONE;
  2. Evas_Object *g_eo = NULL;

  3. static void create_base_gui (camdata *cam_data, camera_display_type_e display_type)
  4. {
  5.    // Window
  6.    elm_config_accel_preference_set("opengl");
  7.    // PACKAGE contains the package name's character info
  8.    cam_data->win = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
  9.    if (display_type == CAMERA_DISPLAY_TYPE_EVAS)
  10.    {
  11.       elm_win_title_set(cam_data->win, PACKAGE);
  12.       elm_win_borderless_set(cam_data->win, EINA_TRUE);
  13.    }

  14.    evas_object_resize(cam_data->win, 240, 320);
  15.    if (display_type == CAMERA_DISPLAY_TYPE_OVERLAY)
  16.    {
  17.       evas_object_move(cam_data->win, 0, 0);
  18.       elm_win_autodel_set(cam_data->win, EINA_TRUE);
  19.    }

  20.    evas_object_move(cam_data->win, 0, 0);
  21.    elm_win_autodel_set(cam_data->win, EINA_TRUE);

  22.    cam_data->evas = evas_object_evas_get(cam_data->win);

  23.    switch (display_type)
  24.    {
  25.       case CAMERA_DISPLAY_TYPE_EVAS:
  26.          // Set Evas image object for drawing
  27.          g_eo = evas_object_image_add(cam_data->evas);
  28.          evas_object_image_size_set(g_eo, 240, 320);
  29.          evas_object_image_fill_set(g_eo, 0, 0, 240, 320);
  30.          evas_object_resize(g_eo, 240, 320);
  31.          evas_object_show(g_eo);
  32.          evas_object_show(cam_data.win);
  33.          break;

  34.       case CAMERA_DISPLAY_TYPE_OVERLAY:
  35.          cam_data->rect = evas_object_rectangle_add(cam_data->evas);
  36.          evas_object_resize(cam_data->rect, 240, 320);
  37.          evas_object_move(cam_data->rect, 0, 0);
  38.          evas_object_color_set(cam_data->rect, 0, 0, 0, 0);
  39.          evas_object_render_op_set(cam_data->rect, EVAS_RENDER_COPY);
  40.          evas_object_size_hint_weight_set(cam_data->rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
  41.          // Show the window after the base GUI is set up
  42.          evas_object_show(cam_data->win);
  43.          break;

  44.       case default:
  45.          break;
  46.    }
  47. }

  48. error_code = camera_set_display(cam_data.g_camera, CAMERA_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(cam_data.win));
  49. if (error_code != CAMERA_ERROR_NONE)
  50. {
  51.    dlog_print(DLOG_DEBUG, "camera_set_display failed [0x%x]", ret);
  52.    camera_destroy(cam_data.g_camera);
  53.    cam_data.g_camera = 0;

  54.    return;
  55. }</font>
复制代码


必须调用此函数之前预览,因此相机状态必须 CAMERA_STATE_CREATED 。

7.设置相机预览分辨率使用 camera_set_preview_resolution () 函数(必须调用此函数之前预览)。

找出哪些可以设置分辨率的相机预览特定设备,使用 camera_foreach_supported_preview_resolution () 函数。 它调用一个回调函数为每个支持预览分辨率。 注意,foreach函数回调函数返回时停止 假 。

下面的示例代码设置相机预览分辨率第一个发现支持分辨率:
  1. <font size="3">int resolution[2];

  2. static bool _preview_resolution_cb(int width, int height, void *user_data)
  3. {
  4.    int *resolution = (int*)user_data;
  5.    resolution[0] = width;
  6.    resolution[1] = height;

  7.    return false;
  8. }

  9. // Find a resolution that is supported in the device
  10. error_code = camera_foreach_supported_preview_resolution(cam_data.g_camera, _preview_resolution_cb, resolution);

  11. // Set the supported resolution for camera preview
  12. error_code = camera_set_preview_resolution(cam_data.g_camera, resolution[0], resolution[1]);</font>
复制代码

8.设置捕获格式使用 camera_set_capture_format () 功能:
  1. <font size="3">error_code = camera_set_capture_format(cam_data.g_camera, CAMERA_PIXEL_FORMAT_JPEG);</font>
复制代码

的 camera_pixel_format_e 枚举(在 移动/mobile 和 可穿戴/wearable 应用程序)定义了可用捕获格式。

设置回调相机预览和相机的焦点

1.对交付接收通知的副本新预览框,注册一个回调函数使用 camera_set_preview_cb () 函数。 回调函数被调用一次在预览每帧。
  1. <font size="3">error_code = camera_set_preview_cb(cam_data.g_camera, _camera_preview_cb, NULL);</font>
复制代码

下面的示例代码实现 _camera_preview_cb () 回调函数。 回调函数开始自动聚焦使用 camera_start_focusing () 函数的参数 camera_h 相机手柄和一个布尔标志定义相机是否必须不断努力的焦点。 的 g_enable_focus 标志被设置为 false 为了防止重启的捕获过程。 如果结果值 camera_start_focusing () 函数的连续模式设置 真正的 是 CAMERA_ERROR_NOT_SUPPORTED ,第二个参数值 false 。
  1. <font size="3">static void _camera_preview_cb(camera_preview_data_s *frame, void *user_data)
  2. {
  3.    int error_code = 0;

  4.    if (g_enable_focus == true)
  5.    {
  6.       error_code = camera_start_focusing(cam_data.g_camera, true);

  7.       if (error_code == CAMERA_ERROR_NOT_SUPPORTED)
  8.       {
  9.          error_code = camera_start_focusing(cam_data.g_camera, false);
  10.       }

  11.       g_enable_focus = false;
  12.    }
  13. }</font>
复制代码

g_enable_focus 标志被设置为 真正的 在应用程序启动。 首次调用回调时的第一帧(预览),相机自动聚焦和标志被设置为开始false 。 没有后续调用回调(其余的帧数)采取任何行动。

2.对自动对焦状态改变接收通知,注册一个回调函数使用 camera_set_focus_changed_cb () 功能:
  1. <font size="3">error_code = camera_set_focus_changed_cb(cam_data.g_camera, _camera_focus_cb, NULL);</font>
复制代码

camera_start_focusing () 函数被调用时,摄像机开始自动聚焦。 在自动对焦开始之前,焦点状态 CAMERA_FOCUS_STATE_RELEASED 。 自动对焦开始时,状态改变 CAMERA_FOCUS_STATE_ONGOING 。 如果这个过程成功完成,状态改变 CAMERA_FOCUS_STATE_FOCUSED 。 如果有错误,更改状态 CAMERA_FOCUS_STATE_FAILED 。

下面的示例代码实现 _camera_focus_cb () 回调函数,它叫做每当自动对焦状态改变。 回调函数启动捕获过程是否在相机 CAMERA_FOCUS_STATE_FOCUSED 国家和 g_enable_shot 国旗是正确的。 的 g_enable_shot 标志被设置为 假 为了防止重启的捕获过程。
  1. <font size="3">static void _camera_focus_cb(camera_focus_state_e state, void *user_data)
  2. {
  3.    int error_code;

  4.    if (state == CAMERA_FOCUS_STATE_FOCUSED && g_enable_shot == true)
  5.    {
  6.       //  Start capture
  7.       error_code = camera_start_capture(cam_data.g_camera, _camera_capturing_cb, _camera_completed_cb, NULL);

  8.       g_enable_shot = false;
  9.    }
  10. }</font>
复制代码

拍照
拍照:


1.初始化摄像头 。
2.启动相机预览。
屏幕上的相机预览了预览帧和允许您捕获静止的图像帧。

启动相机预览,使用 camera_start_preview () 功能:
  1. <font size="3">error_code = camera_start_preview(cam_data.g_camera);</font>
复制代码

3.捕获一个形象:
a.当相机预览版开始,应用程序调用回调函数(参见相机预览 设置回调相机预览和改变焦点 )。 然后调用回调函数 camera_start_focusing () 函数。

b.相机自动聚焦开始时,应用程序调用回调函数(参见相机焦点 设置回调相机预览和改变焦点 )。 然后调用回调函数 camera_start_capture () 函数,它开始捕捉静态图像。

下面的示例代码实现 _camera_capturing_cb () 回调函数。 回调函数被称为一旦为每个捕获帧,用于捕获的图像信息。 图像保存在规定的格式 camera_set_capture_format () 函数(见 创建和配置一个相机 )。 在这个例子中,是JPEG格式。
  1. <font size="3">static void _camera_capturing_cb(camera_image_data_s* image, camera_image_data_s* postview, camera_image_data_s* thumbnail, void *user_data)
  2. {
  3.    dlog_print(DLOG_DEBUG, LOG_TAG , "Writing image to file");
  4.    FILE *file = fopen(g_fname, "w+");

  5.    if (image->data != NULL)
  6.    {
  7.       fwrite(image->data, 1, image->size, file);
  8.    }
  9.    fclose(file);
  10. }</font>
复制代码

c.下面的示例代码实现 _camera_completed_cb () 函数。 回调函数是用来提供一个获取完成后通知。 在本例中,应用程序等待0.025秒之前重新启动和自动聚焦相机预览。
复制代码


设置相机属性
你可以设置以下附加的相机属性:

相机预览属性
相机变焦属性
相机的亮度属性
设置相机预览属性

相机预览是一组属性,您可以设置开始前预览。 下面的示例代码设置FPS和图像质量属性:
  1. <font size="3">error_code = camera_attr_set_preview_fps(cam_data.g_camera, CAMERA_ATTR_FPS_AUTO);

  2. error_code = camera_attr_set_image_quality(cam_data.g_camera, 100);</font>
复制代码

设置相机变焦属性

设置缩放级别,使用 camera_attr_set_zoom () 函数。 获得可用的缩放级别的范围值,使用 camera_attr_get_zoom_range () 函数。

下面的示例代码将缩放级别设置为最低:
  1. <font size="3">int min, max;

  2. error_code = camera_attr_get_zoom_range(cam_data.g_camera, &min, &max);

  3. error_code = camera_attr_set_zoom(cam_data.g_camera, min);</font>
复制代码

属性设置相机的亮度

当前存储在全局亮度水平 g_bright_level 变量。 获得可用的亮度水平的范围值,使用 camera_attr_get_brightness_range () 功能:

  1. <font size="3">int min, max;

  2. error_code = camera_attr_get_brightness_range(cam_data.g_camera, &min, &max);</font>
复制代码

当前的亮度水平,使用 camera_attr_get_brightness () 功能:
  1. <font size="3">static int g_bright_level;

  2. error_code = camera_attr_get_brightness(cam_data.g_camera, &g_bright_level);</font>
复制代码

设置一个新的亮度水平,使用 camera_attr_set_brightness () 功能:

  1. <font size="3">if (g_bright_level >= LEVEL_UPPER_BOUND)
  2. {
  3.    dlog_print(DLOG_DEBUG, LOG_TAG , "Brightness is set to maximum level");
  4.    g_bright_level = LEVEL_UPPER_BOUND - 1;
  5. }
  6. else if (g_bright_level <= LEVEL_LOWER_BOUND)
  7. {
  8.    dlog_print(DLOG_DEBUG, LOG_TAG , "Brightness is set to maximum level");
  9.    g_bright_level = LEVEL_LOWER_BOUND + 1;
  10. }
  11. else
  12. {
  13.    g_bright_level++;
  14. }

  15. // Set camera brightness
  16. error_code = camera_attr_set_brightness(cam_data.g_camera, g_bright_level);</font>
复制代码

释放资源
使用完相机后,停止相机和清理应用程序环境:

1.如果自动对焦是开启,切换使用 camera_cancel_focusing () 功能:
  1. <font size="3">error_code = camera_cancel_focusing(cam_data.g_camera);</font>
复制代码

2.停止相机预览版使用 camera_stop_preview () 功能:
  1. <font size="3">error_code = camera_stop_preview(cam_data.g_camera);</font>
复制代码

3.注销相机预览和相机的焦点改变回调函数使用 camera_unset_preview_cb () 和 camera_unset_focus_changed_cb () 功能,分别为:
  1. <font size="3">// Unregister camera preview callback
  2. error_code = camera_unset_preview_cb(cam_data.g_camera);

  3. // Unregister camera focus change callback
  4. error_code = camera_unset_focus_changed_cb(cam_data.g_camera);</font>
复制代码

4.破坏相机处理和释放所有资源使用 camera_destroy () 功能:
  1. <font size="3">error_code = camera_destroy(cam_data.g_camera);</font>
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
欢迎来到泰泽网:http://www.tizennet.com/ 泰泽论坛:http://bbs.tizennet.com/ 好没有内涵哦,快到设置中更改这个无聊的签名吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|泰泽应用|泰泽论坛|泰泽网|小黑屋|Archiver|手机版|泰泽邮箱|泰泽网 ( 蜀ICP备13024062号-1 )

GMT+8, 2024-11-1 10:36 , Processed in 0.058953 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表