多媒体系统之Camera与手机屏幕采集(一)

【Camera相机开发】实现开启相机 上一篇文章:Android: Camera相机开发知识点介绍了进行Camera开发需要了解的知识点 本篇文章会带着小伙伴们实现自己的Camera,并在实现的过程中验证上一篇中所讲解的结论 实现思路: 在xml布局中定义一个SurfaceView,用于预览相机采集的数据 给SurfaceHolder添加回调,在surfaceCreated(holder: SurfaceHolder?)回调中打开相... 阅读详情

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

  • 本篇文章主要给大家讲解进行Camera开发需要用到的类和方法,以及在开发过程中遇到的方向问题的分析

进行Camra开发主要用到了以下两个类:

  1. Camera
  2. SurfaceView (当然也可以是TextureView,本文我们使用SurfaceView)

这两者的关系如下图:

9551499-7986f45742f973c1.png

一、 SurfaceView 、Surface 、 SurfaceHolder

关系图

9551499-f591127bf3163c6a.jpg

Surface

什么是Surface?源码中是这样描述的:


 * Handle onto a raw buffer that is being managed by the screen compositor.
 *
 * <p>A Surface is generally created by or from a consumer of image buffers (such as a
 * {@link android.graphics.SurfaceTexture}, {@link android.media.MediaRecorder}, or
 * {@link android.renderscript.Allocation}), and is handed to some kind of producer (such as
 * {@link android.opengl.EGL14#eglCreateWindowSurface(android.opengl.EGLDisplay,android.opengl.EGLConfig,java.lang.Object,int[],int) OpenGL},
 * {@link android.media.MediaPlayer#setSurface MediaPlayer}, or
 * {@link android.hardware.camera2.CameraDevice#createCaptureSession CameraDevice}) to draw
 * into.</p>

简单翻译一下,大概意思就是:

Surfaces是用来处理屏幕显示内容合成器所管理的原始缓存区的工具。它通常由图像缓冲区的消费者来创建(如:SurfaceTexture,MediaRecorder),然后被移交给生产者(如:MediaPlayer)或者是显示到其上(如:CameraDevice)

SurfaceHolder

源码描述:

 * Abstract interface to someone holding a display surface.  Allows you to
 * control the surface size and format, edit the pixels in the surface, and
 * monitor changes to the surface.  This interface is typically available
 * through the {@link SurfaceView} class.

简单翻译一下:

一个抽象接口,给持有surface的对象使用。它可以控制surface的大小和格式,编辑surface中的像素,以及监听surface的变化。这个接口通常通过SurfaceView类获得

SurfaceHolder中有一个Callbcak接口,它有3个回调方法

  • surfaceCreated(SurfaceHolder holder)
    surface第一次创建时回调

  • surfaceChanged(SurfaceHolder holder, int format, int width,
    int height)
    surface变化的时候回调(格式/大小)

  • surfaceDestroyed(SurfaceHolder holder)
    surface销毁的时候回调

这个回调接口就是源码中所提到的 “monitor changes to the surface”(监听surface的变化),我们后面会用到

SurfaceView

源码描述:

 * Provides a dedicated drawing surface embedded inside of a view hierarchy.
 * You can control the format of this surface and, if you like, its size; the
 * SurfaceView takes care of placing the surface at the correct location on the
 * screen

大致翻译一下:

SurfaceView提供了嵌入视图层级中的专用surface。你可以控制surface的格式或大小。SurfaceView负责把surface显示在屏幕的正确位置

SurfaceView继承自View,其中有两个成员变量,一个是Surface对象,一个是SuraceHolder对象。(请参考上面第二幅关系图)

  • SurfaceView把Surface显示在屏幕上
  • SurfaceView通过SuraceHolder告诉我们Surface的状态(创建、变化、销毁)
  • 通过getHolder()方法获得当前SurfaceView的SuraceHolder对象,然后就可以对SuraceHolder对象添加回调来监听Surface的状态

SurfaceView小结

  1. SurfaceView是一个view对象,用于在屏幕上显示相机的预览画面
  2. SurfaceView中有两个对象,Surface和SuraceHolder。 我们通过SuraceHolder中的回调可以知道Surface的状态(创建、变化、销毁)
  3. 通过getHolder()方法获得当前SurfaceView的SuraceHolder对象

二、Camera

概览图

Camera类中主要的内部类和接口,如下图:

9551499-f07cd9b2c81f0da5.jpg

Camera类中有很多内部类和方法,下面分别对这些类和方法做介绍:

Camera类中的内部类

CameraInfo

CameraInfo类用来描述相机信息,通过Camera类中getCameraInfo(int cameraId, CameraInfo cameraInfo)方法获得,主要包括以下两个成员变量:

  • facing
    facing 代表相机的方向,它的值只能是CAMERA_FACING_BACK(后置摄像头) 或者CAMERA_FACING_FRONT(前置摄像头)。

CAMERA_FACING_BACK 和 CAMERA_FACING_FRONT 是CameraInfo类中的静态变量

  • orientation
    这个就比较有意思了,也比较重要,源码中是这样描述的:
         * <p>The orientation of the camera image. The value is the angle that the
         * camera image needs to be rotated clockwise so it shows correctly on
         * the display in its natural orientation. It should be 0, 90, 180, or 270.</p>
         *
         * <p>For example, suppose a device has a naturally tall screen. The
         * back-facing camera sensor is mounted in landscape. You are looking at
         * the screen. If the top side of the camera sensor is aligned with the
         * right edge of the screen in natural orientation, the value should be
         * 90. If the top side of a front-facing camera sensor is aligned with
         * the right of the screen, the value should be 270.</p>

翻译一下,大概意思是:

orientation是相机采集图片的角度。这个值是相机所采集的图片需要顺时针旋转至自然方向的角度值。它必须是0,90,180或270中的一个。
举个栗子:
假如你自然地竖着拿着手机(就是自拍时候的样子...),后置摄像头的传感器在手机里是水平方向的,你现在看着手机,如果传感器的顶部在自然方向上手机屏幕的右边(此时,手机是竖屏,传感器是横屏),那么这个orientation的值就是90。 如果前置摄像头的传感器顶部在手机屏幕右边,那么这个值就是270.

  • setDisplayOrientation
    源码描述如下:
     * Set the clockwise rotation of preview display in degrees. This affects
     * the preview frames and the picture displayed after snapshot. This method
     * is useful for portrait mode applications. Note that preview display of
     * front-facing cameras is flipped horizontally before the rotation, that
     * is, the image is reflected along the central vertical axis of the camera
     * sensor. So the users can see themselves as looking into a mirror.

翻译一下:

设置预览画面顺时针旋转的角度。这个方法会影响预览图像和拍照后显示的照片。这个方法对竖屏应用非常有用。
注意,前置摄像头在进行角度旋转之前,图像会进行一个水平的镜像翻转。
所以用户在看预览图像的时候就像照镜子,看到的是现实的水平方向的镜像。

注:setDisplayOrientation(int degrees)是Camea类中的一个方法,之所以穿插在这里来讲,是为了和上面提到的orientation做一个统一讲解,因为这两个都涉及到了方向问题

看了上面的介绍是不是有点懵逼。。。没关系,下面给小伙伴们详细介绍一下Android手机上几个方向的概念以及在使用Camera过程中会遇到的方向问题:

注:如果你是第一次使用Camera的话,首先要了解以下几点:

  1. 相机图像数据都是来自于相机硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向,且不会改变
  2. 相机在预览的时候是有一个预览方向的,可以通过setDisplayOrientation()设置
  3. 相机所采集的照片也是有一个方向的(就是上面刚刚提到的orientation),这个方向与预览时的方向互不相干
  • 屏幕坐标: 在Android系统中,屏幕的左上角是坐标系统的原点(0,0)坐标。原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向

  • 自然方向:每个设备都有一个自然方向,手机和平板的自然方向不同。手机的自然方向是portrait(竖屏),平板的自然方向是landscape(横屏)

  • 图像传感器(Image Sensor)方向:手机相机的图像数据都是来自于摄像头硬件的图像传感器,这个传感器在被固定到手机上后有一个默认的取景方向

9551499-8660a7db6b17bff8.png
  • 相机的预览方向:将图像传感器捕获的图像,显示在屏幕上的方向。在默认情况下,与图像传感器方向一致。在相机API中可以通过setDisplayOrientation()设置相机预览方向。在默认情况下,这个值为0,与图像传感器方向一致
9551499-cceb092a84f9a454.png
  • 相机采集的图像方向
    相机采集图像后需要进行顺时针旋转的角度,即上面介绍的orientation的值:
9551499-240a57598048bf7c.png

这里先做个小结:

  • 绝大部分安卓手机中图像传感器方向是横向的,且不能改变,所以orientation是90或是270,也就是说,当点击拍照后保存图片的时候,需要对图片做旋转处理,使其为"自然方向"。 (可能存在一些特殊的定制或是能外接摄像头的安卓机,他们的orientation会是0或者180)

  • 通过setDisplayOrientation方法设置预览方向,使预览画面为"自然方向"。前置摄像头在进行角度旋转之前,图像会进行一个水平的镜像翻转,所以用户在看预览图像的时候就像照镜子一样。

这些都是些理论,在下篇文章中,会通过实例代码一步步地验证。

好,我们接着看Camera类中的内部类:

Size

图片大小,里面包含两个变量:width和height(图片的宽和高)

Parameters

Parameters是相机服务设置,不同的相机可能是不相同的。比如相机所支持的图片大小,对焦模式等等。下面介绍一下这个类中常用的方法

  • getSupportedPreviewSizes()
    获得相机支持的预览图片大小,返回值是一个List<Size>数组

  • setPreviewSize(int width, int height)
    设置相机预览图片的大小

  • getSupportedPreviewFormats()
    获得相机支持的图片预览格式,所有的相机都支持ImageFormat.NV21
    更多的图片格式可以自行百度或是查看ImageFormat类

  • setPreviewFormat(int pixel_format)
    设置预览图片的格式

  • getSupportedPictureSizes()
    获得相机支持的采集的图片大小(即拍照后保存的图片的大小)

  • setPictureSize(int width, int height)
    设置保存的图片的大小

  • getSupportedPictureFormats()
    获得相机支持的图片格式

  • setPictureFormat(int pixel_format)
    设置保存的图片的格式

  • getSupportedFocusModes()
    获得相机支持的对焦模式

  • setFocusMode(String value)
    设置相机的对焦模式

  • getMaxNumDetectedFaces()
    返回当前相机所支持的最大的人脸检测个数
    比如,我的手机是vivo x9,后置摄像头所支持最大的人脸检测个数是10,也就是说当画面中人脸数超过10个的时候,只能检测到10张人脸

PreviewCallback

PreviewCallback是一个抽象接口

  • void onPreviewFrame(byte[] data, Camera camera)
    通过onPreviewFrame方法来获取到相机预览的数据,第一个参数data,就是相机预览到的原始数据。

这些预览到的原始数据是非常有用的,比如我们可以保存下来当做一张照片,还有很多第三方的人脸检测及静默活体检测的sdk,都需要我们把相机预览的数据实时地传递过去。

Face

Face类用来描述通过Camera的人脸检测功能检测到的人脸信息

  • rect
    rect 是一个Rect对象,它所表示的就是检测到的人脸的区域。

注意:这个Rect对象中的坐标系并不是安卓屏幕的坐标系,需要进行转换后才能使用,具体会在后面实现人脸检测功能的时候详细介绍

  • score
    检测到的人脸的可信度,范围是1 到100

  • leftEye
    leftEye 是一个Point对象,表示检测到的左眼的位置坐标

  • rightEye
    rightEye是一个Point对象,表示检测到的右眼的位置坐标

  • mouth
    mouth是一个Point对象,表示检测到的嘴的位置坐标

leftEye ,rightEye和mouth这3个人脸中关键点,并不是所有相机都支持的,如果相机不支持的话,这3个的值为null

FaceDetectionListener

这是一个抽象接口,当开始人脸检测时开始回调

  • onFaceDetection(Face[] faces, Camera camera)
    第一参数代表检测到的人脸,是一个Face数组(画面内可能存在多张人脸)

Camera类中的方法

  • getNumberOfCameras()
    返回当前设备上可用的摄像头个数

  • open()
    使用当前设备上第一个后置摄像头创建一个Camera对象。如果当前设备没有后置摄像头,则返回值为null

  • open(int cameraId)
    使用传入id所表示的摄像头创建一个Camera对象,如果id所表示的摄像头已经被打开,则会抛出异常

设备上每一个物理摄像都是有一个id的,id从0开始,到getNumberOfCameras() - 1 结束

例如,一般的手机上都有前后两个摄像头,那么后置摄像头id就是0,前置摄像头id就是1

  • getCameraInfo(int cameraId, CameraInfo cameraInfo)
    返回指定id所表示的摄像头的信息

  • setDisplayOrientation(int degrees)
    设置相机预览画面旋转的角度
    上面已经讲过,见图五

  • setPreviewDisplay(SurfaceHolder holder)
    设置一个Surface对象用来实时预览
    我们看一下源码:

  public final void setPreviewDisplay(SurfaceHolder holder) throws IOException {
        if (holder != null) {
            setPreviewSurface(holder.getSurface());
        } else {
            setPreviewSurface((Surface)null);
        }
    }

 public native final void setPreviewSurface(Surface surface) throws IOException;

可以看到 ,这个方法调用了setPreviewSurface(Surface surface),传入的surface对象是holder.getSurface()
那么holder.getSurface()所表示的surface是什么呢?
在SurfaceView的源码中(1088行)找到了答案:

        @Override
        public Surface getSurface() {
            return mSurface;
        }

holder.getSurface()所返回的surface对象就是SurfaceView中的mSurface对象! 这三者的关系见图二

  • setPreviewCallback(PreviewCallback cb)
    设置相机预览数据的回调,参数是一个PreviewCallback对象,上面在介绍内部类的时候已讲过

  • getParameters()
    返回当前相机的参数信息,返回值是一个Parameters对象

  • setParameters(Parameters params)
    设置当前相机的参数信息

  • startPreview()
    开始预览
    调用此方法之前,如果没有setPreviewDisplay(SurfaceHolder) 或 setPreviewTexture(SurfaceTexture)的话,是没有效果的

  • stopPreview()
    停止预览

  • startFaceDetection()
    开始人脸检测
    这个方法必须在开始预览之后调用

  • stopFaceDetection()
    停止人脸检测

  • setFaceDetectionListener(FaceDetectionListener listener)
    设置人脸检测监听回调

  • release()
    释放相机

三、总结

  1. Camera负责采集数据和各种操作,SurfaceView负责把Camera采集到的数据实时地显示在屏幕上

  2. 我们通过SuraceHolder中的回调可以监听Surface的状态(创建、变化、销毁)

  3. 相机图像数据都是来自于相机硬件的图像传感器这个方向是不能改变的

  4. 相机在预览的时候是有一个预览方向的,可以通过setDisplayOrientation()设置

  5. 前置摄像头在进行角度旋转之前,图像会进行一个水平的镜像翻转,所以用户在看预览图像的时候就像照镜子一样

  6. 相机所采集的照片也是有一个方向的,这个方向与预览时的方向互不相干

  7. 我们可以通过setParameters(Parameters params)设置当前相机的参数信息,比如 保存的图片大小,对焦模式等等

  8. 在关闭页面 或者 打开其他摄像头之前,一定要先调用release()方法释放当前相机资源

好,到这里关于Camera开发所需要的知识点已经介绍完了。看了这么多枯燥的知识点是不是已经双手痒痒,迫不及待动手撸代码了?在下篇文章中,我将会带着小伙们一块,从零开始实现自己的Camera相机!

作者:Smashing丶
原文链接:https://www.jianshu.com/p/f8d0d1467584
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680

ROS中生成CameraInfo消息 前言 由于某个第三方代码需要接受CameraInfo消息,我换了一个相机以后,需要自己发布CameraInfo消息。网上搜了半天,很少有介绍CameraInfo这些数据都是怎么来的的资料,可能大部分都是直接生成的吧,像我这样需要自己计算的可能不多。折腾了半天,也算是找到了方法。特做记录总结。转载请注明出处。 分析 首先看一下现有的CameraInfo有哪些数据: rostopic echo /camera_info 可以看到,除了header外有 D, K, R, P等参数。这几个都是什么? 这就需要看 阅读详情

相关推荐

嵌入式SDRAM控制器与VRFB图像旋转硬件加速配置实战

在嵌入式系统设计中,SDRAM控制器是管理多主设备并发访问外部内存的核心枢纽,其性能直接影响系统整体带宽与实时性。其工作原理涉及复杂的时序控制、仲裁策略与地址映射,旨在高效调度CPU、GPU、摄像头等设备的数据流。为优化特定应用场景,如移动设备中的图像旋转,常集成专用硬件加速单元,例如VRFB(虚拟旋转帧缓冲)。VRFB通过硬件地址重映射,在数据读写SDRAM过程中透明完成90°、180°、270°旋转,避免了CPU进行软件像素搬运的巨大开销,显著提升了图形处理效率和系统能效。该技术广泛应用于智能手机、平板

weixin_34295316的博客 459

Android: Camera相机开发详解(上) —— 知识储备

android.jpg 前言 上一篇文章介绍了如何调用系统相机进行拍照裁剪等功能,一般情况下这些已经能满足我们的需求了。但是在有些场景和特殊需求下,比如要进行人脸检测、要不间断地抓取多张照片等等,那就需要使用原生Camera来进行开发啦 这里并不打算讲如何用代码去实现,而是先给小伙们介绍相关的知识点,等对这些知识有了大致了解后在动手去写,这样既能有目的的去写又能加深对知识点的理解...

南七小僧的学海无涯 1350

Android 10.0微信视频通话上下颠倒的解决方案

在做rom 定制化开发的时候,由于有些客户在设备上安装了微信,然后用微信视频通话 发现视频画面上下颠倒 ,针对这个问题所以就要查询原因 看是哪里出了问题 在视频通话中会用到Camera,而Camera的CameraInfo参数 CAMERA_FACING_BACK Added in API level 9 int CAMERA_FACING_BACK 相机的朝向与屏幕的朝向相反。 常量值:0(0x00000000) CAMERA_FACING_FRONT Added in API level 9 int C

安卓兼职framework和app工程师的博客 2491

android 打开摄像头的代码

private Camera openCamera(){ Camera camera = null; try{ Class cameraClass = Class.forName("android.hardware.Camera"); Object cameraInfo = null; Field field = null; int cameraCount = 0;

Mirage520的专栏 1万+

Android 使用Camera1实现相机预览、拍照、录像

本文介绍在Android中,如何使用Camera1 API实现相机预览、拍照和录制视频,以及提供可以接入使用的Camera1工具类

朱豪凯的博客 1万+

Ubuntu 22.04下Minkowski Engine编译避坑指南:解决Cuda 12.2与Pytorch cu118版本冲突

本文详细介绍了在Ubuntu 22.04系统中解决Minkowski Engine编译时Cuda 12.2与Pytorch cu118版本冲突的实用方法。通过修改版本检查逻辑、创建兼容符号链接等技巧,帮助开发者顺利完成编译,并提供了性能优化建议和替代方案,确保三维点云处理任务的高效运行。

weixin_42543309的博客 160

C++音视频开发实战:基于FFmpeg与SDL2的采集播放系统构建

音视频处理是计算机多媒体领域的核心技术,其本质是对连续时基媒体数据的采集、编码、传输、解码与呈现。其原理涉及信号处理、操作系统硬件抽象、实时数据流管理等多个层面。掌握这项技术对于构建高性能、低延迟的媒体应用具有重要价值,广泛应用于视频会议、直播、媒体播放器及游戏引擎等场景。本文聚焦于使用C++进行音视频系统开发,通过整合FFmpeg这一行业标准的音视频处理库进行设备采集与格式转换,并利用SDL2库实现跨平台的媒体播放与渲染,深入探讨了从原始数据流到屏幕像素和扬声器振动的完整实现链路,为开发者提供了一个从零搭

HJ921004的博客 578

构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent

以qBittorrent为例,说明如何在TrueNAS SCALE上使用docker来安装应用。

luoqingyong的博客 7005

Android NDK 直播推流与引流

本篇介绍一下直播技术中推流与引流的简单实现。 1.流媒体服务器测试 首先利用快直播 app (其他支持 RTMP 推流与引流的 app 亦可)和 ffplay.exe 对流媒体服务器进行测试。 快直播 app 下载地址: https://apkpure.biz/cn.nodemedia.qlive/%E5%BF%AB%E7%9B%B4%E6%92%AD 快直播的推流界面和引流界面: Windows 下利用 ffplay 进行引流,命令行执行: ffplay rtmp://192.168.0.0/liv.

Android23333的博客 981

2023电视专用!安卓电子相册APP避坑指南(附开源代码)

本文针对2023年智能电视用户,提供安卓电子相册APP的避坑指南与实战教程。文章详细解析了电视端相册应用的常见广告与兼容性陷阱,并指导用户如何安全获取、部署纯净的APK应用,通过核心设置实现无广告的个性化图片轮播体验,最终打造专属的家庭回忆墙。

weixin_29012677的博客 494

别再手动点按钮了!用C#给PowerMill做个自动化小助手(附完整源码)

本文详细介绍了如何使用C#进行PowerMill二次开发,打造自动化助手以提升CAM工程师的工作效率。通过实战案例和完整源码,展示了从环境配置到核心功能实现的完整流程,包括智能连接模块、项目批量处理器和刀路智能分析器等高级功能开发。

weixin_26899659的博客 344

Android NDK/JIN 从入门到精通

1.1 JNI(Java Native Interface) 提供一种Java字节码调用C/C++的解决方案,JNI描述的是一种技术 1.2 NDK(Native Development Kit) Android NDK 是一组允许您将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具,NDK描述的是工具集。 能够在 Android 应用中使用原生代码对于想执行以下一项或多项操作的开发者特别有用: 在平台之间移植其应用。 重复使用现有库,或者提供其自己的库供重复使用。 在某些情况下提高

Android23333的博客 690

睿思综述智能体:100篇高质量文献一键生成万字长文,还能联网PubMed,科研效率拉满!

对一个主题进行文献综述,是日常科研人绕不过去的工作,无论是写论文前言,综述论文,或者基金申请书的立项依据,需要根据主题,从海量文献中提取相关信息,梳理出清晰的逻辑线,再组织成流畅的文字。4 一键生成万字全文:大纲确认后,它会基于对所有论文的深度理解,逐个章节进行详细撰写,最终生成一篇逻辑连贯、内容翔实、引用规范的万字综述长文,并直接保存为Word(.docx)文件。3 智能撰写大纲:你可以提供自己的大纲,也可以让它根据所有文献内容,智能生成一个逻辑清晰的综述大纲,并支持你在此基础上修改。

dinaxuejie的博客 820

Android NDK 开发基础:C 语言的内存管理

简介 C 语言的内存管理,分成两部分。一部分是系统管理的,另一部分是用户手动管理的。 系统管理的内存,主要是函数内部的变量(局部变量)。这部分变量在函数运行时进入内存,函数运行结束后自动从内存卸载。这些变量存放的区域称为”栈“(stack),”栈“所在的内存是系统自动管理的。 用户手动管理的内存,主要是程序运行的整个过程中都存在的变量(全局变量),这些变量需要用户手动从内存释放。如果使用后忘记释放,它就一直占用内存,直到程序退出,这种情况称为”内存泄漏“(memory leak)。这些变量所在的内存称为”堆

Android23333的博客 1058

Calibre license失效的解决方法

Calibre license失效的解决方法

qq_45354630的博客 6479

MVDR算法: 自适应波束形成在信号处理领域中扮演着重要的角色。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。

MVDR算法是一种用于抑制干扰信号并增强感兴趣信号的自适应波束形成算法。它的基本思想是通过对干扰信号进行空间滤波,使其在感兴趣信号方向上的输出功率最小化。这种方法可以提高信号的质量和可辨识度,特别是在存在多个干扰源的复杂环境中。本文将介绍MVDR(最小方差无失真响应)算法,并提供相应的Matlab源代码实现。使用MVDR算法,我们可以通过对观测信号进行波束形成来抑制干扰信号并增强感兴趣信号。以上是MVDR算法的Matlab实现。的每一列代表一个阵列元素的观测信号。表示期望的波束指向,即感兴趣信号的方向。

HackWhisper的博客 1244

Camera-摄像头工作原理(转载)

title: Camera-摄像头工作原理(转载) date: 2019-11-09 21:13:43 tags: [摄像头] categories: Camera 回想这工作的这几年,尝尽社会的辛酸艰难,从一开始什么都没有到30万,从30万到200万,从200万到1300万,不是炫耀,我只是想通过我自己的经历告诉我的朋友们「手机像素越高,拍的照片越清晰」 摄像头结构 [外链图片转存失败,...

轮子工厂 4596

【C++/嵌入式梳理】bootloader

【C++/嵌入式笔试面试八股】bootloader

Hi 1208

Android 坐标系相关

1.getLocationInWindow和getLocationOnScreen ①一个控件在其父窗口中的坐标位置 View.getLocationInWindow(int[] location) ②一个控件在其整个屏幕上的坐标位置 View.getLocationOnScreen(int[] location) getLocationInWindow是以B为原点的C的坐标 getLocationOnScreen以A为原点。 ①getLocationOnScreen示例: st..

zenmela2011的专栏 948

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android 中转换不同坐标系

在做项目时用到了谷歌定位 , 需要把坐标系传入服务器在百度地图上面显示实时位置, 但是谷歌定位的坐标系和百度地图的坐标系有偏差 ,根据以下方法就可以进行互转。package com.xiansen.eremis.util;import java.text.DecimalFormat;public class GPSUtil { public static double pi = 3.

chenchuanwen111的博客 639

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android之camera1和2的简单使用

上面需要记住的是,CaptureReuqest 创建之前,我们已经把相机的数据都配置好,比如聚焦、闪光灯等,接着才把它输入给 Camrea2 的底层,它会被放入到一个被叫做 In-Flight Capture Queue 的队列中,当 In-Flight Capture Queue 队列空闲时,我们就可以从它拿到不同的图片数据给到Surface ,且能拿到CaptureResult 这个返回结果信息。在开启相机预览之前,我们需要对相机进行一些参数配置,比如聚焦,预览尺寸等;

qq_33209777的博客 3592

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android8.1 相机调用getCameraInfo时出现anr

开发高通相机应用过程中会遇到getCameraInfo时系统anr,经过分析修改如下: [sdm660_8.1/frameworks/av/.git] / services / camera / libcameraservice / CameraService.cpp diff --git a/services/camera/libcameraservice/CameraService.cpp ...

zjy764219923的专栏 2685

android camera系列(Camera1、Camera2、CameraX)的使用以及输出的图像格式

android中camera的预览和数据操作

知识共享,你我皆是知识的搬运工 6046

Camera相机API

公开课 相机 扩展对象 java . lang . object ↳ android.hardware.Camera 类概述 相机类是用于设置图像捕获设置、启动/停止预览,拍照片,和检索视频帧进行编码。这个类是相机的客户服务,负责管理实际的相机硬件。 对设备的访问摄像头,你必须声明 CAMERA允许在你的Android清单。也一定要包括清

aiqing0119的专栏 1万+

android中Camera setDisplayOrientation使用

在写相机相关应用的时候遇到捕获的画面方向和手机的方向不一致的问题,比如手机是竖着拿的,但是画面是横的,这是由于摄像头默认捕获的画面byte[]是根据横向来的,而你的应用是竖向的,解决办法是调用setDisplayOrientation来设置PreviewDisplay的方向,效果就是将捕获的画面旋转多少度显示。设置 preview 的顺时针旋转角度。这将影响 preview frames和拍照之后...

weixin_30379531的博客 359

Android Camera 预览尺寸的选取与旋转角度的设定

关于相机预览尺寸的选取和旋转角度的设定到这里便分析结束了, 这里再简单的回顾一下相机预览尺寸的选取统计相机支持的预览尺寸, 按照比例归类从用户传入的比例中找寻与 View 尺寸相当的作为预览尺寸相机旋转角度的设定sensor 坐标系sensor 坐标系图像映射到屏幕坐标系对图像进行校正以确认最终的旋转角度其中 旋转角度的设定 较之 尺寸的选取 要更为困难, 其中牵扯到坐标系的映射和映射后的旋转, 前置相机还需要考虑镜像的抵消, 不过所幸这里将其梳理清楚了。

金戈鐡馬 2733
上一篇: 底层图像处理之GIF图片的合成与解析(三)
下一篇: 多媒体系统之图像原始数据格式(二)
Python_林一
博客等级 码龄7年 876粉丝 510原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值