精华内容
下载资源
问答
  • 做最好用的摄像头录像监控软件 主要特征 三种模式:预览、录像、录音。 镜头点缀:可显示时间戳、镜头名。 高倍压缩:采用先进的音视频编码器。 其它功能:拍照、缓冲优化、最小化到托盘。 自动控制:可限制...
  • 支持开机自动录像、后台隐身录像、同时多个摄像头录像,循环录像(磁盘空间循环利用),支持普通和高清两种画质模式,支持同步录音、人脸识别、邮件报警等。她空间占用少、资源消耗低、可无限期连续监控,是最好用的...
  • 摄像头

    2013-12-05 11:55:16
    摄像头的工作原理 摄像头主要有镜头、CCD图像传感器、预中放、AGC、A/D、同步信号发生器、CCD驱动器、图像信号形成电路、D/A转换电路和电源的电路构成。摄像头的主要图像传感部件是CCD(Charge Coupled Device)...

    摄像头的工作原理

    摄像头主要有镜头、CCD图像传感器、预中放、AGC、A/D、同步信号发生器、CCD驱动器、图像信号形成电路、D/A转换电路和电源的电路构成。摄像头的主要图像传感部件是CCD(Charge Coupled Device),即电荷耦合器件,它具有灵敏度高、畸变小、寿命长、抗震动、抗磁场、体积小、无残影等特点,CCD是电耦合器件(Charge Couple Device)的简称,它能够将光线变为电荷并可将电荷储存及转移,也可将储存之电荷取出使电压发生变化,因此是理想的摄像元件,是代替摄像管传感器的新型器件。
        摄像头的工作原理是:被摄物体反射光线,传播到镜头,经镜头聚焦到CCD芯片上,CCD根据光的强弱积聚相应的电荷,经周期性放电,产生表示一幅幅画面的电信号,经过预中放电路放大、AGC自动增益控制,于由图像处理芯片处理的是数字信号,所以经模数转换到图像数字信号处理IC(DSP)。同步信号发生器主要产生同步时钟信号(由晶体振荡电路来完成),即产生垂直和水平的扫描驱动信号,到图像处理IC。然后,经数模转换电路通过输出端子输出一个标准的复合视频信号。这个标准的视频信号同家用的录像机、VCD机、家用摄像机的视频输出是一样的,所以也可以录像或接到电视机上观看。图像数字信号处理主是有SONIX(松翰)和VIMICRO(中星微)等。

    图像传感器(SENSOR):是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。目前市场上主流摄像头使用的感光元件主要是CCD和CMOS两种。它们的作用相当于传统相机中的底片。CCD的分辨率高,色彩还原逼真,已经成为百万像素级的数码摄影器材里的主角,但是其价格昂贵;与CCD相比,CMOS具有节能及成本低等特点。而且在百万像素内CMOS的感光效果完全可以和CCD媲美,因而摄像头几乎全都采用CMOS作为感光元件。目前市场上的摄像头产品采用的CMOS品牌较多,主要有MICRON,HYNIX, CISENSOR, TASC等等前四家的市场占有率接近100%。

    CCD可分为线阵CCD、三线CCD、面阵CCD和交织传输CCD。摄像头采用是面阵CCD图像传感器。CCD芯片就像人的视网膜,是摄像头的核心。目前我国尚无能力制造,市场上大部分摄像头采用的是日本SONY、SHARP、松下、LG等公司生产的芯片,现在韩国也有能力生产,但质量就要稍逊一筹。因为芯片生产时产生不同等级,各厂家获得途径不同等原因,造成CCD采集效果也大不相同。在购买时,可以采取如下方法检测:接通电源,连接视频电缆到监视器,关闭镜头光圈,看图像全黑时是否有亮点,屏幕上雪花大不大,这些是检测CCD芯片最简单直接的方法,而且不需要其它专用仪器。然后可以打开光圈,看一个静物,如果是彩色摄像头,最好摄取一个色彩鲜艳的物体,查看监视器上的图像是否偏色,扭曲,色彩或灰度是否平滑。好的CCD可以很好的还原景物的色彩,使物体看起来清晰自然;而残次品的图像就会有偏色现象,即使面对一张白纸,图像也会显示蓝色或红色。个别CCD由于生产车间的灰尘,CCD靶面上会有杂质,在一般情况下,杂质不会影响图像,但在弱光或显微摄像时,细小的灰尘也会造成不良的后果。摄像头的分类如下:

    1、依成像色彩划分 彩色摄像机:适用于景物细部辨别,如辨别衣着或景物的颜色。黑白摄像机:适用于光线不充足地区及夜间无法安装照明设备的地区,在仅监视景物的位置或移动时,可选用黑白摄像机。
       2、依分辨率灵敏度等划分 影像像素在38万以下的为一般型,其中尤以25万像素(512*492)、分辨率为400线的产品最普遍。 影像像素在38万以上的高分辨率型。
        3、按CCD靶面大小划分 CCD芯片已经开发出多种尺寸: 目前采用的芯片大多数为1/3"和1/4"。在购买摄像头时,特别是对摄像角度有比较严格要求的时候,CCD靶面的大小,CCD与镜头的配合情况将直接影响视场角的大小和图像的清晰度。1英寸--靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。 2/3英寸--靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。 1/2英寸--靶面尺寸为宽6.4mm*高4.8mm,对角线8mm。 1/3英寸--靶面尺寸为宽4.8mm*高3.6mm,对角线6mm。 1/4英寸--靶面尺寸为宽3.2mm*高2.4mm,对角线4mm。 
        4、按扫描制式划分 PAL制。 NTSC制。 中国采用隔行扫描(PAL)制式(黑白为CCIR),标准为625行,50场,只有医疗或其它专业领域才用到一些非标准制式。另外,日本为NTSC制式,525行,60场(黑白为EIA)。 
       5、按照度划分,CCD又分为: 
           普通型 正常工作所需照度1~3LUX 
           月光型 正常工作所需照度0.1LUX左右 
           星光型 正常工作所需照度0.01LUX以下 
           红外型 采用红外灯照明,在没有光线的情况下也可以成像 
        6、按外观分:有机板型、针孔型、半球型。
           CCD彩色摄像头的主要技术指标 
           (1)CCD尺寸,亦即摄像机靶面。原多为1/2英寸,现在1/3英寸的已

    普及化,1/4英寸和1/5英寸也已商品化。 
           (2)CCD像素,是CCD的主要性能指标,它决定了显示图像的清晰程度,

    分辨率越高,图像细节的表现越好。CCD是由面阵感光元素组成,每一个元素称为像素,像素越多,图像越清晰。现在市场上大多以25万和38万像素为划界,38万像素以上者为高清晰度摄像机。 
        (3)水平分辨率。彩色摄像机的典型分辨率是在320到500电视线之间,主要有330线、380线、420线、460线、500线等不同档次。 分辨率是用电视线(简称线TV LINES)来表示的,彩色摄像头的分辨率在330~500线之间。分辨率与CCD和镜头有关,还与摄像头电路通道的频带宽度直接相关,通常规律是1MHz的频带宽度相当于清晰度为80线。 频带越宽,图像越清晰,线数值相对越大。
        (4)最小照度,也称为灵敏度。是CCD对环境光线的敏感程度,或者说是CCD正常成像时所需要的最暗光线。照度的单位是勒克斯(LUX),数值越小,表示需要的光线越少,摄像头也越灵敏。月光级和星光级等高增感度摄像机可工作在很暗条件,2~3lux属一般照度,现在也有低于1lux的普通摄像机问世。 
        (5)扫描制式。有PAL制和NTSC制之分。 
        (6)信噪比。典型值为46db,若为50db,则图像有少量噪声,但图像质量良好;若为60db,则图像质量优良,不出现噪声。 
        (7)视频输出。多为1Vp-p、75Ω。 
        (8)镜头安装方式。有C和CS方式,二者间不同之处在于感光距离不同。 
        (9)摄像头的像素:SXGA (1280 x1024)又称130万像素,XGA(1024 x768)又称80万像素,SVGA(800 x600)又称50万像素,VGA(640x480)又称30万像素(35万是指648X488),CIF(352x288) 又称10万像素,SIF/QVGA(320x240)。

    展开全文
  • 摄像头标定原理

    千次阅读 2020-06-21 08:56:40
    摄像头标定原理 基本概念 视角 : 视野边界的夹角,即成像范围 图像噪音 : 指的是图像中的杂点干挠。表现为图像中有固定的彩色杂点。 彩色深度 : 反映对色彩的识别能力和成像的色彩表现能力,实际就是A/D转换器...

    摄像头标定原理

    1. 基本概念

      视角 : 视野边界的夹角,即成像范围

      图像噪音 : 指的是图像中的杂点干挠。表现为图像中有固定的彩色杂点。

      彩色深度 : 反映对色彩的识别能力和成像的色彩表现能力,实际就是A/D转换器的量化精度,是指将信号分成多少个等级。常用色彩位数(bit)表示。彩色深度越高,获得的影像色彩就越艳丽动人。

      自动白平衡调整 : (AWB)要求在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的。色温表示光谱成份,光的颜色。色温低表示长波光成分多。当色温改变时,光源中三基色(红、绿、蓝) 的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是白平衡调节的实际。

      格式 : raw格式文件本质上是一个没有经过任何图像处理的源文件,它能原原本本地记录相机拍摄的信息, 没有经过图像处理(锐化、色彩对比增强)和压缩而造成的信息丢失,让用户能大幅度进行后期制作,并且无论怎么操作,照片都能无损的恢复到最初状态。相比之下,JPEG格式的数据经过压缩处理,无法完整的保存原图形的所有数据。但存储数据量太大打开速度慢,JPEG就小很多;

       	 JPEG:(joint photographic expert group)静态图像压缩方式。一种有损图像的压缩方式。
       	 压缩比越大,图像质量也就越差。当图像精度要求不高存储空间有限时,可以选择这种格式。目前大
       	 部分数码相机都使用JPEG格式。
      

      光线 : 光沿直线传播,且光路具有可逆性

      漫反射 : 投射在粗糙表面上的光向各个方向发射的现象,即虽然入射光线时平行的(如太阳光),当入射到粗糙 的表面时,由于各个点的法线方向不一致,造成发射光线向不同的防线无规则的反射。

      实像 : 是由物体的反射光(或光源物体的发射光)经过透镜后的折射光线(实际光线)汇聚而成,可用屏幕承接;

      虚像 : 是物体的反射光,经透镜折射后的光线的反向延长线汇聚而成,由于虚像是实际光线所不能达到的,所以 不可用屏幕承接,但由于人眼晶状体相当于透镜,具有对光线的汇聚功能,故人眼也能看见虚像;虚像由于是实际光线的虚拟出来的,因此不需要物理空间位置来呈现它的存在。如放大镜成像:物体在凸透镜的一倍焦距内时,它的反射光经凸透镜折射进入人眼,人眼根据折射光线在视网膜上成像,而根据折射光线反向延长可得到实际物体的虚像,因此相当于是虚像中的物体在人眼中成了像,所以人眼能看见虚像,但其实虚像中的物体本身并不存在,而且虚像在实际物体偏离人眼的另一侧,但人眼依然能看到它; 如 : 放大镜成像,平面镜成像【平面镜成像过程是:物体表面的光线(其实时光源的在该物体上的反射光)在镜面上发生了发射,而反射后的又进入了人眼,人眼中成的是物体在经平面镜时反射成的虚像】

      注 : 实像与虚像与人眼看不看得到没有关系,实像和虚像都能被人眼看到;实像与虚像的本质区别是,实际 的光线是否可达,若像由实际的光线可达,则是实像,若像由实际的光线不可达则是虚像;
      注 : 在满足物体、光线都具备的条件下,能否成像,取决与小孔成像模型的条件是否满足。如:相机中的凸 透镜,人眼中的晶状体都是一种特殊的小孔成像模型,故都能成像;

    2. 摄像机原理

      . 成像原理

      i). 小孔成像

      由于光沿直线传播,在物与像在孔的两侧,像是上下左右倒立的实像;当空比较小时,物的不同部分发出的光线也达到像的不同部分,即物的不同部分发出的光线不会重叠,像就会 比较清晰。而一旦孔大到一定程度,物的不同部分发出的光线就会发生重叠,像自然就不在清晰了,所以小孔相当于一个分解器,将来自物的不同部分的光线分解了,即在一定程度内,孔只允许物上的每一部分的光线通过小孔仅被传送到像唯一的位置,才能成像。孔的大小是相对于物来说的,物大孔可以大,物小则孔必须小。如果孔的大小及孔与物的距离都一定,那么屏幕 距离孔越远,所成的像的分辨率也就越高,但分辨率的极限是孔的大小,也即是成像的物体上比孔小的细节就无法分辨清楚了。【与摄像机模型相反,摄像机中变的时物与镜头的距离】

      ii). 凸透镜成像

       成像理论  :  1/f = 1/m +1/n ,f 为焦距, m 为像距,n为物距
      	可得:
       当物距(f,2f)时,像距 >2f, 成倒立放大的像;【投影仪,幻灯机,电影放映机】
       当物距 = 2f 时,像距 = 2f, 成倒立等大的像;
       当物距 >2f 时,像距(f, 2f),成倒立缩小的像; 【照相机,摄影机】
      

      iii). 摄像机成像的模型

      当 物距 >> f 时,有 n = f,此时可以将透镜成像模型近似的用小空成像模型来代替,其物理上相当于薄透镜,它的成像关系是线性的,不考虑透镜的畸变,在大多数场合,这种模型可以满足精度要求,即使用几何线性模型–小孔成像模型来作为摄像机的模型即可;此时在对摄像机进行参数标定时,内参仅需考虑小孔成像模型下的透视投影即离散化过程中的参数及5参数模型即可(可能时4/5/6参数都有可能);线性模型忽略了镜头的畸变过程,只能用于视野较窄的摄像机标定,当镜头畸变较明显,特别是在使用广角镜头时,在远离图像中心处会有较大的畸变,这时线性模型就无法准确的描述成像几何关系,此时需要在线性模型的上在添加畸变矫正过程,变成非线性模型;

      iv). 鱼眼相机模型

      鱼眼相机的视角较大(可以大于180°),其成像模型有多种,包括【等距投影、等立体角投影模型、正交投影模型、体视投影模型】

      . 成像过程

       输入光源 -> 镜头 -> 光学图像 -> 图像传感器(CCD或CMOS SERSOR) 
                           							|
                         								V
       图片输出 <- DA转换 <- DSP处理器 <- 数字图像 <- AD转换 <- 电信号
      

      被摄物体反射光线,传播到镜头,经镜头聚焦到图像传感器芯片上,它根据光的强弱积聚相应的电荷,经周期性放电,产生表示一幅幅画面的电信号,经过预中放电路放大、AGC自动增益控制,经模数(AD)转换传送到图像数字信号处理IC(即DSP)。同步信号发生器主要产生同步时钟信号(由晶体振荡电路来完成),即产生垂直和水平的扫描驱动信号,到图像处理IC。然后,经数模(DA)转换电路通过输出端子输出一个标准的复合视频信号。这个标准的视频信号同家用的录像机、VCD机、家用摄像机的视频输出是一样的,所以也可以录像或接到电视机上观看。图像数字信号处理主是有SONIX(松翰)和VIMICRO(中星微)等。

      图像传感器(SENSOR):是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。目前市场上主流摄像头使用的感光元件主要是CCD和CMOS两种。它们的作用相当于传统相机中的底片。CCD的分辨率高,色彩还原逼真,灵敏度高,噪声小,信噪比大,但成本高,生产工艺复杂,功耗高。已经成为百万像素级的数码摄影器材里的主角,用于录像或者图像扫描;CMOS具有集成度高,功耗低(不到CCD的1/3),成本低,但是噪声大,灵敏度低,对光源要求高。但在百万像素内CMOS的感光效果完全可以和CCD媲美,因而摄像头几乎全都采用CMOS作为感光元件。

      数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。它可以做些拍照以及回显(JPEG的编解码)、录像以及回放(Video 的编解码)、H.264的编解码、还有很多其他方面的处理,总之是处理数字信号了。可以认为ISP是一类特殊的处理图像信号的DSP。

       DSP结构框架:
       	ISP(image signal processor)(镜像信号处理器)
       		主要是对图像传感器经过ADC处理后的Raw Data进行处理,如进行:AEC(自动曝光控制)、
       		AGC(自动增益控制)、AWB(自动白平衡)、色彩校正、Gamma校正、祛除坏点、
       		Auto Black Level、Auto White Level 等等功能的处理。
       	JPEG encoder(JPEG图像解码器)
       	USB device controller(USB设备控制器)
      

      . 镜头

      摄像头的构成主要包括主控芯片、感光芯片、镜头和电源。好的电源也是保证摄像头工作的一个方面。目前五玻镜头是主流。简单的说镜头是由透镜组成,摄像头的镜头一般是由玻璃镜片(glass)或者塑料镜片(plastic)组成的。玻璃镜头能获得比塑料镜头更清晰的影像。这是因为光线穿过普通玻璃镜片通常只有5%~9%的光损失,而塑料镜片的光损失高达11%~20%。有些镜头还采用了多层光学镀膜技术,有效减少了光的折射并过滤杂波,提高了通光率,从而获得更清晰影像。现在很多小厂,为了节约成本、追求高利润,往往减少镜片的数量,或者使用廉价的塑料镜头。虽然这些产品在价格上便宜不少,看上去很有吸引力,但实际的成像效果却实在是令人无法恭维。现在市面上大多数摄像头采用的都是五玻镜头,但是不乏少数商家将塑料镜头说成五玻镜头的。

      . 普通摄像头

      把三维空间的景物投影到二维空间,这是照相机和我们眼睛共通的基本原理。这种投影就是透视,透视有很多规律,最基本的就是近大远小。我们都知道,近处的景物只是看起来大,而不是真的变大了。所以我们的大脑会自动修正这个认知,你平时用肉眼看世界不会觉得有什么不正常。然而,视角越大,那么近大远小的程度就越大。如果视角超过了人眼的习惯视角,乃至于超出了大脑能自动修正的程度,这样的透视就会让人产生失真感。这就是你所谓的透视失真。

       注意:透视和畸变是不同的,透视是客观规律,只要你还是把三维空间投影到平面上,就无论如何都无法避免。而畸变则是成像技术缺陷造成的,人们可以通过技术的进步来努力改善甚至避免。基本上来说,把直线拍摄成斜线是透视,把直线拍摄成曲线是畸变。
      

      虽然人眼的视角接近180度,但大部分属于“眼角余光”,舒适视角大约是中间的55度。一般人出于本能习惯,观察景物主要都会用这60度的舒适视角。对于照相机来说,就没有什么舒适视角了,视角和感光元件尺寸与焦距直接相关。我们经常用等效焦距(也就是感光元件为135底片大小,即36*24mm时的镜头焦距)来衡量视角。焦距越短,视角越大(可以百度搜索一下等效焦距和视角的对应关系的公式和表格)。基本上视角接近人眼舒适视角(55度左右)的镜头称为标准镜头,而视角更大的就是广角镜头,更小的则是远摄镜头。在同等情况下,广角镜头相对长焦距的镜头来说,更难以控制畸变的产生。如果要控制畸变就需要更高端的技术和更高昂的成本。甚至有一些超广角镜头干脆不控制畸变反而强调这种变形,这就是鱼眼镜头。

      . 鱼眼摄像头

      鱼眼镜头是一种焦距为16mm或更短的并且视角接近或等于180°。 它是一种极端的广角镜头,鱼眼镜头的成像有两种,一种像其他镜头一样,成像充满画面;另一种成像为圆形。无论哪种成像,用鱼眼镜头所摄的像,变形相当厉害,透视汇聚感强烈。 对于典型的胶片格式(感光芯片),鱼眼镜头的焦距是一种典型的15-16毫米,成像结果为全帧鱼眼图像(此时镜头采到的图像部分呈现在感光芯片上);另一种是典型的8-10毫米,成像结果圆形鱼眼图像(此时镜头采集到的图像全部呈现在感光芯片上)。不同的模型所采用的原理是不同的,这对选择图像的校正模型方案非常重要。

    3. 坐标变换

      首先空间中的一点由世界坐标系转换到摄像机坐标系,然后再将其投影到图像坐标系(摄像机的CCD),最后再将图像坐标系上的数据转换到像素坐标系(最后生成的图像)。

      齐次坐标 : 使用N+1维坐标来表示N维坐标,例如在2D笛卡尔坐标系中加上额外变量w来形成2D齐次坐标系(x,y)⇒(x,y,w) 齐次坐标具有规模不变性,同一点可以被无数个齐次坐标表达.(x,y,1)⇒(ax,ay,a)齐次坐标转化为笛卡尔坐标可以通过同除最后一项得到.

      点的齐次表示 : 对于直线l=(a,b,c)T上的一点(x, y)T,有ax+by+c=0,写成向量内积的形式为(x, y,1) (a,b,c)T = 0。其中(x, y,1)T就是点(x, y)T的齐次向量表示形式。点的任意齐次向量表示为(x1, x2, x3)T ,代表平面R2上的一点(x1/x3, x2/x3 )T,其中前者为该点的齐次坐标,后者为非齐次坐标。以齐次向量表示的点也是投影空间P2的元素。【三维坐标点齐次表达类似】

      单应性变换 : 单应性变换是对齐次坐标下点的线性变换

      投影平面模型 : 二维投影空间P2可以看做三维实数空间R3上的一组射线组成的集合。2D投影几何研究的是投影空间P2在投影变换中的不变属性。

      像平面 : 感光芯片确定的平面
      光轴 : 经过光心且垂直于像平面的射线成为光轴
      光心 : 摄像机镜头的光心(规则凸透镜的物理中心)
      主点 : 光轴与像平面的交点p是摄像机的主点。

      世界坐标系: (Xw,Yw,Zw)
      符合右手法则的3维物理坐标系,该坐标系描述环境中任何物体的位置,根据具体情况而定;

      像机坐标系:(Xc,Yc,Zc)
      符合右手法则的3维物理坐标系,是由摄像机镜头所确定的坐标系。以镜头的光心为原点Oc,以光轴为Zc
      轴,并垂直于成像平面,取摄影方向为正方向,Xc、Yc轴与图像物理坐标系的x,y轴平行,且OcO为摄
      像机的焦距f,以毫米为单位;

      图像坐标系: 图像物理坐标系 (x,y)
      2维物理坐标系,位于感光芯片所确定的平面上,以光轴与平面的交点为原点O,以毫米为单位;

      像素坐标系: 图像像素坐标系 (u,v)
      与图像物理坐标系位于同一个平面,以平面左上角为坐标原点(可以理解为感光芯片的左上角),u v坐标轴
      可以是互相垂直(即分别平行于图像坐标系中的xy轴),也可以不行平,以像素为单位;

    4. 相机标定

      摄像机标定方法有很多种,根据标定过程是否需要参照物来看,可以将标定方法分为基于标定物的方法和摄像机自标定方法。基于标定物的方法需要借助一个形状。尺寸抑制的标定物,使用图像处理方法,利用数学变换,去求相机模型的内参和外参。基于标定物的方法可以分为:利用非线性最优化算法的标定方法、利用透视变换矩阵的标定方法、基于径向约束的两步法、双平面标定发、张正友标定发等。摄像机自标定方法不依赖于参照物,利用相机在运动过程中图像与图像之间的对应关系对相机的参数进行标定, 常见的摄像机的自标定方法有:基于Kruppa方程的自标定方法、基于主动视觉的自标定方法、分层逐步标定方法、基于二次曲面的自标定方法等;张正友标定法事实上是介于以上两种类型之间的一种标定方法,其思想是利用一块标定板(且令世界坐标Z=0),相机对标定板从不同位置拍摄图像,根据标定板上的几何结构特点,通过线性模型分析求得相机参数的解,该方法鲁棒性灵活性、实用性都很好,是目前被广泛采用的摄像机标定方法;

    5. 普通摄像机的标定 【内参、外参、畸变矫正】

      (1) 外参

      . 世界坐标系 ---> 摄像机坐标系 【刚性变换】
      
      刚性变换: 旋转,平移    通过刚性变换可以实现将任意一个坐标系转换到另一个坐标系下;
      
      其中:
      	i). 旋转  包括分别绕 x y z轴进行的旋转,每个旋转变换矩阵为 3X3 矩阵R1,R2,R3
      			 旋转变换操作为 R = R1R2R3,该变换中涉及3个独立的变量,即分别绕x y z轴的旋转角度
      			 量a1,a2,a3
      	ii).平移  该平移量是一个3X1的矩阵(x0,y0,z0)T
      

      该变换过程中涉及的参数都与摄像机本身无关,故在标定过程中被称为外参,外参共6个。三个坐标轴的旋转参数分别是(w、δ、θ),把每个轴的33旋转矩阵进行组合(矩阵之间相乘),得到集合三个轴旋转信息的R,其大小还是33;T的三个轴的平移参数(Tx、Ty、Tz)。R、T组合成3*4的矩阵,其是转换到标定纸坐标的关键;

      (2) 内参

      . 摄像机坐标系 ---> 图像坐标系 【透视变换,3D转2D】
      

      投影: 将3维转为2维可通过投影的方法,常用的有正交投影和透视投影,正交投影将用于三维建模,而透视投影和人的视觉系统相似,多用于在二维平面中对三维世界的呈现;

      对于普通相机及广角相机(一定角度范围内),采用平面透视投影模型即可满足精度需求,此时采用的是小孔成像的线性模型。当物距 >> 焦距,凸透镜的像平面无限趋近于焦点处,再利用平面透视模型将像平面对称变换到镜头与物体中间,再利用平面透视投影模型(相似三角形定理)计算点投影后的位置;(对于鱼眼镜头,由于视角较大(>=180°),采用球面透视投影模型来进行校正图像是比较合适的,此时的投影过程中,先将所有的点映射到一个单位球面上,得到球面投影图像,再将球面投影图像投影到像平面上即可;)

      . 图像坐标系 ---> 像素坐标系 【离散化】     (+【畸变矫正】(如果有))
      

      像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列,所以二者需要进行转换;

      这些参数是只有相机来决定的,不会因为外界环境而改变,故称为内参。内参共6个 : 1/dx、1/dy、r、u0、v0、f。opencv中的内参是4个,分别为fx、fy、u0、v0。其实opencv中的fx也就是F*Sx,其中F是焦距上面的f,Sx是像素/每毫米也就是上面的1/dx。其中:

      	i).   f 即是相机镜头的焦距;
      	ii).  dx和dy表示x方向和y方向的一个像素分别占多少个单位,是反映现实中的图像物理坐标关系与像素坐标系转换的关键,dx,dy一般认为是相同,但也可以不相同;
      	iii). u0,v0代表图像坐标系的原点(光轴与像平面的交点)在像素坐标系中所对应的像素坐标,理论上图像物理坐标系的中心点即(u0,v0)应该在像素坐标系的中心点,但是由于安装精度的问题,通常二者之间会存在一定的偏差;
      	iv).  r 为坐标轴倾斜参数,理想情况下为0
      	注 : 若是涉及三维变换,
      

      (3) 畸变矫正 【内参】

      . 径向畸变 : 发生在相机坐标系转图像物理坐标系的过程中,径向畸变的主要原因是镜头径向曲率的不规则变化(凸透镜的固有属性,中间厚边缘薄),它会导致图像的扭曲变形,表现为光线在远离透镜中心的地方比靠近中 心的地方更加弯曲。这种畸变的特点是以主点为中心,沿径向移动,离的距离越远,产生的变形量就越大。径向畸变是导致图像畸变的主要因素,径向畸变主要包含桶形畸变和枕形畸变两种。径向畸变的数学模型可以用主点周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用后续项k3,k4,k5等来进行描述:

      . 切向畸变 : 切向畸变是发生在相机安装过程,其是由于感光元平面跟透镜不平行。这种畸变使得一些区域看上去比预期的近,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致,此畸变使用两个参数p1,p2来描述;

      . 薄棱镜畸变 :

    (4) 标定过程

        内参:4/5个  (fx,fy,u0,v0,r, 其中fx = f/dx, fy = f/dy, r为像素坐标系两个坐标轴的 扭曲,对大多数标准相机来说r设为0)
        外参:6个 (世界坐标系到摄像机坐标系变换过程中的 旋转角 a1,a2,a3及平移量b1,b2,b3)
        畸变:径向畸变: k1,k2,... 切向畸变:p1,p2  (薄透镜畸变,一般不考虑)
        标定方法:张正友标定法(Opencv已支持)
    
        i). 角点检测与提取
          . 标定板的内角点的世界坐标提取(真实棋盘格行列各减1)(标定板至少有3张不同角度的图片)
          . 标定板的角点的图像坐标的提取(为了提高经度,可以讲提取到的像素坐标精度精确到亚像素)
    
        ii). 求单应性变换矩阵
          . 在世界坐标系中,令标定板的棋盘平面所在平面为 Z=0,则标定板的棋盘平面到图像平面的变换对应一个单应性变换;
          . 对单张图像至少要有4组角点,因为单应性变换矩阵H(齐次矩阵)有8个参数,每组对应角点对应两个方程,故要解的
          该张标定板图片的H,至少需要有4组对应角点(每组点是指标定板上的角点的世界坐标及其在图像像素坐标系中对应的
          坐标);
            
        iii). 求内参
          . 在求得单应性变换矩阵的前提下,求解内参变量;
          . 内参有5个,根据外参中旋转矩阵的正交特性,对每张标定棋盘图像获得的单应性变换矩阵,可获得两个约束方程,
          因此求解内参至少需要3张标定棋盘图像;
          . 为了方便计算通过对一个对称矩阵来求解
          
        iv). 求外参
          . 根据已求得的内参,通过透视变换矩阵及单应性变换矩阵,矩阵运算求解外参
          . 对不同的棋盘标定图像其外参是不同的
          
        v). 最大似然估计 ??????
          . 为了增加标定结果的可靠性,使用最大似然估计来优化标定过程中求得的内参、外参值
          . 将每张图像的控制点根据求解的参数重投影回三维空间,最小化与真实值的差异
          . 它是利用采集的不同角度的标定棋盘图像中的所有角点,通过LM(莱文贝格-马夸特)方法来进行
            非线性的迭代求解,求使;
          
        vi).  畸变矫正
          . 径向畸变矫正(2-4参):根据角点组计算
          . 切向畸变矫正(2参):根据焦点组计算
            
        vii). 畸变矫正的最大似然估计 ??????
          . 方法同求内外参的最大似然估计过程相同
    
        注意事项:
        . 棋盘摆放的是否平整(其影响远大于噪声造成的影响)
        . 棋盘标定模板图片在一定范围内越多越好,摄像头与棋盘平面的夹角最好在45度以内(角度太大会影响角点提取的像素精度)
        . 光线影响很重要,一定要保证有足够的光照亮度
    
    1. 鱼眼相机的标定

      (1). 对鱼眼相机的参数标定方法有如下几种,

      . 一种是可以根据镜头的投影模型进行,包括:

      i). 球面投影模型【等距投影、等立体角投影模型、正交投影模型、体视投影模型】,在应用这些模型时, 球面就相当于是平面透视的投影平面,也就是鱼眼镜头的成像面。球面上的所有点在非线性的投影到 鱼眼图像的成像平面上。该类方法需要根据镜头的确切的设计投影模型进行建模,用一个尽可能接近的模型去描述镜头,但前提是镜头需要严格按照设计模型进行精密的加工,较高的工艺要求提高了镜头的成本,限制了镜头的使用范围;

      ii). 抛物面成像模型,该成像模型相对比较复杂,与球面成像模型类似,此模型把抛物面作为鱼眼镜头的成像面,但该模型计算比较复杂,如果想要恢复场景深度可以使用该模型来获得精确的结果但该模型计算过于复杂,一般使用较少。

      . 一种是一般通用模型,称为多项式逼近模型,三维空间中任意一点投影到图像平面时,通常理解为进行了两次变换,首先是透视变换,然后就是鱼眼镜头的畸变,因此可以通过射影不变性来分析鱼眼镜头的畸变。
      方法有:Kannala 等用一个只包含齐次项的多项式来关联r与θ的关系;Ying等用多项式描述镜头的径向失 真和且向失真;Scaramuzzza 提出一种基于泰勒级数模型的全向视觉传感器建模和标定方法,该模型不仅可以用于折反射全向系统,也适用于鱼眼镜头,尽管引入更多的模型参数可以适当提高标定精度,但随之而来的计算代价和求解不稳定性也会带来操作上的困难,但由于其简单实用,因此被普遍采用。这类方法不需要知道镜头的严格工艺模型,具有一定的普适性。

      . 上述这些方法又可以从2D,3D空间进行鱼眼图像的校正来分类。2D空间的鱼眼校正用不到空间信息,直接在 2D空间进行鱼眼图像的校正,并找出带校正鱼眼图像与校正图像之间的坐标变换关系,最后采用像素差值技术恢复校正图像,方法包括:球面坐标定位法(经度坐标校正法),多项式坐标变换法,射影不变性以及利用极坐标映射法来进行畸变校正;3D 空间进行鱼眼校正的方法包括:投影转换方法(利用透视投影图像成像原理);

      (2). Scaramuzza 成像模型

      采用鱼眼镜头的通用模型, 即 scaramuzza 提出的泰勒级数模型,成像过程如下:

      . 世界坐标系 <---> 相机坐标系
      
      Pm(X,Y,Z) = R*Pw(X,Y,Z) + T
      该变换过程同普通相机的成像模型是一个包含【旋转变换+平移变换】的刚性变换过程
      
       . 相机坐标系 <---> 传感器平面坐标系
      
        Pm(X,Y.Z) = Pi(x,y,f(p)), f(p) = a0 + a1p + a2p^2 + a3p^3 + ... + anp^n;
        其中 p^2 = x^2 + y^2, 即p为畸变成像点到成像平面中心(光心)的距离;为非线性变换,此处采用一个
        泰勒多项式来逼近鱼眼镜头的一般化模型;
      
      . 传感器平面坐标系 <---> 像平面坐标系
      
        (u,v) = (c d) (x,y) + (xc, yc)
                (e 1)
        此处变换为一个仿射变换,(xc, yc)为像平面的中心(实际应该是光心),c,d,e是仿射变换系数;
      

      (3). Scaramuzza 标定过程

      (4). NXP-SV3D-Project 标定过程

      内参标定

        求解鱼眼镜头的内部参数有【畸变,仿射变换,像平面中心】
      
        i). 棋盘标定板模版图像采集
              . 标定板至少有3张不同角度的图片,保证能至少求解出三个独立的单应性矩阵
      
        ii). 角点检测与提取 (棋盘格标定板)
              . 标定板的内角点的世界坐标提取(真实棋盘格行列各减1)
      
        iii). 设定泰勒级数的最大幂指数(推荐值:4)
      
        iv). 查找像平面中心
      
        v). 对内参进行最大似然估计
              . 对上述求出的内参进行优化。通过 LM 方法,对所有的角点求重投影误差的平方和的最小值,求的最优解
      

      外参标定

        做预处理计算并未后续的纹理映射产生 “mask” 和 “array” 文件;
        该过程仅使用了CPU资源;
      
        i). 矩形方格模版的采集
              . 每个镜头能看到两个完整的矩形方格
              . 尽可能确保镜头位置与矩形方格间相互位置的对称性(可以减小误差)
      
        ii). 外参计算 (矩形方格标定板)
              . 矩形方格标定板中角点提取(对应可检测出16个角点);
              . 内参已知,利用检测到的角点计算外参,即与真实世界的变换参数(旋转、平移参数);
      
            注: 在进行标定之前,需要将矩形方格的角点坐标存储起来,且每个镜头中的两个矩形方格16个角点,按照方格从左向右,方格为“右上行”序;
            注: 每个角点的坐标,没必要按照实际的坐标尺寸进行标注,但是相互之间需要按照合适的比例来进行(如用像素,或毫米刻度等量度);
            注: 四个摄像机的模版的角点参数储存值是相同的,这就要求相机及矩形方格之间必须是相互对称的;
      
        	在实操步骤中,外参的标定分为5步:
          1). 矩形方格模版采集与显示
          2). 按照已知的内参构建径向成像模型,对模版图片去除畸变后显示;
          3). 在去除畸变后的图像中查找等高线,其与ROI的选取有关;
          4). 网格准备,将网格描绘在模版图像上;
          5). 图像拼接(为了使计算更快,拼接的结果视图为椭圆)
      

      (5). 渲染过程

      使用GPU将每个图像帧在预先准备好的3D网格上进行混合,它将4张输入图像拼接在一张输出图像上并使用GPU进行展示

    2. 标定与畸变校正

      标定过程只是为了获取镜头根据成像模型成像时的变换参数(包括内参和外参)

      畸变校正是在已知内外参数的情况下对镜头采集到的图像按照成像模型对产生的畸变进行校正恢复,变成符合人眼方便识别

    展开全文
  • 最好用的摄像头录像软件 通过 延长摄像头距离 几十米,可用于旅店、店铺、自拍、安防等。 主要特征 三种模式:预览、录像、录音。 镜头点缀:可显示时间戳、镜头名。 高倍压缩:采用先进的音视频编码器。 其它...
  • 摄像头工作原理

    2015-01-25 12:50:49
    摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过USB接口传输到电脑...

    摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D(模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再通过USB接口传输到电脑中处理,通过显示器就可以看到图像了。

    摄像头工作原理 - 零起点 - 我的博客

      注1:图像传感器(SENSOR)是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。

      注2:数字信号处理芯片DSP(DIGITAL SIGNAL PROCESSING)功能:主要是通过一系列复杂的数学算法运算,对数字图像信号参数进行优化处理,并把处理后的信号通过USB等接口传到PC等设备。

    DSP结构框架:

      1. ISP(image signal processor)(镜像信号处理器)

      2. JPEG encoder(JPEG图像解码器)

      3. USB device controller(USB设备控制器)

    摄像头工作原理 - 零起点 - 我的博客

      摄像头的构成主要包括主控芯片、感光芯片、镜头和电源。好的电源也是保证摄像头工作的一个方面。

    摄像头镜头:五玻镜头是主流

      这个问题对于大多数人来说已经不算问题了,笔者提出来也只是仅对小白而言。简单的说镜头是由透镜组成,摄像头的镜头一般是由玻璃镜片或者塑料镜片组成的。玻璃镜头能获得比塑料镜头更清晰的影像。这是因为光线穿过普通玻璃镜片通常只有5%~9%的光损失,而塑料镜片的光损失高达11%~20%。有些镜头还采用了多层光学镀膜技术,有效减少了光的折射并过滤杂波,提高了通光率,从而获得更清晰影像。


      然而,现在很多小厂,为了节约成本、追求高利润,往往减少镜片的数量,或者使用廉价的塑料镜头。虽然这些产品在价格上便宜不少,看上去很有吸引力,但实际的成像效果却实在是令人无法恭维。现在市面上大多数摄像头采用的都是五玻镜头,但是不乏少数商家将塑料镜头说成五玻镜头的。因此消费者在选购一些杂牌摄像头时,一定要详细试用一下,谨防上当受骗。

      另外,镜头还有一个重要的参数那就是光圈,通过调整光圈可以控制通过镜头到达传感器的光线的多少,除了控制通光量,光圈还具有控制景深的功能,即光圈越大,则景深越小。

    摄像头感光器件:CCD一定比CMOS好吗?

      在选择摄像头时,镜头是很重要的。按感光器件类别来分,现在市场上摄像头使用的镜头大多为CCD和CMOS两种,其中CCD(Charge Coupled Device,电荷耦合组件)因为价格较高更多是应用在摄像、图象扫描方面的高端技术组件,CMOS(Complementary Metal-Oxide Semiconductor,附加金属氧化物半导体组件)则大多应用在一些低端视频产品中。

    摄像头工作原理 - 零起点 - 我的博客

      感光器件是摄像头主要的技术核心,它的原理基本上与DC、DV一致。对于CCD和CMOS两种镜头而言,不少人可能会因为CCD比较昂贵而认为用CCD的摄像头一定比用CMOS的摄像头好,其实这样的想法是不对的!这只不过是厂商的卖点罢了,事实上,二者各有优点:

      CCD的优点是灵敏度高,噪音小,信噪比大。但是生产工艺复杂、成本高、功耗高。

      CMOS的优点是集成度高、功耗低(不到CCD的1/3)、成本低。但是噪音比较大、灵敏度较低、对光源要求高。在相同像素下CCD的成像往往通透性、明锐度都很好,色彩还原、曝光可以保证基本准确。而CMOS的产品往往通透性一般,对实物的色彩还原能力偏弱,曝光也都不太好。

      目前,市场销售的数码摄像头中,基本是采用的CMOS的摄像头。在采用CMOS为感光元器件的产品中,通过采用影像光源自动增益补强技术,自动亮度、白平衡控制技术,色饱和度、对比度、边缘增强以及伽马矫正等先进的影像控制技术,完全可以达到与CCD摄像头相媲美的效果。受市场情况及市场发展等情况的限制,摄像头采用CCD图像传感器的厂商为数不多,主要原因是采用CCD图像传感器成本高的影响。

      所以,大家在购买摄像头时,不要盲目听信商家的介绍,使用COMS的摄像头并不比CCD的差,我们没必要过多的在这上面花功夫。

    摄像头芯片:进入免驱时代


      现在主流摄像头基本上都已采用了免驱的芯片,好的会采用中星微等知名厂家推出的免驱芯片;而一些劣质产品可能会采用一些劣质芯片以达到其低价的效果,虽然价格是低了,但是质量就难以得到保障了。

    摄像头像素:插值像素是骗子?

      摄像头像素值是区分一款摄像头好坏的重要因素,最早期的数码摄像头基本都是10万像素的产品,后来发展到了30万左右,现在市面主流产品已在100万像素以上,在这么大像素的支持下,摄像头拍照时可以拍取更大分辨率(如1024x768等)的照片,使摄像头拍照功能更加实用。


      “这是多少万像素的?”,相信绝大多数朋友选购摄像头时问得最多的一句话就是这个了。也正因为如此,有一些厂商和商家抓住消费者的这个心里,在摄像头像素这方面大做文章!

      面对这些人大吹摄像头像素如何如何高,画面如何如何清晰这种情况。你是否能保持冷静的头脑?你是否对像素与图像清晰度高低的关系有足够的认识呢?接下来笔者就像素和图像清晰度这个问题进行了分析。

      在摄像头参数里,像素到底扮演了怎么样的一个角色呢?是否像素越高图像就越清晰呢?其实并非如此,我们知道,影像传感器上有许多感光单元,每一个感光单元对应一个像素,像素越多,生成的图像也就越大。

      在市场上很多摄像头像素可能都是硬件本身只支持30万或者35万像素,而有的商家往往会说自己的产品可以插值达到130万或者500万等像素,这又是怎么一回事呢?30万像素的摄像头突然通过插值变成上百万像素的摄像头,是不是图像质量就上去了呢?

      其实,这些摄像头像素是通过软件插值提高的。举例的话,简单的说就是将640X480的图片拉大到1024X768,然后再利用软件计算图片分辨率点之间的色彩区别,把中间拉大的部分填入软件计算的颜色。这样做虽然输出的图片大了,但是图像的质量并没有得到真正有效的提高,甚至还有可能出现严重失真。

      所以,大家在选购摄像头时一定要牢记:摄像头像素的高低与图像的清晰度是没有绝对关系的。特别是对于那些通过软件插值而高达几百甚至几千万像素的摄像头来说,实际效果很有可能与几十万像素的差不多。总的来说,图像是否清晰,光看像素可是不行的,它还与镜头材质、软件处理等其它各方面息息相关。

    摄像头的一些技术指标

        1、 图像解析度/分辨率(Resolution):

      SXGA(1280 x1024)又称130万像素

      XGA(1024 x768)又称80万像素

      SVGA(800 x600)又称50万像素

      VGA(640x480)又称30万像素(35万是指648X488)

      CIF(352x288) 又称10万像素

      SIF/QVGA(320x240)

      QCIF(176x144)

      QSIF/QQVGA(160x120)

       2、图像格式(image Format/ Color space)

      RGB24,I420是目前最常用的两种图像格式。

      RGB24:表示R、G、B三种颜色各8bit,最多可表现256级浓淡,从而可以再现256*256*256种颜色。

      I420:YUV格式之一。

      其它格式有: RGB565,RGB444,YUV4:2:2等。

       3、自动白平衡调整(AWB)

      定义:要求在不同色温环境下,照白色的物体,屏幕中的图像应也是白色的。色温表示光谱成份,光的颜色。色温低表示长波光成分多。当色温改变时,光源中三基色(红、绿、蓝)的比例会发生变化,需要调节三基色的比例来达到彩色的平衡,这就是白平衡调节的实际。

       4、图像压缩方式

       JPEG:(joint photographic expert group)静态图像压缩方式。一种有损图像的压缩方式。压缩比越大,图像质量也就越差。当图像精度要求不高存储空间有限时,可以选择这种格式。目前大部分数码相机都使用JPEG格式。

       5、彩色深度(色彩位数)

      反映对色彩的识别能力和成像的色彩表现能力,实际就是A/D转换器的量化精度,是指将信号分成多少个等级。常用色彩位数(bit)表示。彩色深度越高,获得的影像色彩就越艳丽动人。

       6、图像噪音

      指的是图像中的杂点干挠。表现为图像中有固定的彩色杂点。

       7、视角

      与人的眼睛成像是相成原理,简单说就是成像范围。

    视频捕获速度

    摄像头工作原理 - 零起点 - 我的博客

      视频捕获能力是用户最为关心的功能之一,很多厂家都声称能达到30帧/秒的视频捕获能力,但实际使用时并不能尽如人意。视频捕获对电脑的要求比较高,如CPU的处理能力要足够的快等。其次对画面要求大小和清晰度的不同,捕获能力也不尽相同。对于很多厂商宣传的视频捕获速度,只是一种理论指标。用户应根据自己的切实需要,选择合适的产品以达到预期的效果。

      

    摄像头又称视频头。

    摄像头主要有镜头、CCD图像传感器、预中放、AGC、A/D、同步信号发生器、CCD驱动器、图像信号形成电路、D/A转换电路和电源的电路构成。摄像头的主要图像传感部件是CCD(Charge Coupled Device),即电荷耦合器件,它具有灵敏度高、畸变小、寿命长、抗震动、抗磁场、体积小、无残影等特点,CCD是电耦合器件(Charge Couple Device)的简称,它能够将光线变为电荷并可将电荷储存及转移,也可将储存之电荷取出使电压发生变化,因此是理想的摄像元件,是代替摄像管传感器的新型器件。

        摄像头的工作原理是:被摄物体反射光线,传播到镜头,经镜头聚焦到CCD芯片上,CCD根据光的强弱积聚相应的电荷,经周期性放电,产生表示一幅幅画面的电信号,经过预中放电路放大、AGC自动增益控制,于由图像处理芯片处理的是数字信号,所以经模数转换到图像数字信号处理IC(DSP)。同步信号发生器主要产生同步时钟信号(由晶体振荡电路来完成),即产生垂直和水平的扫描驱动信号,到图像处理IC。然后,经数模转换电路通过输出端子输出一个标准的复合视频信号。这个标准的视频信号同家用的录像机、VCD机、家用摄像机的视频输出是一样的,所以也可以录像或接到电视机上观看。图像数字信号处理主是有SONIX(松翰)和VIMICRO(中星微)等。

    图像传感器(SENSOR):是一种半导体芯片,其表面包含有几十万到几百万的光电二极管。光电二极管受到光照射时,就会产生电荷。目前市场上主流摄像头使用的感光元件主要是CCD和CMOS两种。它们的作用相当于传统相机中的底片。CCD的分辨率高,色彩还原逼真,已经成为百万像素级的数码摄影器材里的主角,但是其价格昂贵;与CCD相比,CMOS具有节能及成本低等特点。而且在百万像素内CMOS的感光效果完全可以和CCD媲美,因而摄像头几乎全都采用CMOS作为感光元件。目前市场上的摄像头产品采用的CMOS品牌较多,主要有MICRON,HYNIX, CISENSOR, TASC等等前四家的市场占有率接近100%。

    CCD可分为线阵CCD、三线CCD、面阵CCD和交织传输CCD。摄像头采用是面阵CCD图像传感器。CCD芯片就像人的视网膜,是摄像头的核心。目前我国尚无能力制造,市场上大部分摄像头采用的是日本SONY、SHARP、松下、LG等公司生产的芯片,现在韩国也有能力生产,但质量就要稍逊一筹。因为芯片生产时产生不同等级,各厂家获得途径不同等原因,造成CCD采集效果也大不相同。在购买时,可以采取如下方法检测:接通电源,连接视频电缆到监视器,关闭镜头光圈,看图像全黑时是否有亮点,屏幕上雪花大不大,这些是检测CCD芯片最简单直接的方法,而且不需要其它专用仪器。然后可以打开光圈,看一个静物,如果是彩色摄像头,最好摄取一个色彩鲜艳的物体,查看监视器上的图像是否偏色,扭曲,色彩或灰度是否平滑。好的CCD可以很好的还原景物的色彩,使物体看起来清晰自然;而残次品的图像就会有偏色现象,即使面对一张白纸,图像也会显示蓝色或红色。个别CCD由于生产车间的灰尘,CCD靶面上会有杂质,在一般情况下,杂质不会影响图像,但在弱光或显微摄像时,细小的灰尘也会造成不良的后果。摄像头的分类如下:

    1、依成像色彩划分 彩色摄像机:适用于景物细部辨别,如辨别衣着或景物的颜色。黑白摄像机:适用于光线不充足地区及夜间无法安装照明设备的地区,在仅监视景物的位置或移动时,可选用黑白摄像机。

       2、依分辨率灵敏度等划分 影像像素在38万以下的为一般型,其中尤以25万像素(512*492)、分辨率为400线的产品最普遍。 影像像素在38万以上的高分辨率型。

        3、按CCD靶面大小划分 CCD芯片已经开发出多种尺寸: 目前采用的芯片大多数为1/3"和1/4"。在购买摄像头时,特别是对摄像角度有比较严格要求的时候,CCD靶面的大小,CCD与镜头的配合情况将直接影响视场角的大小和图像的清晰度。1英寸--靶面尺寸为宽12.7mm*高9.6mm,对角线16mm。 2/3英寸--靶面尺寸为宽8.8mm*高6.6mm,对角线11mm。 1/2英寸--靶面尺寸为宽6.4mm*高4.8mm,对角线8mm。 1/3英寸--靶面尺寸为宽4.8mm*高3.6mm,对角线6mm。 1/4英寸--靶面尺寸为宽3.2mm*高2.4mm,对角线4mm。

        4、按扫描制式划分 PAL制。 NTSC制。 中国采用隔行扫描(PAL)制式(黑白为CCIR),标准为625行,50场,只有医疗或其它专业领域才用到一些非标准制式。另外,日本为NTSC制式,525行,60场(黑白为EIA)。

       5、按照度划分,CCD又分为:

           普通型 正常工作所需照度1~3LUX

           月光型 正常工作所需照度0.1LUX左右

           星光型 正常工作所需照度0.01LUX以下

           红外型 采用红外灯照明,在没有光线的情况下也可以成像

        6、按外观分:有机板型、针孔型、半球型。

           CCD彩色摄像头的主要技术指标

           (1)CCD尺寸,亦即摄像机靶面。原多为1/2英寸,现在1/3英寸的已

    普及化,1/4英寸和1/5英寸也已商品化。

           (2)CCD像素,是CCD的主要性能指标,它决定了显示图像的清晰程度,

    分辨率越高,图像细节的表现越好。CCD是由面阵感光元素组成,每一个元素称为像素,像素越多,图像越清晰。现在市场上大多以25万和38万像素为划界,38万像素以上者为高清晰度摄像机。

        (3)水平分辨率。彩色摄像机的典型分辨率是在320到500电视线之间,主要有330线、380线、420线、460线、500线等不同档次。 分辨率是用电视线(简称线TV LINES)来表示的,彩色摄像头的分辨率在330~500线之间。分辨率与CCD和镜头有关,还与摄像头电路通道的频带宽度直接相关,通常规律是1MHz的频带宽度相当于清晰度为80线。 频带越宽,图像越清晰,线数值相对越大。

        (4)最小照度,也称为灵敏度。是CCD对环境光线的敏感程度,或者说是CCD正常成像时所需要的最暗光线。照度的单位是勒克斯(LUX),数值越小,表示需要的光线越少,摄像头也越灵敏。月光级和星光级等高增感度摄像机可工作在很暗条件,2~3lux属一般照度,现在也有低于1lux的普通摄像机问世。

        (5)扫描制式。有PAL制和NTSC制之分。

        (6)信噪比。典型值为46db,若为50db,则图像有少量噪声,但图像质量良好;若为60db,则图像质量优良,不出现噪声。

        (7)视频输出。多为1Vp-p、75Ω。

        (8)镜头安装方式。有C和CS方式,二者间不同之处在于感光距离不同。

        (9)摄像头的像素:SXGA (1280 x1024)又称130万像素,XGA(1024 x768)又称80万像素,SVGA(800 x600)又称50万像素,VGA(640x480)又称30万像素(35万是指648X488),CIF(352x288) 又称10万像素,SIF/QVGA(320x240)。

    总结:总的来说,摄像头像素就如同现在的国足,基本上让人不可信。我们到处可以看到高达几百万像素的摄像头产品,但是用起来的时候就是觉得效果不怎么样。面对现在的摄像头市场,我们暂时无能为力。最后还是回到国足与摄像头上:国足,不可信,有时候却不得不看;摄像头像素,更不可信,有时候却又不得不买!总之,睁大自己的眼睛,认真理性选购才是目前最好的选择。摄像头工作原理

    展开全文
  • 摄像头 android

    千次阅读 2012-04-23 11:02:36
    Android框架包含了对多种摄像头和摄像特性的支持,应用程序可以进行图片和视频的捕获。本文讨论了一种快速、简便的捕获图像和视频的方法,并简述了一种更高级的可为用户创建自定义摄像功能的方法。 需要考虑的问题 ...

                                                                                                                                            转自

    译者署名: 呆呆大虾

    译者微博:http://weibo.com/popapa

    版本:Android 4.0 r1

     

     

     

    Android框架包含了对多种摄像头和摄像特性的支持,应用程序可以进行图片和视频的捕获。本文讨论了一种快速、简便的捕获图像和视频的方法,并简述了一种更高级的可为用户创建自定义摄像功能的方法。

    需要考虑的问题

    在让应用程序使用Android设备的摄像头之前,应该考虑一些期望如何使用此硬件的问题。

    ·       摄像头需求 —— 摄像头的使用对于应用程序是否确实如此重要,以至于在没有摄像头的设备上就不期望安装此应用了?如果确实如此,应该manifest中声明摄像头需求

    ·       快速拍照还是自定义摄像 —— 应用程序如何使用摄像头?仅仅是对快速拍照和视频片段感兴趣,还是要提供一种使用摄像头的新方式?对于快速拍照和摄像而言,可以考虑使用内置的摄像应用。为了开发一种定制的摄像头功能,请查看创建摄像应用一节。

    ·       存储 —— 应用程序产生的图像和视频是否期望仅对自身可见,还是可以共享——以便相册或其它媒体应用也能够使用?当应用程序被卸载后,还期望图像和视频可用么?请查看保存媒体文件一节来了解如何实现这些选项。

    概述

    通过CameraAPI 或摄像头意图Intent,Android框架为图像和视频捕获提供支持。下面列出了有关的类:

    Camera

    此类是控制摄像头的主要API。在创建摄像头应用程序时,此类用于拍摄照片或视频。

    SurfaceView

    此类用于向用户提供摄像头实时预览功能。

    MediaRecorder

    此类用于从摄像头录制视频。

    Intent

    动作类型为MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_VIDEO_CAPTURE的意图,可在不直接使用Camera对象的情况下捕获图像和视频。

    Manifest声明

    开始开发摄像头 API的应用之前,应该确保已经在manifest中正确声明了对摄像头的使用及其它相关的feature。

    ·       Camera权限——应用程序必须对请求摄像头的使用权限。

    <uses-permissionandroid:name="android.permission.CAMERA"/>

    注意:如果是通过意图来使用摄像头的,应用程序就不必请求本权限。

    ·       Camera Feature——应用程序必须同时声明对camera feature的使用,例如:

    <uses-featureandroid:name="android.hardware.camera"/>

    关于摄像头feature的清单,参阅manifest Feature参考

    在manifest中加入camera feature,将会使得Android Market在没有摄像头或不支持指定feature的设备上禁止安装该应用程序。关于Android Market基于feature过滤的使用详情,请参阅Android Market和基于Feature的过滤

    如果应用程序可能用到摄像头或摄像头feature,但却不是必需的,则应在manifest中指定包含android:required属性的feature,并将该属性设为false

    <uses-featureandroid:name="android.hardware.camera"android:required="false"/>

    ·       存储权限——如果应用程序要把图像或视频保存到设备的外部存储上(SD卡),则还必须在manifest中指定如下权限。

    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    ·       录音权限——要用音频捕获来录音,应用程序必须请求音频捕获权限。

    <uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>

    使用内置的摄像头应用程序

    有一种快捷的方法可以让应用程序不用额外编写很多代码就能实现拍照或摄像,这就是用意图Intent来调用内置的Android摄像头应用程序。摄像头意图(intent)会请求通过内置摄像应用来捕获图像或视频,并把控制权返回给应用程序。本节展示了如何用这种方法来捕获图像。

    通常按以下步骤来提交一个摄像头 intent:

    1. 构建一个摄像头 Intent —— 用以下意图类型之一,创建一个请求图像或视频的Intent

    o       MediaStore.ACTION_IMAGE_CAPTURE—— 向内置摄像头程序请求图像的意图活动类型。

    o       MediaStore.ACTION_VIDEO_CAPTURE—— 向内置摄像头程序请求视频的意图活动类型。

    2. 启动摄像头 Intent ——用startActivityForResult()方法执行摄像头 intent。启动完毕后摄像头应用的用户界面就会显示在屏幕上,用户就可以拍照或摄像了。

    3. 接收Intent结果—— 在应用程序中设置onActivityResult()方法,用于接收从摄像头 intent返回的数据。当用户拍摄完毕后(或者取消操作),系统会调用此方法。

    捕获图像的intent

    如果希望程序以最少的代码实现拍照功能,利用摄像头intent捕获图像是一条捷径。图像捕捉intent还可以包含以下附加信息:

    ·       MediaStore.EXTRA_OUTPUT——本设置需要一个Uri对象,用于指定存放图片的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置值,那么摄像应用将会把所请求的图片以默认文件名和路径进行保存,并将数据置入intent的Intent.getData()部分返回。

    以下例子演示了如何构建并执行一个图像捕获intent。此例中的getOutputMediaFileUri()方法引自保存媒体文件中的例程代码。.

    privatestaticfinalint CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE =100;

    privateUri fileUri;

    @Override

    publicvoid onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    // 创建拍照Intent并将控制权返回给调用的程序

    Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

    // 创建保存图片的文件

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // 设置图片文件名

    // 启动图像捕获Intent

        startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

    }

    startActivityForResult()方法执行完毕后,用户将看到内置摄像头应用程序的界面。用户拍照完毕(或取消操作)后,用户界面返回应用程序,这时必须截获onActivityResult()方法来接收intent的返回结果并执行后续操作。关于如何接收完整的intent,请参阅接收摄像头 Intent的结果

    捕获视频的intent

    如果希望程序以最少的代码实现摄像功能,利用摄像头 intent捕获视频是一条捷径。视频捕捉intent可以包含以下附带信息:

    ·       MediaStore.EXTRA_OUTPUT —— 本设置需要一个Uri用于指定保存视频的路径和文件名。本设置是可选项,但强烈建议使用。如果未指定本设置值,那么摄像应用将会把所请求的视频以默认文件名和路径进行保存,并将数据置入intent的Intent.getData()部分返回。

    ·       MediaStore.EXTRA_VIDEO_QUALITY ——本值用0表示最低品质及最小的文件尺寸,用1表示最高品质和较大的文件尺寸。

    ·       MediaStore.EXTRA_DURATION_LIMIT——本值用于限制所捕获视频的长度,以秒为单位。

    ·       MediaStore.EXTRA_SIZE_LIMIT—— 本值用于限制所捕获视频的文件尺寸,以字节为单位。

    以下例子演示了如何构建并执行一个视频捕获intent。本例中的getOutputMediaFileUri()方法引自保存媒体文件中的例程代码。

    privatestaticfinalint CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE =200;

    privateUri fileUri;

    @Override

    publicvoid onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

    // 创建新的Intent

    Intent intent =newIntent(MediaStore.ACTION_VIDEO_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);

    // 创建保存视频的文件

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

    // 设置视频文件名

    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,1);

    // 设置视频的品质为高

    // 启动视频捕获Intent

        startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);

    }

    startActivityForResult()方法执行完毕后,用户将看到一个改动过的摄像程序界面。用户摄像完毕(或取消操作)后,用户界面返回应用程序,这时必须监听onActivityResult()方法来接收intent的返回结果并执行后续操作。关于如何接收完整的intent,请参阅下一节。

    接收摄像头 intent的结果

    一旦已构建并运行了图像或视频的摄像头intent,应用程序就必须进行设置,以接收intent返回的结果。本节展示了如何监听摄像头intent的回调方法,以便应用程序对捕获到的图片及视频进行进一步的处理。

    要接收intent的返回结果,必须覆盖启动intent的activity中的onActivityResult()方法。以下例子演示了如何覆盖onActivityResult()来获取上述章节例程中的图像捕获intent视频捕获intent的结果。

    privatestaticfinalint CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE =100;

    privatestaticfinalint CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE =200;

    @Override

    protectedvoid onActivityResult(int requestCode,int resultCode,Intent data){

    if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){

    if(resultCode == RESULT_OK){

    // 捕获的图像保存到Intent指定的fileUri

    Toast.makeText(this,"Image saved to:\n"+

                         data.getData(),Toast.LENGTH_LONG).show();

    }elseif(resultCode == RESULT_CANCELED){

    // 用户取消了图像捕获

    }else{

    // 图像捕获失败,提示用户

    }

    }

    if(requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE){

    if(resultCode == RESULT_OK){

    // 捕获的视频保存到Intent指定的fileUri

    Toast.makeText(this,"Video saved to:\n"+

                         data.getData(),Toast.LENGTH_LONG).show();

    }elseif(resultCode == RESULT_CANCELED){

    // 用户取消了视频捕获

    }else{

    // 视频捕获失败,提示用户

    }

    }

    }

    一旦activity接收到成功的结果,就说明捕获到的图像或视频已保存到指定位置了,应用程序就可对其进行访问。

    创建摄像头应用程序

    有些开发人员可能需要自定义外观的摄像头用户界面,或者需要提供特殊的功能。相比使用intent而言,创建定制的摄像activity需要编写更多的代码,不过也能向用户提供更吸引人的使用感受。

    通常按照以下步骤创建一个定制的摄像界面:

    ·       检测并访问摄像头 —— 创建代码以检查摄像头存在与否并请求访问。

    ·       创建预览类 —— 创建继承自SurfaceView并实现SurfaceHolder接口的摄像预览类。此类能预览摄像的实时图像。

    ·       建立预览布局Preview Layout —— 一旦有了摄像预览类,即可创建一个view layout,用于把预览画面与设计好的用户界面控件融合在一起。

    ·       为捕获设置侦听器Listener —— 将用户界面控件连接到listener,使其能响应用户操作开始捕获图像或视频,比如按下按钮。

    ·       捕获并保存文件 —— 建立捕获图片或视频并保存到输出文件的代码。

    ·       释放摄像头 —— 摄像头使用完毕后,应用程序必须正确地将其释放,便于其它程序的使用。

    摄像头硬件是一个共享资源,必须对其进行细心的管理,因此需要使用它的应用程序之间不能发生冲突。下一节将会讨论如何检测摄像头硬件、如何请求访问摄像头、使用完毕如何释放。

    警告:应用程序用完摄像头后,请记得调用Camera.release()释放Camera对象!如果某应用程序未能正确释放摄像头,所有后续访问摄像头的尝试(包括此应用程序自身)都将会失败,并可能导致程序被强行关闭。

    检测摄像头硬件

    如果应用程序未利用manifest声明对摄像头需求进行特别指明,则应该在运行时检查一下摄像头是否可用。可用PackageManager.hasSystemFeature()方法来进行这种检查,代码示例如下:

    /** 检查设备是否提供摄像头 */

    privateboolean checkCameraHardware(Context context){

    if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){

    // 摄像头存在

    returntrue;

    }else{

    // 摄像头不存在

    returnfalse;

    }

    }

    Android设备可能拥有多个摄像头,比如向后的摄像头用于拍照、向前的摄像头用于摄像。Android 2.3 (API Level 9) 以上版本允许利用Camera.getNumberOfCameras()方法来检查设备可用摄像头的数量。

    访问摄像头

    如果在运行程序的设备上已经检测到了摄像头,则必须通过获取一个Camera的实例来请求对其访问(除非使用了用于访问摄像头的intent)。

    可用Camera.open()方法来访问主摄像头,并确保捕获全部的异常,示例代码如下:

    /** 安全获取Camera对象实例的方法*/

    publicstaticCamera getCameraInstance(){

    Camera c =null;

    try{

            c =Camera.open();// 试图获取Camera实例

    }

    catch(Exception e){

    // 摄像头不可用(正被占用或不存在)

    }

    return c;// 不可用则返回null

    }

    警告:每次使用Camera.open()时都要检查异常。如果摄像头被占用或者不存在,未检查异常将会导致应用程序被系统强行关闭。

    在运行Android 2.3 (API Level 9) 以上版本的设备上,可以用Camera.open(int)访问指定的摄像头。在拥有多于一个摄像头的设备上,以上示例代码将会访问第一个也即朝后的那个摄像头。

    检查摄像头feature

    一旦获得了摄像头的访问权,就可以通过Camera.getParameters()方法来获取更多信息,检查返回的Camera.Parameters对象可查看摄像头所支持的feature。如果正在使用API Level 9以上版本,可用Camera.getCameraInfo()来确定摄像头朝前还是朝后以及图像的方向。

    创建预览类

    为了方便拍照或摄像,用户必须能看到摄像头所拍摄的画面。摄像头预览类就是一种能够显示摄像头实时数据的SurfaceView,用户可以调整并捕获图片和视频。

    以下示例代码演示了如何创建一个基本的摄像头预览类,它可被嵌入一个View布局中。为了捕捉view创建和销毁时的回调事件,此类实现了SurfaceHolder.Callback,这在指定摄像头预览的输入时需要用到。

    /** 基本的摄像头预览类 */

    publicclassCameraPreviewextendsSurfaceViewimplementsSurfaceHolder.Callback{

    privateSurfaceHolder mHolder;

    privateCamera mCamera;

    publicCameraPreview(Context context,Camera camera){

    super(context);

            mCamera = camera;

    // 安装一个SurfaceHolder.Callback

    // 这样创建和销毁底层surface时能够获得通知。

            mHolder = getHolder();

            mHolder.addCallback(this);

    // 已过期的设置,但版本低于3.0Android还需要

            mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

    }

    publicvoid surfaceCreated(SurfaceHolder holder){

    // surface已被创建,现在把预览画面的位置通知摄像头

    try{

                mCamera.setPreviewDisplay(holder);

                mCamera.startPreview();

    }catch(IOException e){

    Log.d(TAG,"Error setting camera preview: "+ e.getMessage());

    }

    }

    publicvoid surfaceDestroyed(SurfaceHolder holder){

    // 空代码。注意在activity中释放摄像头预览对象}

    publicvoid surfaceChanged(SurfaceHolder holder,int format,int w,int h){

    // 如果预览无法更改或旋转,注意此处的事件

    // 确保在缩放或重排时停止预览

    if(mHolder.getSurface()==null){

    // 预览surface不存在

    return;

    }

    // 更改时停止预览

    try{

                mCamera.stopPreview();

    }catch(Exception e){

    // 忽略:试图停止不存在的预览

    }

    // 在此进行缩放、旋转和重新组织格式

    // 以新的设置启动预览

    try{

                mCamera.setPreviewDisplay(mHolder);

                mCamera.startPreview();

    }catch(Exception e){

    Log.d(TAG,"Error starting camera preview: "+ e.getMessage());

    }

    }

    }

    将预览画面置入layout

    上节例程所述的摄像预览类必须被放入一个activity的layout中,连同其它用户界面控件一起,实现拍照或摄像功能。本节展示了如何为预览创建一个简单的layout和activity。

    以下layout代码提供了一个非常简单的view,用于显示一个摄像预览画面。在此例中,FrameLayout元素用于容纳摄像预览类。利用此类layout,可以把附加的图片信息或控件叠加到实时预览画面上。

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

    <FrameLayout

    android:id="@+id/camera_preview"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:layout_weight="1"

    />

    <Button

    android:id="@+id/button_capture"

    android:text="Capture"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center"

    />

    </LinearLayout>

    在大多数设备上,缺省的摄像预览方向是横向的。此例中的layout指定了横向(landscape)布局,下面的代码还把应用程序的方向也改为了横向。为了简化摄像预览画面的刷新,应该在manifest中增加如下内容,把应用程序的预览activity也改为横向显示。

    <activityandroid:name=".CameraActivity"

    android:label="@string/app_name"

    android:screenOrientation="landscape">

    <!-- configure this activity to use landscape orientation -->

    <intent-filter>

    <actionandroid:name="android.intent.action.MAIN"/>

    <categoryandroid:name="android.intent.category.LAUNCHER"/>

    </intent-filter>

    </activity>

    注意: 摄像预览画面并不是一定要横向显示。自Android 2.2 (API Level 8) 开始,可以利用setDisplayOrientation()方法来旋转预览画面。为了让预览方向跟随手机方向的变化而改变,可以在预览类的surfaceChanged()方法中实现,先用Camera.stopPreview()停止预览,改变方向后再用Camera.startPreview()开启预览。

    在摄像view 的activity中,请把预览类添加到上述的FrameLayout元素中。当摄像头暂停使用或者关闭时,摄像activity还必须确保将其释放。以下例子展示了如何修改摄像activity,加入创建预览类所述的预览类。

    publicclassCameraActivityextendsActivity{

    privateCamera mCamera;

    privateCameraPreview mPreview;

    @Override

    publicvoid onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);

            setContentView(R.layout.main);

    // 创建Camera实例

            mCamera = getCameraInstance();

    // 创建Preview view并将其设为activity中的内容

            mPreview =newCameraPreview(this, mCamera);

    FrameLayout preview =(FrameLayout) findViewById(id.camera_preview);

            preview.addView(mPreview);

    }

    }

    注意:上例中的getCameraInstance()方法引用了访问摄像头中的方法示例。

    捕获图像

    一旦创建了预览类和显示它的view layout,就可以开始在程序中捕获图片了。必须在程序代码中为用户界面控件设置listener,使其可响应用户操作进行拍照。

    可以通过Camera.takePicture()方法来获取图片,此方法用到三个参数并从摄像头接收数据。如果要以JPEG的格式接收数据,必须实现Camera.PictureCallback接口,以接收图片数据并写入文件。以下代码展示了Camera.PictureCallback接口的简单例子,实现了从摄像头接收图片并保存。

    privatePictureCallback mPicture =newPictureCallback(){

    @Override

    publicvoid onPictureTaken(byte[] data,Camera camera){

    File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);

    if(pictureFile ==null){

    Log.d(TAG,"Error creating media file, check storage permissions: "+

                    e.getMessage());

    return;

    }

    try{

    FileOutputStream fos =newFileOutputStream(pictureFile);

                fos.write(data);

                fos.close();

    }catch(FileNotFoundException e){

    Log.d(TAG,"File not found: "+ e.getMessage());

    }catch(IOException e){

    Log.d(TAG,"Error accessing file: "+ e.getMessage());

    }

    }

    };

    通过调用Camera.takePicture()方法,触发器捕获了一张图片。 以下例程展示了如何在按钮View.OnClickListener的中调用此方法。

    // Capture按钮中加入listener

    Button captureButton =(Button) findViewById(id.button_capture);

        captureButton.setOnClickListener(

    newView.OnClickListener(){

    @Override

    publicvoid onClick(View v){

    // 从摄像头获取图片

                mCamera.takePicture(null,null, mPicture);

    }

    }

    );

    注意:下文例程中的mPicture成员将会引用上述代码。

    警告:当应用程序使用完摄像头之后,请记得调用Camera.release()释放Camera对象! 关于如何释放摄像头的详情,请参阅释放摄像头

    捕获视频

    Android框架的视频捕捉需要对Camera对象进行仔细的管理,还要与MediaRecorder类一起协同工作。使用Camera录制视频时,必须管理好Camera.lock()Camera.unlock()的调用,使得MediaRecorder能够顺利访问摄像头硬件,并且还要进行Camera.open()Camera.release()调用。

    注意:自Android 4.0 (API level 14) 开始,Camera.lock()Camera.unlock()调用由系统自动管理。

    与用摄像头拍照不同,视频捕获必需十分精确地按顺序进行调用。必须按照特定的顺序来执行,应用程序才能成功地准备并捕获视频,详细步骤如下。

    1.       打开摄像头 —— Camera.open()来获得一个camera对象的实例。

    2.       连接预览 —— 用Camera.setPreviewDisplay()将camera连接到一个SurfaceView,准备实时预览。

    3.       开始预览 —— 调用Camera.startPreview()开始显示实时摄像画面。

    4.       开始录制视频 —— 严格按照以下顺序执行才能成功录制视频:

    a.        解锁Camera —— 调用Camera.unlock()解锁,便于MediaRecorder使用摄像头。

    b.        配置MediaRecorder —— 按照如下顺序调用MediaRecorder中的方法。详情请参阅MediaRecorder参考文档。

    1.   setCamera() —— 用当前Camera实例将摄像头用途设置为视频捕捉。

    2.   setAudioSource() —— MediaRecorder.AudioSource.CAMCORDER设置音频源。

    3.   setVideoSource() —— MediaRecorder.VideoSource.CAMERA设置视频源。

    4.   设置视频输出格式和编码格式。于Android 2.2 (API Level 8) 以上版本使用MediaRecorder.setProfile方法,并用CamcorderProfile.get()来获取一个profile实例。对于Android prior to 2.2以上版本,必须设置视频输出格式和编码参数:

    i.       setOutputFormat()—— 设置输出格式,指定缺省设置或MediaRecorder.OutputFormat.MPEG_4

    ii.      setAudioEncoder()—— 设置声音编码类型。指定缺省设置或MediaRecorder.AudioEncoder.AMR_NB

    iii.     setVideoEncoder()—— 设置视频编码类型,指定缺省设置或者MediaRecorder.VideoEncoder.MPEG_4_SP

    5.   setOutputFile()—— 用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()设置输出文件,见保存媒体文件一节中的方法示例。

    6.   setPreviewDisplay() —— 用上面连接预览中设置的对象来指定应用程序的SurfaceView预览layout元素。

    警告:必须按照如下顺序调用MediaRecorder的下列配置方法,否则应用程序将会引发错误,录像也将失败。

    c.        准备MediaRecorder —— 调用MediaRecorder.prepare()设置配置,准备好MediaRecorder

    d.        启动MediaRecorder —— 调用MediaRecorder.start()开始录制视频。

    5.       停止录制视频 ——按照顺序调用以下方法,才能成功完成视频录制:

    a.        停止MediaRecorder —— 调用MediaRecorder.stop()停止录制视频。

    b.        重置MediaRecorder —— 这是可选步骤,调用MediaRecorder.reset()除recorder中的配置信息。

    c.        释放MediaRecorder —— 调用MediaRecorder.release()释放MediaRecorder

    d.        锁定摄像头 —— Camera.lock()锁定摄像头,使得以后MediaRecordersession能够使用它。自Android 4.0 (API level 14)开始,不再需要本调用了,除非MediaRecorder.prepare()调用失败。

    6.       停止预览 ——activity使用完摄像头后,应用Camera.stopPreview()止预览。

    7.       释放摄像头 —— 使用Camera.release()放摄像头,使其它应用程序可以使用它。

    注意:也可以不必先创建摄像头预览就使用MediaRecorder并跳过本节开始的几步。不过,因为用户一般都希望在开始录像前看到预览画面,这里就不讨论那类过程了。

    配置MediaRecorder

    在使用MediaRecorder类进行录像时,必须先按照特定顺序进行配置,然后调用MediaRecorder.prepare()方法检查并执行这些配置。以下例程演示了如何为录像正确配置并准备MediaRecorder类。

    privateboolean prepareVideoRecorder(){

        mCamera = getCameraInstance();

        mMediaRecorder =newMediaRecorder();

    // 1步:解锁并将摄像头指向MediaRecorder

        mCamera.unlock();

        mMediaRecorder.setCamera(mCamera);

    // 2步:指定源

        mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);

        mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // 3步:指定CamcorderProfile(需要API Level 8以上版本)

        mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    // 4步:指定输出文件

        mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // 5步:指定预览输出

        mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // 6步:根据以上配置准备MediaRecorder

    try{

            mMediaRecorder.prepare();

    }catch(IllegalStateException e){

    Log.d(TAG,"IllegalStateException preparing MediaRecorder: "+ e.getMessage());

            releaseMediaRecorder();

    returnfalse;

    }catch(IOException e){

    Log.d(TAG,"IOException preparing MediaRecorder: "+ e.getMessage());

            releaseMediaRecorder();

    returnfalse;

    }

    returntrue;

    }

    如果是Android 2.2 (API Level 8) 之前的版本,则必须直接指定输出格式和编码格式,而不是使用CamcorderProfile以下代码演示了这种方式:

    // 3步:设置输出格式和编码格式(针对低于API Level 8版本)

        mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

        mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

    MediaRecorder中以下有关视频录制的参数都给出了缺省值,当然也可以在应用程序中修改这些设置:

    ·       setVideoEncodingBitRate()

    ·       setVideoSize()

    ·       setVideoFrameRate()

    ·       setAudioEncodingBitRate()

    ·       setAudioChannels()

    ·       setAudioSamplingRate()

    开始和停止MediaRecorder

    使用MediaRecorder类开始和停止视频录制时,必须遵循以下特定顺序。

    1.     用Camera.unlock()解锁摄像头

    2.     上代码所示配置MediaRecorder

    3.     MediaRecorder.start()开始录制

    4.     记录视频

    5.     MediaRecorder.stop()停止录制

    6.     用MediaRecorder.release()释放media recorder

    7.     Camera.lock()锁定摄像头

    以下例程演示了如何触发按钮并用camera和MediaRecorder类正确地开始和停止视频录制。

    注意:视频录制完毕后请不要释放camera,否则预览将会停止。

    privateboolean isRecording =false;

    // Capture按钮加入listener

    Button captureButton =(Button) findViewById(id.button_capture);

    captureButton.setOnClickListener(

    newView.OnClickListener(){

    @Override

    publicvoid onClick(View v){

    if(isRecording){

    // 停止录像并释放camera

                    mMediaRecorder.stop();// 停止录像

                    releaseMediaRecorder();// 释放MediaRecorder对象

                    mCamera.lock();// 将控制权从MediaRecorder交回camera

    // 通知用户录像已停止

                    setCaptureButtonText("Capture");

                    isRecording =false;

    }else{

    // 初始化视频camera

    if(prepareVideoRecorder()){

    // Camera已可用并解锁,MediaRecorder已就绪,

    // 现在可以开始录像

                        mMediaRecorder.start();

    // 通知用户录像已开始

                        setCaptureButtonText("Stop");

                        isRecording =true;

    }else{

    // 准备未能完成,释放camera

                        releaseMediaRecorder();

    // 通知用户

    }

    }

    }

    }

    );

    注意:在上例中,prepareVideoRecorder()方法引用了配置MediaRecorder中的示例代码。此方法实现了锁定camera、配置和准备MediaRecorder实例。

    释放摄像头

    摄像头是设备上所有应用程序共享使用的资源。应用程序可以在获得Camera实例后使用摄像头,停止使用后请务必注意释放摄像头对象,应用程序暂停时Activity.onPause())也是如此。如果某应用程序未能正确地释放摄像头,则所有后续访问摄像头的尝试(包括该应用程序自身)都将会失败,并可能导致应用程序被强行关闭。

    Camera.release()方法可以释放Camera对象的实例,代码示例如下。

    publicclassCameraActivityextendsActivity{

    privateCamera mCamera;

    privateSurfaceView mPreview;

    privateMediaRecorder mMediaRecorder;

    ...

    @Override

    protectedvoid onPause(){

    super.onPause();

            releaseMediaRecorder();// 如果正在使用MediaRecorder,首先需要释放它。

            releaseCamera();// 在暂停事件中立即释放摄像头

    }

    privatevoid releaseMediaRecorder(){

    if(mMediaRecorder !=null){

                mMediaRecorder.reset();// 清除recorder配置

                mMediaRecorder.release();// 释放recorder对象

                mMediaRecorder =null;

                mCamera.lock();// 为后续使用锁定摄像头

    }

    }

    privatevoid releaseCamera(){

    if(mCamera !=null){

                mCamera.release();// 为其它应用释放摄像头

                mCamera =null;

    }

    }

    }

    警告:如果某应用程序未能正确释放摄像头,所有后续访问摄像头的尝试(包括该应用程序自身)都将会失败,并可能会导致应用程序被强行关闭。

    保存媒体文件

    诸如图片和视频这些由用户创建的媒体文件,应该保存到设备外部存储的目录中(SD卡)去,以节省系统空间,并使用户离开设备时也能访问这些文件。设备上有很多可用于存储媒体文件的目录,但作为开发人员只应考虑两个标准的位置:

    ·       Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)—— 本方法返回标准的、共享的、系统建议的存放位置,用于存放图片和视频文件。本目录是共享的(public),因此其它应用程序可以很容易地查找、读取、修改、删除存于此处的文件。即使应用程序被用户卸载,存于此处的媒体文件也不会被删除。为了避免与已有的图片和视频相冲突,应该在此目录下为自己的媒体文件创建一个子目录,如下代码所示。本方法自Android 2.2 (API Level 8) 起启用,更早API版本的也有类似的调用,请参阅保存共享文件

    ·       Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) —— 本方法返回一个标准的、用于存放图片和视频的位置,该存放位置与应用程序相关联。如果应用程序被卸载,则存于此处的文件将会被删除。对存于此处的文件不会增加访问权限控制,其它应用程序也可以读取、修改、删除文件。

    以下例程演示了如何为媒体文件创建一个FileUri存放位置,通过Intent调用摄像头时可以使用该文件,创建摄像应用时也可以使用它。

    publicstaticfinalint MEDIA_TYPE_IMAGE =1;

    publicstaticfinalint MEDIA_TYPE_VIDEO =2;

    /** 为保存图片或视频创建文件Uri */

    privatestaticUri getOutputMediaFileUri(int type){

    returnUri.fromFile(getOutputMediaFile(type));

    }

    /** 为保存图片或视频创建File */

    privatestaticUri getOutputMediaFile(int type){

    // 安全起见,在使用前应该

    // Environment.getExternalStorageState()检查SD卡是否已装入

    File mediaStorageDir =newFile(Environment.getExternalStoragePublicDirectory(

    Environment.DIRECTORY_PICTURES),"MyCameraApp");

    // 如果期望图片在应用程序卸载后还存在、且能被其它应用程序共享,

    // 则此保存位置最合适

    // 如果不存在的话,则创建存储目录

    if(! mediaStorageDir.exists()){

    if(! mediaStorageDir.mkdirs()){

    Log.d("MyCameraApp","failed to create directory");

    returnnull;

    }

    }

    // 创建媒体文件名

    String timeStamp =newSimpleDateFormat("yyyyMMdd_HHmmss").format(newDate());

    File mediaFile;

    if(type == MEDIA_TYPE_IMAGE){

            mediaFile =newFile(mediaStorageDir.getPath()+File.separator +

    "IMG_"+ timeStamp +".jpg");

    }elseif(type == MEDIA_TYPE_VIDEO){

            mediaFile =newFile(mediaStorageDir.getPath()+File.separator +

    "VID_"+ timeStamp +".mp4");

    }else{

    returnnull;

    }

    return mediaFile;

    }

    注意:Environment.getExternalStoragePublicDirectory()自Android 2.2 (API Level 8) 版本启用。如果目标设备使用较早期版本的Android,请用Environment.getExternalStorageDirectory()代替。详情请参阅保存共享文件

    关于在Android设备上保存文件的详细信息,请参阅数据存储

    展开全文
  • 摄像头的工作原理

    千次阅读 2015-05-26 20:55:10
     摄像头主要有镜头、CCD图像传感器、预中放、AGC、A/D、同步信号发生器、CCD驱动器、图像信号...摄像头的主要图像传感部件是CCD(Charge Coupled Device),即电荷耦合器件,它具有灵敏度高、畸变小、寿命长、抗
  • 打开摄像头,读入个人录像 22 CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); 23 // 定义IplImage的指针并且初始化。 24 IplImage * getfile = cvQueryFrame(capture); 25 // 命名窗口 ...
  • 摄像头硬件组成模块

    2020-05-22 06:50:41
    摄像头硬件组成模块 一.概述 摄像头可分为数字摄像头和模拟摄像头两大类。数字摄像头可以将视频采集设备产生的模拟视频信号转换成数字信号,进而将其储存在计算机里。模拟摄像头捕捉到的视频信号必须经过特定的视频...
  • Android 摄像头的使用

    千次阅读 2013-10-14 14:30:18
     本章内容为Android开发者指南的 Framework Topics/Multimedia and Camera/Camera章节,译为"摄像头",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆...
  • 基于ONVIF协议的摄像头开发总结

    万次阅读 2019-04-28 20:24:57
    原文: ... 最近在做onvif协议的相关工作,看到一篇介绍onvif协议很好的文章,遂转载过来,以作记录 在查阅资料的时候,又找到...通过将WSDL文件解析序列化为C/C++文件,最小化了Web Service的开发过程。  
  • Android 摄像头开发

    千次阅读 2016-09-28 11:19:57
    原网址:... 前言  本章内容为Android开发者指南的 Framework Topics/Multimedia and Camera/Camera章节,译为"摄像头",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://
  • kinect2.0 之摄像头

    千次阅读 2014-12-25 11:10:37
    kinect2.0 摄像头研究学习
  • Android开发者指南-摄像头-Camera

    千次阅读 2014-10-21 16:31:58
     本章内容为Android开发者指南的 Framework Topics/Multimedia and Camera/Camera章节,译为"摄像头",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆...
  • 5、树莓派连接官方CSI摄像头的使用

    万次阅读 多人点赞 2018-05-24 14:07:35
    定义摄像头初始状态为暂停或立即开始录像。选项可以为“record”(录像)或“pause”(暂停)。注意,如果您设置的超时时长很短,而且初始状态设置为“暂停”,那么将不会录制任何输出的内容。 –segment, -sg 将...
  • 摄像头介绍,比较

    千次阅读 2005-07-21 09:40:00
    一、摄像头简介 摄像头(CAMERA)又称为电脑相机、电脑眼等,它作为一种视频输入设备,在过去被广泛的运用于视频会议、远程医疗及实时监控等方面。近年以来,随着互联网技术的发展,网络速度的不断提高,再加上感光...
  • 监控摄像头参数详细介绍

    千次阅读 2018-06-28 15:21:16
    假设用1/3”CCD摄像头观测,被测物体宽500毫米,高400毫米,镜头焦点距物体5000毫米。由公式可以算出:焦距f=4.8×5000/500≈48毫米或焦距f=3.6×5000/400≈45毫米。 3 三、如何在光照条件很差的环境...
  • 启用选项是为了确保重启后 GPU 固件能够正确运行(包括摄像头驱动和调节电路),并且 GPU 从主内存划分到了足够的内存使摄像头能够正确运行。 图2 测试系统已经完成安装并正常工作,可尝试以下命令: $raspistill -v...
  • 摄像头-Camera(2)

    2014-05-15 15:30:46
     本章内容为Android开发者指南的 Framework Topics/Multimedia and Camera/Camera章节,译为"摄像头",版本为Android 4.0 r1,翻译来自:"呆呆大虾",欢迎访问他的微博:"http://weibo.com/popapa",再次感谢"呆呆...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 484
精华内容 193
关键字:

录像头摄像头最小的