本教程演示了如何开始相机预览和拍照。 本教程还演示了如何配置一个摄像机通过设置选择的属性。
热身
熟悉摄像头API通过学习基本知识:
初始化摄像头
初始化摄像头使用。
拍照
开始一个相机预览和拍照。
设置相机属性
设置相机预览、缩放和亮度的属性。
释放资源
停止相机,注销回调函数,并摧毁相机处理并释放其所有资源。
初始化摄像头
1.之前您可以启动一个相机预览或拍照:1.使用相机的功能和数据类型的API(在 mobile 和 wearable 应用程序),包括 < camera.h > 头文件在您的应用程序:
2.创建一个处理的相机,和配置的相机。
3.注册回调函数来处理相机预览和相机自动对焦。
创建和配置一个相机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 [0x%x]", 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[2];
- static bool _preview_resolution_cb(int width, int height, void *user_data)
- {
- int *resolution = (int*)user_data;
- resolution[0] = width;
- resolution[1] = 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[0], resolution[1]);</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>
复制代码
标签:摄像头, 相机, tizen, 代码 |