您的位置 首页 IOT

Symbian 摄像头编程预研

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

摄像头编程预研

现在运用摄像头编程,网上用的最多的都是直接调用手机自带的照相/摄像程序来完结,不过运用这种办法,可控性就显得弱一些,为此近期对直接运用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 setting flag */

EContrastSupported = 0x0020,

/** Brightness setting flag */

EBrightnessSupported = 0x0040,

/** View finder clipping flag */

EViewFinderClippingSupported = 0x0080,

/** Still image capture clipping flag */

EImageClippingSupported = 0x0100,

/** Video capture clipping flag */

EVideoClippingSupported = 0x0200

};

我的英文比较差,就不逐个翻译了,究竟有些EviewFinderMirrorSupported、EviewFinderClippingSupported、EimageClippingSupported、EvideoClippingSupported我也不知道是啥详细用的。咱们只需求关怀这个手机的摄像头支撑何种形式的取景器,支不支撑摄影(EImageCaptureSupported)、支不支撑录像(EVideoCaptureSupported)、支不支撑对比度设置(EcontrastSupported)和亮度设置(EBrightnessSupported)就能够了。

由于N81主摄像头的iOptionsSupporte值是14(即1110)所以该主摄像头只支撑位图形式的取景器设置,一同支撑图画和视频的摄影,不支撑对比度亮度等设置。

iFlashModesSupported

闪光灯支撑形式,详细的形式能够拜见如下枚举值

enum TFlash

{

/** No flash, always supported. */

EFlashNone = 0x0000,

/** Flash will automatically fire when required. */

EFlashAuto = 0x0001,

/** Flash will always fire. */

EFlashForced = 0x0002,

/** Reduced flash for general lighting */

EFlashFillIn = 0x0004,

/** Red-eye reduction mode. */

EFlashRedEyeReduce = 0x0008,

/** Flash at the moment when shutter opens.快门开时闪 */

EFlashSlowFrontSync = 0x0010,

/** Flash at the moment when shutter closes. 快门关事闪*/

EFlashSlowRearSync = 0x0020,

/** User configurable setting */

EFlashManual = 0x0040

};

这儿就不做赘述了,N81的值11(即1011),支撑主动、总是翻开和红眼消除,当然总是封闭肯定是支撑的。

知道了支撑何种类型,咱们就能够对摄像头的闪光灯类型经过CCamera::Flash和CCamera::SetFlashL两个函数获取和设置。

iExposureModesSupported

曝光支撑形式,详细的形式详见如下枚举值

/** Specifies the type of exposure. – EExposureAuto is the default value. */

enum TExposure

{

/** Set exposure automatically. Default, always supported. */

EExposureAuto = 0x0000,

/** Night-time setting for long exposures. */

EExposureNight = 0x0001,

/** Backlight setting for bright backgrounds. */

EExposureBacklight = 0x0002,

/** Centered mode for ignoring surroundings. */

EExposureCenter = 0x0004,

/** Sport setting for very short exposures. */

EExposureSport = 0x0008,

/** Generalised setting for very long exposures. */

EExposureVeryLong = 0x0010,

/** Snow setting for daylight exposure. */

EExposureSnow = 0x0020,

/** Beach setting for daylight exposure with reflective glare. */

EExposureBeach = 0x0040,

/** Programmed exposure setting. */

EExposureProgram = 0x0080,

/** Aperture setting is given priority. */

EExposureAperturePriority = 0x0100,

/** Shutter speed setting is given priority. */

EExposureShutterPriority = 0x0200,

/** User selectable exposure value setting. */

EExposureManual = 0x0400,

/** Exposure night setting with colour removed to get rid of colour noise. */

EExposureSuperNight = 0x0800,

/** Exposure for infra-red sensor on the camera */

EExposureInfra = 0x1000

};

获取N81的相机曝光支撑形式为7(即0111),所以只支撑主动、夜晚、背光和中心四种形式。

咱们能够经过CCamera::Exposure()和CCamera::SetExposureL两个函数对摄像头的曝光形式进行获取和设置。

iWhiteBalanceModesSupported

白平衡支撑形式,白平衡详细的形式如下

/** Specifies how the white balance is set. */

enum TWhiteBalance

{

/** Set white balance automatically. Default, always supported. */

EWBAuto = 0x0000,

/** Normal daylight. */

EWBDaylight = 0x0001,

/** Overcast daylight. */

EWBCloudy = 0x0002,

/** Tungsten filament lighting. */

EWBTungsten = 0x0004,

/** Fluorescent tube lighting */

EWBFluorescent = 0x0008,

/** Flash lighting. */

EWBFlash = 0x0010,

/** High contrast daylight primarily snowy */

EWBSnow = 0x0020,

/** High contrast daylight primarily near the sea */

EWBBeach = 0x0040,

/** User configurable mode */

EWBManual = 0x0080

};

详细不做打开,能够经过调用CCamera::WhiteBalance和CCamera::SetWhiteBalanceL两个办法来进行对白平衡参数的获取和设置。

焦距(扩大倍数)

在CameraInfo里边触及焦距的参数真不少,iMinZoom、iMaxZoom、iMaxDigitalZoom、iMinZoomFactor、iMaxZoomFactor、iMaxDigitalZoomFactor

这几个参数值其实很困惑我的,特别是iMaxDigitalZoom,不知道是干嘛用的,这个值只能先不管了。依据CCamer供给了四个关于Zoom的如下四个函数

/**

Sets the digital zoom factor.

This must be in the range of 0 to TCameraInfo::iMaxDigitalZoom inclusive.

May leave with KErrNotSupported if the zoom factor is out of range.

@param aDigitalZoomFactor

The required digital zoom factor.

*/

virtual void SetDigitalZoomFactorL(TInt aDigitalZoomFactor = 0)=0;

/**

Gets the currently set digital zoom factor.

@return The currently set digital zoom factor.

*/

virtual TInt DigitalZoomFactor() const=0;

/**

Sets the zoom factor.

This must be in the range of TCameraInfo::iMinZoom to TCameraInfo::iMaxZoom

inclusive. May leave with KErrNotSupported if the specified zoom factor is

out of range.

@param aZoomFactor

Required zoom factor.

*/

virtual void SetZoomFactorL(TInt aZoomFactor = 0)=0;

/**

Gets the currently set zoom factor.

@return The currently set zoom factor.

*/

virtual TInt ZoomFactor() const=0;

能够猜想别离标明数码变焦和光学变焦。

别的,经过对N81和E71的参数比较,N81的iMaxDigitalZoomFactor是20.0,而E71是4.0,正好对应N81的20倍数码变焦,E71的4倍数码变焦。由于许多手机摄像头镜头都不支撑光学变焦,所以在这儿对咱们有用的也便是只需求经过DigitalZoomFactor和 SetDigitalZoomFactorL两个函数在iMaxDigitalZoomFactor范围内设置数码变焦值就能够了。

图画格局和图画尺度参数

iImageFormatsSupported和iNumImageSizesSupported两个参数别离用以标明摄像头摄影时所支撑的图画格局和图画尺度数量,详细支撑的图画格局如下枚举值界说

enum TFormat

{

/** 8 bit greyscale values, 0=black, 255=white. */

EFormatMonochrome = 0x0001,

/** Packed RGB triplets, 4 bits per pixel with red in the least significant bits

and the 4 most significant bits unused. */

EFormat16bitRGB444 = 0x0002,

/** Packed RGB triplets, 5 bits per pixel for red and blue and 6 bits for green,

with red in the least significant bits. */

EFormat16BitRGB565 = 0x0004,

/** Packed RGB triplets, 8 bits per pixel with red in the least significant bits

and the 8 most significant bits unused. */

EFormat32BitRGB888 = 0x0008,

/** JFIF JPEG. */

EFormatJpeg = 0x0010,

/** EXIF JPEG */

EFormatExif = 0x0020,

/** CFbsBitmap object with display mode EColor4K. */

EFormatFbsBitmapColor4K = 0x0040,

/** CFbsBitmap object with display mode EColor64K. */

EFormatFbsBitmapColor64K = 0x0080,

/** CFbsBitmap object with display mode EColor16M. */

EFormatFbsBitmapColor16M = 0x0100,

/** Implementation dependent. */

EFormatUserDefined = 0x0200,

/** 4:2:0 format, 8 bits per sample, Y00Y01Y10Y11UV. */

EFormatYUV420Interleaved = 0x0400,

/** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03…U0…V0… */

EFormatYUV420Planar = 0x0800,

/** 4:2:2 format, 8 bits per sample, UY0VY1. */

EFormatYUV422 = 0x1000,

/** 4:2:2 format, 8 bits per sample, Y1VY0U. */

EFormatYUV422Reversed = 0x2000,

/** 4:4:4 format, 8 bits per sample, Y00U00V00 Y01U01V01… */

EFormatYUV444 = 0x4000,

/** 4:2:0 format, 8 bits per sample, Y00Y01Y02Y03…U0V0… */

EFormatYUV420SemiPlanar = 0x8000,

/** CFbsBitmap object with display mode EColor16MU. */

EFormatFbsBitmapColor16MU = 0x00010000

};

由于N81主摄像头的iImageFormatsSupported值为480(也即0x01E0),所以支撑的格局为EFormatExif、EFormatFbsBitmapColor4K、 EFormatFbsBitmapColor64K和 EFormatFbsBitmapColor16M四种。

每一种格局又有对应的各种不同的尺度,而详细支撑的尺度数则有iNumImageSizesSupported来限制,如上N81的iNumImageSizesSupported值为3,对每种格局运用CCamera::EnumerateCaptureSizes获获得尺度均为320*240,640*480,1152*864,这让我百思不得其解,究竟N81是200万像素的摄像头,怎样会最大尺度是菜1152*864呢?体系自带的照相/摄像程序也是支撑1600*1200的,并且要害QQ手中邮也是支撑1600*1200格局的,后来经过在论坛上查找,才知道本来CCamera::EnumerateCaptureSizes获取的尺度跟UI程序时横屏(landscape)仍是竖屏(portrait)有关的,像N81在横屏形式下iNumImageSizesSupported的值为4,其尺度为320*240,640*480,1152*864和1600*1200,而默许竖屏下便是之前的那些数值。

别的用E71手机做过试验,发现关于E71,横屏仍是竖屏,其实是相同的,没有任何改变,其iNumImageSizesSupported始终是5,而用CCamera::EnumerateCaptureSizes获获得尺度也均为320*240,640*480,1152*864,1600*1200和2048*1536,所以咱们在获取最大尺度时能够毫无顾忌的运用横屏形式。

有了这个尺度,咱们就能够依据需求,调用CCamera::PrepareImageCaptureL(TFormat aImageFormat,TInt aSizeIndex)函数来设定咱们摄影时需求的详细尺度了。

在这儿弄巧成拙下,关于运用横屏和竖屏形式切换,能够在C*AppUi内经过调用CAknAppUiBase::SetOrientationL(TAppUiOrientation aOrientation)来简略完成,详细的参数值横屏时传EappUiOrientationLandscape,竖屏时传EappUiOrientationPortrait。不过相似咱们程序的自界说界面,调用完这个函数后,会发生音讯到C*AppUi::HandleResourceChangeL,只需咱们在这个函数内部处理好界面排版就能够了。关于该项测验,周二现已和大红一同演示过了。

视频格局和视频尺度参数

手机摄像头天然也供给了视频的录制功用,视频是由一帧一帧的图画构成,在CameraInfo信息里头与视频相关的参数便是iNumVideoFrameSizesSupported(单帧的尺度)、iNumVideoFrameRatesSupported(帧速)和iVideoFrameFormatsSupported(支撑的帧格局)。

由于N81的iVideoFrameFormatsSupported是2048(也即0x800),所以视频格局只支撑EFormatYUV420Planar一种格局,而iNumVideoFrameSizesSupported为3,即支撑3种形式,经过CCamera::EnumerateVideoFrameSizes(TSize aSize,TInt aSizeIndex,TFormat aFormat)函数能够得到N81摄像时支撑的三种视频尺度为320*240,176*144,128*96,别的能够经过调用CCamera::EnumerateVideoFrameRates(TReal32 aRate, TInt aRateIndex, TFormat aFormat,TInt aSizeIndex,TExposure aExposure = EExposureAuto)函数得到N81支撑的帧速为15帧每秒。

有了这些参数能够便利的经过调用CCamera::PrepareVideoCaptureL函数设置摄像时所要用到的视频尺度和帧速;调用CCamera::StartVideoCapture函数敞开摄像,敞开摄像后摄像头会调用MCameraObserver::FrameBufferReady传递回来详细的每一帧数据,供界面显现和编写成视频文件;调用CCamera::StopVideoCapture函数来中止摄像,在任何时候能够经过CCamera::VideoCaptureActive来查询摄像头是否处于摄像进程中。

其它至于现在所运用的帧尺度和帧速在其它当地是不行设置的,只能经过CCamera::GetFrameSize和CCamera::FrameRate两个函数来进行获取当时的参数值。

帧缓存参数

这个不知道怎样翻译,我就笼总称其为帧缓存参数好了,在摄像进程需求运用到帧缓存有iMaxFramesPerBufferSupported和iMaxBuffersSupported,前者标明每个buffer答应寄存的最大帧数,后者为答应运用的buffer最大个数。由于N81的iMaxBuffersSupported为2,所以最多答应运用2个帧缓存区,又iMaxFramesPerBufferSupported是1,也即每个帧缓存最多只能放一帧数据。尽管现在并不彻底知道其实践效果怎么,可是这两个参数也是只要经过CCamera::PrepareVideoCaptureL这个函数来进行设置,经过函数CCamera::BuffersInUse()和CCamera::FramesPerBuffer()来获取当时的设置值。

由于视频摄像需求触及到音视频修改方面的内容,个人在视频录制方面仍是空白,为此现在没有真实测验,也就没有深化进去。

以下在贴几张预研中对E71 320万像素4倍数码变焦的CameraInfo信息截图和N81 200万像素20倍数码变焦横屏时的CameraInfo信息截图,以供我们参看。

E71 CameraInfo信息截图

N81 横屏CameraInfo信息截图

由于E71不区别反正屏,所以CameraInfo是相同的,有心的能够对比下之前的竖屏N81截图和横屏的不同。

此次小结先到这儿,过错之处还望纠正。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/297351.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部