zoukankan      html  css  js  c++  java
  • 摄像头学习笔记(转)

    摄像头学习笔记

    5已有 38 次阅读  2010-10-26 14:10   标签:  摄像头  笔记  学习 

    一、 摄像头组件 

    1、(自定义类CMyCamera),继承于CBase类和MCameraObserver类实现是该M类里面的虚函数。定义一个CCamera的成员变量

    2、CCcamera类,

    3、MCameraObserver

    virtual void ReserveComplete(TInt aError)=0;

    保留(创建)当前Camera,

    当Camera::Rrserve的完成时Camera回调ReserveComplete

    aError  返回KErrNone成功,否则返回错误码。

    一般可能是当前的Camera被其他应用程序做占用。

    virtual void PowerOnComplete(TInt aError)=0;

    电源完成状况,

    当Camera::PowerOn()的完成时Camera回调PowerOnComplete

    aError  返回KErrNone成功,否则返回错误码。

    KErrInUse被使用

    virtual void ViewFinderFrameReady(CFbsBitmap &aFrame)=0;

    获得当前取景器的状况,当ViewFinderFrame函数打开的时候没过一点时间程序都会掉用ViewFinderFrameReady函数吧当前的取景器获得的数据以CFbsBitmap传递进来。获得数据之后就可以对其数据进行擦操作显示或者其他操作

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

    异步捕捉的图像返回给客户端程序,

    当我们掉用了Camera::CaptureImage()后台程序就会调用ImageReady;

    回调是会以两种方式把图像传递给客户端应用程序一个是aBitmap位图,另一个是用描述符的形式传递aData

    aError  返回KErrNone成功,否则返回错误码。

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

    将当前说捕捉到的视频图像的缓冲数据,返回给客户端应用程序。

    当我们调用了CCamera::StartVideoCapture().后台程序就会调用FrameBufferReady;

    MFrameBuffer

    如果成功的话返回一个指向一个MFrameBuffer, ,如果不成功,将返回NULL[空值]

    如果成功返回 KErrNone不成功返回错误代码。

    二、 创建摄像头的步骤

    1、 创建摄像头实例

    调用了Camera::NewL()

    static IMPORT_C CCamera *NewL(MCameraObserver &aObserver, TInt aCameraIndex);

    aObserver 摄像头观察者的引用。(MCameraOberver的引用)

    aCameraIndex是摄像头设备编号(使用时必须保证该摄像头是有效的)

    为方便使用Camera提供了静态函数CamerasAvailable(),用过该函数可以获得手机可用摄像头个数 可取0-- CamerasAvailable()-1之间任意一个整数。

    2、 保留(创建)摄像头

    Camera实例后 调用Camera::Rrserve()函数来保留摄像头。以保证对摄像头的独占访问

    3、 打开摄像头电源

    ReserveComplete(aError)aError是KErrInUse说明摄像头已经被占用,返回KErrNone说明保留成,如果保留摄像头成功我们就可以通过掉用Camera::PowerOn()打开摄像头电源了

    4、 设置摄像头参数

    如果成功的打开了摄像头电源那么我门就可以设置一些摄像头的参数了

    先掉用Camera::CameraInfo(),获得信息的摄像装置  TCameraInfo 结构指明了摄象头对各个参数的主持程度。

    对比度设置SetContrastL()

    设置的调整装置的对比。

    这一定是在这个范围的- 100到+ 100或EContrastAuto。与KErrNotSupported离开如果指定的对比数值的范围。

    设置高亮SetBrightnessL()

    设置高亮度调节装置。

    如果没有效果并不支持这一点,看TCameraInfo:iBrightnessSupported。

    这一定是在这个范围的- 100到+ 100或EBrightnessAuto。可能留下的亮度调节KErrNotSupported的范围。

    设置缩放SetDigitalZoomFactorL()

    设置这个数字变焦因子。

    这一定是在0到TCameraInfo:iMaxDigitalZoom包容。

    可能留下的放大因子KErrNotSupported的范围。

      设置曝光模式SetExposureL()

    设定曝光调整装置。

    如果没有效果并不支持这一点,看CameraInfo:iExposureModesSupported。

    可能留下如果指定的暴露KErrNotSupported调整是无效的。

    Enum TExposure

    EExposureAuto  = 0x00 自动模式,这是缺省模式。

    EExposureNight = 0x01 夜间模式,曝光模式较长。

    EExposureBacklight = 0x02 背光模式,适合在背光模式比较亮时使用。

    EExposureCenter = 0x03 中间模式,忽略掉周围环境的影响。

    设置闪光模式SetFlashL()

    设置闪光模式。

    如果没有效果并不支持这一点,看TCameraInfo:iFlashModesSupported。

    与KErrNotSupported离开如果指定的闪光的模式是无效的。

    Enum TFlash

    {

    EFlashNone =0x00 无闪光

    EFlashAuto =0x01 自动模式,有需要的时候会自动闪光。

    EFlashForced =0x02 强制模式,任何时候都会有闪光灯。

    EFlashFillIn =0x04 填充模式,在正常光照下会减弱闪光强度。

    EFlashRedEyeReduce =0x08  防红眼模式,减小或阻止图片上的人物像的红眼出现

    }

    经过以上的四个步骤 之后,就可以使用摄像头取景,捕捉图像和视频了。

    显示取景器

    ECam Api 支持两种显示取景器的方法(一种是DSA直接屏幕访问,另一种位图显示模式)。

    1、直接屏幕访问

    使用这种方法的时候,应用程序只要指明要使用屏幕上的那个区域,由摄像头把当前取的景直接绘制到这个区域上。

    DSA显示模式

    在显示模式下调用StartViewFinderDirecL()函数启动取景器,他的原型是

    Virtual void StartViewFinderDirectL(RWsSession &aWs, CWsScreenDevice &aScreenDevice, RWindowBase &aWindow, TRect &aScreenRect)=0;

    第一个参数 RWsSession当前窗口服务器对话的引用,

    第二个参数 CWsScreenDevice 当前屏幕设备的引用,

    第三个参数 RWindowBase 窗口的引用,

    第四个参数 TRect 以屏幕坐标指定的屏幕矩形。

    另一个重载的StartViewFinderDirectL函数还可以制定一个剪裁区的矩形。

    注意!!使用DSA显示模式时,取景器一旦启动窗口上就立即显示图像。

    2、位图显示

    由摄像头提供一系列的位图,而应用程序负责位图的绘制。摄像头可能只支持其中一种方法,也可能两者都支持,所以在使用取景器之前首先调用CCamera::CameraInfo()函数,根据根据函数返回的TCameraInfo结构的iOptionsSupported数据成员确定摄象头支持那种方法。

    Enum TOptions

    EViewFinderDirectSupported     直接将取景器显示在屏幕上

    EViewFinderBitmapsSupported 取景器产生位图,然后由应用程序进行绘制

    EVideoCaptureSupported 静态图像捕捉

    EVideoCaptureSupported 视频捕捉

    EViewFinderMirrorSupported 取景器镜像显示

    位图显示模式下调用StartViewFinderBitmapL()函数启动取景器,他的原型

    virtual void StartViewFinderBitmapsL(TSize &aSize)=0;

    参数TSize 指定了位图中所要显示的区域,一般来说最好调用EnumerateCaptureSize()函数作为摄象头选择一个标准的捕捉尺寸。

    virtual void StartViewFinderBitmapsL(TSize &aSize, TRect &aClipRect)=0;

    调用StartViewFinderBitmap程序会回调MCameraObserver::ViewFinderFrameReady().

    If PowerOn() has not been called, or has not yet completed

    当取景器以位图的模式启动后,每当摄像头获取一帧图像,ECam就会调用观察者的ViewFinderFrameReady()函数将这帧图像传回给应用程序,有应用程序决定是否显示改帧图像。

    关闭取景器

    调用Camera->StopViewFinder()

    图像捕捉

    EnumerateCaptureSizes

    virtual void EnumerateCaptureSizes(TSize &aSize, TInt aSizeIndex, TFormat aFormat) const=0;

    aSizeIndex函数根据指定的尺寸索引和图像格式给出摄象头支持的捕捉尺寸。

    思春索引是介于一个0到(TCameraInfo::iNumImageSizesSupported-1)之间的整数值,检查所有尺寸索引并选取最合适的尺寸。

    TFormat 图像格式是一个CCamera::TFormat类型的枚举值,可以从TCameraInfo::iImageFormatsSupported获取这个值。

  • 相关阅读:
    小工具合集使用体验
    php计算金额精度丢失问题与二维数组排序
    layui treeSelect
    thinkphp5.1 使用小记
    thinkphp软删除
    移动端meta标签设置
    (kotlin异常) java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
    微信小程序map地图的一些使用注意事项
    修改UIScrollView 的手势代理
    awk命令详解
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/1871568.html
Copyright © 2011-2022 走看看