微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Symbian 摄像头编程预研

Symbian 摄像头编程预研

时间:10-08 来源:互联网 点击:

摄像头编程预研

目前使用摄像头编程,网上用的最多的都是直接调用手机自带的照相/摄像程序来完成,不过使用这种方式,可控性就显得弱一些,为此近期对直接使用ECAM API进行了下简单预研。

照相流程

因为本次预研主要还是偏重照相功能。整个照相过程,假设使用文字说明可能会显得相对繁琐,为此结合ECAM API对照相功能进行了顺序流程图描绘,具体如下

该过程主要涉及到的观察器类就是MCameraObserver,该类和CCamera均在ecam.h头文件中被定义,以下是该观察器接口类的声明

class MCameraObserver

{

public:

//CCamera::Reserve异步函数的回调通知

virtual void ReserveComplete(TInt aError)=0;

//CCamera::PowerOn异步函数的回调通知

virtual void PowerOnComplete(TInt aError)=0;

//假如取景器模式为位图模式时预览位图的回调通知

virtual void ViewFinderFrameReady(CFbsBitmap aFrame)=0;

//CCamera::CaptureImage异步函数的回调通知

virtual void ImageReady(CFbsBitmap* aBitmap,HBufC8* aData,TInt aError)=0;

//CCamera::StartVideoCapture异步函数的回调通知

virtual void FrameBufferReady(MFrameBuffer* aFrameBuffer,TInt aError)=0;

};

在这里需要说明下的,恐怕就是取景器了,因为假设不是数码达人或者第一次接触摄像头类编程,这个概念还是比较新的。其实所谓取景器,可以理解为预览拟拍摄景物的视窗,CCamera支持两种显示取景器的方法:一种是直接屏幕访问模式,即应用程序只要指明在屏幕上的哪个区域显示图像,摄像头对象就会把当前取到的图像直接绘制到这个区域上(可以说过程不用程序干预的);另外一种是位图模式,即摄像头对象提供一系列的位图,由应用程序把位图绘制到窗口上。

一般在设置之前需要先获取一下摄像头参数,看看其是否支持所要设置的模式。EViewFinderDirectSuported就是支持直接屏幕访问模式,EViewFinderBitmapsSupported就是位图模式。通常情况下,假如两种模式都支持的情况下,选用直接屏幕访问模式,因为这种模式比较快而且不用程序代码干预,否则就用位图模式,位图模式时,当捕捉到图像后会调用观察器的ViewFinderFrameReady()函数将图像传给观察器进行绘制。

关于CameraInfo

摄像头本身有属性信息,我们可以通过调用CCamera:: CameraInfo(TCameraInfo aInfo)函数获取。对N81手机主摄像头进行缺省参数的提取,具体参数如下图所示

对各自参数的分析如下

iHardwareVersion

相机硬件的版本号,该值不用细究,是OEM关心的

iSoftwareVersion

相机软件的版本号(驱动程序版本号),该值也是OEM关心

iOrientation

相机的朝向,该值是OEM出厂时根据相机特性设定的,编程无法修改,不过可以给我们编程提供参考条件,其取值有如下几种类型

/** Possible directions in which the camera may point.

*/

enum TCameraOrientation

{

/** Outward pointing camera for taking pictures.

Camera is directed away from the user. */

EOrientationOutwards,

/** Inward pointing camera for conferencing.

Camera is directed towards the user. */

EOrientationInwards,

/** Mobile camera capable of multiple orientations.

Camera orientation may be changed by the user. */

EOrientationMobile,

/** Camera orientation is not known. */

EOrientationUnknown

};

根据取得的值的情况,N81的主摄像头朝向为EOrientationOutwards,当然通过对N81和E71主次摄像头信息数据的采集,可知类似N81、E71等双摄像头手机的主摄像头属性都是EOrientationOutwards的,而前面次摄像头属性都EOrientationInwards。从而猜测像N93i这样的手机其摄像头朝向属性应该为EOrientationMobile(因为是猜测,所有还期待有人帮忙验证一下)。根据这个属性,对于双摄像头手机,我们可以编程选中需要使用的摄像头。

iOptionsSupported

同样也是一些无法修改的属性,表明了此摄像头支持的功能,因为该值是个位域的值,通常使用过程中要用位与操作来判断其是否支持某一种属性,具体如下罗列的枚举值

enum TOptions

{

/** View finder display direct-to-screen flag */

EViewFinderDirectSupported = 0x0001,

/** View finder bitmap generation flag */

EViewFinderBitmapsSupported = 0x0002,

/** Still image capture flag */

EImageCaptureSupported = 0x0004,

/** Video capture flag */

EVideoCaptureSupported = 0x0008,

/** View finder display mirroring flag */

EViewFinderMirrorSupported = 0x0010,

/** Contrast sett

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top