流星悟语 发表于 2015-10-1 23:18:42

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

本教程演示了如何开始相机预览和拍照。 本教程还演示了如何配置一个摄像机通过设置选择的属性。

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

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

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

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

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

初始化摄像头
1.之前您可以启动一个相机预览或拍照:1.使用相机的功能和数据类型的API(在 mobile 和 wearable 应用程序),包括 < camera.h > 头文件在您的应用程序:
#include <camera.h>
2.创建一个处理的相机,和配置的相机。
3.注册回调函数来处理相机预览和相机自动对焦。
创建和配置一个相机
[*]创建一个全局数据结构来存储有关相机处理。 在本教程中, camdata 用于存储结构 g_camera 变量,这是相机处理。<font size="3">typedef struct _camdata
{
   Evas_Object *win;
   Evas_Object *rect;
   Evas *evas;
   camera_h g_camera; // Camera handle
}
camdata;

static camdata cam_data;</font>

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

// Create camera handle
error_code = camera_create(CAMERA_DEVICE_CAMERA0, &cam_data.g_camera);
if (error_code == CAMERA_ERROR_NONE)
{
   dlog_print(DLOG_INFO, LOG_TAG , "error code = %d", error_code);
}
else
{
   dlog_print(DLOG_ERROR, LOG_TAG , "error code = %d", error_code);
}</font>
CAMERA_DEVICE_CAMERA0 意味着当前激活相机传感器是0,2可选择的设备。 这些值中定义 camera_device_e 枚举(在 移动 和 可穿戴 应用程序)。

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

// Check camera state after create
error_code = camera_get_state(cam_data.g_camera, &state);</font>
返回的状态中定义的值之一 camera_state_e 枚举(在 移动 和 可穿戴 应用程序)。 如果政府不是 CAMERA_STATE_CREATED ,重新启动相机。

5.设置图像质量使用 camera_attr_set_image_quality () 功能:
<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 枚举器:
<font size="3">int error_code = CAMERA_ERROR_NONE;
Evas_Object *g_eo = NULL;

static void create_base_gui (camdata *cam_data, camera_display_type_e display_type)
{
   // Window
   elm_config_accel_preference_set("opengl");
   // PACKAGE contains the package name's character info
   cam_data->win = elm_win_add(NULL, PACKAGE, ELM_WIN_BASIC);
   if (display_type == CAMERA_DISPLAY_TYPE_EVAS)
   {
      elm_win_title_set(cam_data->win, PACKAGE);
      elm_win_borderless_set(cam_data->win, EINA_TRUE);
   }

   evas_object_resize(cam_data->win, 240, 320);
   if (display_type == CAMERA_DISPLAY_TYPE_OVERLAY)
   {
      evas_object_move(cam_data->win, 0, 0);
      elm_win_autodel_set(cam_data->win, EINA_TRUE);
   }

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

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

   switch (display_type)
   {
      case CAMERA_DISPLAY_TYPE_EVAS:
         // Set Evas image object for drawing
         g_eo = evas_object_image_add(cam_data->evas);
         evas_object_image_size_set(g_eo, 240, 320);
         evas_object_image_fill_set(g_eo, 0, 0, 240, 320);
         evas_object_resize(g_eo, 240, 320);
         evas_object_show(g_eo);
         evas_object_show(cam_data.win);
         break;

      case CAMERA_DISPLAY_TYPE_OVERLAY:
         cam_data->rect = evas_object_rectangle_add(cam_data->evas);
         evas_object_resize(cam_data->rect, 240, 320);
         evas_object_move(cam_data->rect, 0, 0);
         evas_object_color_set(cam_data->rect, 0, 0, 0, 0);
         evas_object_render_op_set(cam_data->rect, EVAS_RENDER_COPY);
         evas_object_size_hint_weight_set(cam_data->rect, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
         // Show the window after the base GUI is set up
         evas_object_show(cam_data->win);
         break;

      case default:
         break;
   }
}

error_code = camera_set_display(cam_data.g_camera, CAMERA_DISPLAY_TYPE_OVERLAY, GET_DISPLAY(cam_data.win));
if (error_code != CAMERA_ERROR_NONE)
{
   dlog_print(DLOG_DEBUG, "camera_set_display failed ", ret);
   camera_destroy(cam_data.g_camera);
   cam_data.g_camera = 0;

   return;
}</font>

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

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

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

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

static bool _preview_resolution_cb(int width, int height, void *user_data)
{
   int *resolution = (int*)user_data;
   resolution = width;
   resolution = height;

   return false;
}

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

// Set the supported resolution for camera preview
error_code = camera_set_preview_resolution(cam_data.g_camera, resolution, resolution);</font>
8.设置捕获格式使用 camera_set_capture_format () 功能:
<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 () 函数。 回调函数被调用一次在预览每帧。
<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 。
<font size="3">static void _camera_preview_cb(camera_preview_data_s *frame, void *user_data)
{
   int error_code = 0;

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

      if (error_code == CAMERA_ERROR_NOT_SUPPORTED)
      {
         error_code = camera_start_focusing(cam_data.g_camera, false);
      }

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

2.对自动对焦状态改变接收通知,注册一个回调函数使用 camera_set_focus_changed_cb () 功能:
<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 标志被设置为 假 为了防止重启的捕获过程。
<font size="3">static void _camera_focus_cb(camera_focus_state_e state, void *user_data)
{
   int error_code;

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

      g_enable_shot = false;
   }
}</font>
拍照
拍照:

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

启动相机预览,使用 camera_start_preview () 功能:
<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格式。
<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)
{
   dlog_print(DLOG_DEBUG, LOG_TAG , "Writing image to file");
   FILE *file = fopen(g_fname, "w+");

   if (image->data != NULL)
   {
      fwrite(image->data, 1, image->size, file);
   }
   fclose(file);
}</font>
c.下面的示例代码实现 _camera_completed_cb () 函数。 回调函数是用来提供一个获取完成后通知。 在本例中,应用程序等待0.025秒之前重新启动和自动聚焦相机预览。
<font size="3">static void _camera_completed_cb(void *user_data)
{
   int error_code = 0;

   usleep(25000);// Wait 0.025 seconds to show captured image

   // Start camera preview
   error_code = camera_start_preview(cam_data.g_camera);

   g_enable_focus = true;
}</font>

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

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

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

error_code = camera_attr_set_image_quality(cam_data.g_camera, 100);</font>
设置相机变焦属性

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

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

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

error_code = camera_attr_set_zoom(cam_data.g_camera, min);</font>
属性设置相机的亮度

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

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

error_code = camera_attr_get_brightness_range(cam_data.g_camera, &min, &max);</font>
当前的亮度水平,使用 camera_attr_get_brightness () 功能:
<font size="3">static int g_bright_level;

error_code = camera_attr_get_brightness(cam_data.g_camera, &g_bright_level);</font>
设置一个新的亮度水平,使用 camera_attr_set_brightness () 功能:

<font size="3">if (g_bright_level >= LEVEL_UPPER_BOUND)
{
   dlog_print(DLOG_DEBUG, LOG_TAG , "Brightness is set to maximum level");
   g_bright_level = LEVEL_UPPER_BOUND - 1;
}
else if (g_bright_level <= LEVEL_LOWER_BOUND)
{
   dlog_print(DLOG_DEBUG, LOG_TAG , "Brightness is set to maximum level");
   g_bright_level = LEVEL_LOWER_BOUND + 1;
}
else
{
   g_bright_level++;
}

// Set camera brightness
error_code = camera_attr_set_brightness(cam_data.g_camera, g_bright_level);</font>
释放资源
使用完相机后,停止相机和清理应用程序环境:

1.如果自动对焦是开启,切换使用 camera_cancel_focusing () 功能:
<font size="3">error_code = camera_cancel_focusing(cam_data.g_camera);</font>
2.停止相机预览版使用 camera_stop_preview () 功能:
<font size="3">error_code = camera_stop_preview(cam_data.g_camera);</font>
3.注销相机预览和相机的焦点改变回调函数使用 camera_unset_preview_cb () 和 camera_unset_focus_changed_cb () 功能,分别为:
<font size="3">// Unregister camera preview callback
error_code = camera_unset_preview_cb(cam_data.g_camera);

// Unregister camera focus change callback
error_code = camera_unset_focus_changed_cb(cam_data.g_camera);</font>
4.破坏相机处理和释放所有资源使用 camera_destroy () 功能:
<font size="3">error_code = camera_destroy(cam_data.g_camera);</font>

页: [1]
查看完整版本: Tizen设备相机:控制摄像头设备代码