将图像叠加到相机预览 SurfaceView 上

2023-12-01

我有一个SurfaceView它被用来绘制图像,我想将它们叠加到手机相机的实时反馈上。

目前,SurfaceView包含图像的图像具有白色背景,但如果我要将它们覆盖到手机的相机画面上,它们必须是透明的。相机和动画绘制不能同时完成SurfaceView.

追求使用涉及管理相机和绘制图像的多个视图的最佳课程是什么?是否有可能制作一个SurfaceView透明的?


好吧,我是这样做的……我希望有人发现它有用,尽管高通 AR 的东西已经过时了……它可能已经过时了…… 哦,基本上,它的作用是——从 Android 示例中生成两个时髦的立方体,引入的附加功能是触摸事件,尽管旋转向量偏离了很多——无论如何只是为了演示目的,当然立方体覆盖在顶部可以在屏幕上移动的相机预览。


     public class TakeRecieptPicture extends Activity implements Callback {
    private Camera camera;
    private SurfaceView mSurfaceView;
    SurfaceHolder mSurfaceHolder;

    private TouchSurfaceView mGLSurfaceView;

    ShutterCallback shutter = new ShutterCallback(){

        @Override
        public void onShutter() {
            // TODO Auto-generated method stub
            // No action to be perfomed on the Shutter callback.

        }

       };
    PictureCallback raw = new PictureCallback(){
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            // No action taken on the raw data. Only action taken on jpeg data.
      }

       };

    PictureCallback jpeg = new PictureCallback(){

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub

            FileOutputStream outStream = null;
            try{
                outStream = new FileOutputStream("/sdcard/test.jpg");
                outStream.write(data);
                outStream.close();
            }catch(FileNotFoundException e){
                Log.d("Camera", e.getMessage());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.d("Camera", e.getMessage());
            }

        }

       };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN);


         mGLSurfaceView = new TouchSurfaceView(this); 
     addContentView(mGLSurfaceView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

        mSurfaceView = new SurfaceView(this);
         addContentView(mSurfaceView, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
       mSurfaceHolder = mSurfaceView.getHolder();
       mSurfaceHolder.addCallback(this);
       mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
       mSurfaceHolder.setFormat(PixelFormat.TRANSLUCENT|LayoutParams.FLAG_BLUR_BEHIND); 
       }

    private void takePicture() {
        // TODO Auto-generated method stub
        camera.takePicture(shutter, raw, jpeg);
    }

    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
        Camera.Parameters p = camera.getParameters();
        p.setPreviewSize(arg2, arg3);
        try {
        camera.setPreviewDisplay(arg0);
        } catch (IOException e) {
        e.printStackTrace();
        }
        camera.startPreview();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
    camera = Camera.open();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        camera.stopPreview();
        camera.release();
    }
    }
   

TouchSurfaceView 定义如下:


   class TouchSurfaceView extends GLSurfaceView {  

    public TouchSurfaceView(Context context) {       
        super(context); 
        cr  = new CubeRenderer(true);
        this.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        this.setRenderer(cr);
        this.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);  
        this.getHolder().setFormat(PixelFormat.TRANSPARENT);

        }  

    public boolean onTrackballEvent(MotionEvent e) {     
        cr.mAngleX += e.getX() * TRACKBALL_SCALE_FACTOR;      
        cr.mAngleY += e.getY() * TRACKBALL_SCALE_FACTOR;    
        requestRender();   
        return true;    }   

    @Override
    public boolean onTouchEvent(MotionEvent e) {      
        float x = e.getX();       
        float y = e.getY();     
        switch (e.getAction()) {    
        case MotionEvent.ACTION_MOVE:     
            float dx = x - mPreviousX;         
            float dy = y - mPreviousY;           
            cr.mAngleX += dx * TOUCH_SCALE_FACTOR;   
            cr.mAngleY += dy * TOUCH_SCALE_FACTOR;       
            requestRender();      
            }     
        mPreviousX = x;  
        mPreviousY = y;     
        return true;  

    }
    private final float TOUCH_SCALE_FACTOR = 180.0f / 320;  
    private final float TRACKBALL_SCALE_FACTOR = 36.0f;   
    public  CubeRenderer cr ;
    private float mPreviousX;   
    private float mPreviousY;


}

CubeRenderer 由下式给出:


    class CubeRenderer implements GLSurfaceView.Renderer {  
    public CubeRenderer(boolean useTranslucentBackground) { 
        mTranslucentBackground = useTranslucentBackground;   
        mCube = new Cube();  
       }  


    public void onDrawFrame(GL10 gl) {  
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
        gl.glMatrixMode(GL10.GL_MODELVIEW);     
        gl.glLoadIdentity();    
        gl.glTranslatef(0, 0, -5.0f);  
        gl.glRotatef(mAngle,        0, 1, 0);  
        gl.glRotatef(mAngle*0.25f,  1, 0, 0);     
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);    
        mCube.draw(gl);      
        gl.glRotatef(mAngle*2.0f, 0, 1, 1);    
        gl.glTranslatef(0.5f, 0.5f, 0.5f);     
        mCube.draw(gl);     
        mAngle += 1.2f;  
        }  
    public void onSurfaceChanged(GL10 gl, int width, int height) {     
        gl.glViewport(0, 0, width, height);    
        float ratio = (float) width / height;     
        gl.glMatrixMode(GL10.GL_PROJECTION);       
        gl.glLoadIdentity();     
        gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
        } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {      

        gl.glDisable(GL10.GL_DITHER);     
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);   
        if (mTranslucentBackground) {          
            gl.glClearColor(0,0,0,0);      
            } else {        
                gl.glClearColor(1,1,1,1);     
                }       
        gl.glEnable(GL10.GL_CULL_FACE);     
        gl.glShadeModel(GL10.GL_SMOOTH);     
        gl.glEnable(GL10.GL_DEPTH_TEST);   
        }  

    public void setAngle(float _angle){

    }
    private boolean mTranslucentBackground;  
    private Cube mCube;  
    private float mAngle;
      public  float mAngleX;  
       public float mAngleY;

}
   

最后立方体本身由下式给出:


    class Cube{   
    public Cube()  
    {        int one = 0x10000;    
    int vertices[] = {  
            -one, -one, -one,   
            one, -one, -one,     
            one,  one, -one,      
            -one,  one, -one,           
            -one, -one,  one,         
            one, -one,  one,           
            one,  one,  one,          
            -one,  one,  one,        };  

    float[] colors = {      
            0f,    0f,    0f,  0.5f, 
            1f ,  0f,  0f, 0.1f,    
            1f,1f,0f,0.5f,   
            0f,  1f,    0f,  0.1f,      
            0f,    0f,  1f,  0.1f,       
            1f,    0f,  1f,  0.2f,      
            1f,  1f,  1f,  0.1f,        
            0f,  1f,  1f,  0.1f,        };    

    byte indices[] = {          
            0, 4, 5,    0, 5, 1,    
            1, 5, 6,    1, 6, 2,     
            2, 6, 7,    2, 7, 3,      
            3, 7, 4,    3, 4, 0,      
            4, 7, 6,    4, 6, 5,       
            3, 0, 1,    3, 1, 2        };   


    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length*4);   
    vbb.order(ByteOrder.nativeOrder());     
    mVertexBuffer = vbb.asIntBuffer();    
    mVertexBuffer.put(vertices);      
    mVertexBuffer.position(0);      
    ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length*4);   
    cbb.order(ByteOrder.nativeOrder());     
    mColorBuffer = cbb.asFloatBuffer();      
    mColorBuffer.put(colors);     
    mColorBuffer.position(0);      
    mIndexBuffer = ByteBuffer.allocateDirect(indices.length);     
    mIndexBuffer.put(indices);     
    mIndexBuffer.position(0);    } 
    public void draw(GL10 gl)    {    
        gl.glFrontFace(gl.GL_CW);     
        gl.glVertexPointer(3, gl.GL_FIXED, 0, mVertexBuffer);  
        gl.glColorPointer(4, gl.GL_FIXED, 0, mColorBuffer);     
        gl.glDrawElements(gl.GL_TRIANGLES, 36, gl.GL_UNSIGNED_BYTE, mIndexBuffer);    } 

    private IntBuffer   mVertexBuffer;  
    private FloatBuffer   mColorBuffer;   
    private ByteBuffer  mIndexBuffer;

    }
   

好吧希望有人觉得这很有用......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将图像叠加到相机预览 SurfaceView 上 的相关文章

  • SugarORM 错误或缺少数据库

    我尝试让 Android 项目与 SugarORM 一起使用 但是 我遇到了以下错误 引起原因 android database sqlite SQLiteException 没有这样的表 DOCUMENT 代码1 编译时 INSERT O
  • Android Studio Profiler 中显示“无可调试进程”

    当我尝试在 Android Studio 中使用探查器时 我能够看到已连接的设备 但在探查器中收到 无可调试进程 有人可以帮助我为什么我收到 不可调试的进程 吗 您可以尝试以下任意 全部操作 使缓存失效并重新启动Android Studio
  • Dagger 2 不会注入我的对象,但可以从组件中获取

    我有我的组件 GithubListActivityScope Component modules GithubListActivityModule class GlideActivityModule class public interfa
  • 旋转对话框的自定义主题

    我想自定义当我单击 spinnermode dialog 中的微调器时出现的对话框的外观 我想使用对话框片段 但没有找到文档 是否可以 不会 外观是固定的 给人一种操作系统的感觉 您必须创建自己的微调器才能执行此操作 这并不容易 但如果微调
  • SQLite 中的 where 子句在 android 中不起作用:(

    当尝试在 SQLite 中查询某些数据时 我遇到了一个恼人的错误 这是我的代码 Cursor cursor db query TABLE IMAGES new String id name compareToThis null null n
  • 字符串生成器最大长度

    我想知道字符串生成器 或字符串缓冲区 的最大容量是多少 我的 Android 应用程序中有一个静态变量 它应该保存日志字符串 它最多可以容纳 130 行和大约 10000 个字符 我如果我附加更多内容 但它只是不显示 没有错误 没有例外 所
  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • Eddystone Beacon 中广播的 MAC ID 会改变吗?

    我将描述我的设置 我制作了一个模拟 Eddystone 信标的 Android 应用程序 我能够使用 PlayStore 中的 Beacon Toy 应用程序检测手机上的 Eddystone 信标 但问题是 自上次检查以来 显示的 MAC
  • 应用程序可能在其主线程上做了太多工作 - Android

    您好 我正在开发一个 Android 应用程序 当我尝试从我的应用程序发送电子邮件时遇到此错误 我在后台发送邮件而不使用基于意图这个链接 http www oodlestechnologies com blogs Send Mail in
  • 如何以编程方式启用编辑文本的垂直滚动条

    我正在尝试实施android scrollbars vertical 通过 Java 代码在 XML 中 我尝试过方法setVerticalScrollBarEnabled true 但它不起作用 有人可以给我一个建议吗 提前致谢 您可以使
  • Android:可以写入lib目录吗?

    是否可以以编程方式将文件复制到 data data application package lib 目录中 或在 data data application package lib 目录中创建符号链接 当尝试写入 lib 目录时 我总是收到
  • 某些设备上的启动画面扭曲

    我在修复 Android 上的启动画面扭曲问题时遇到问题 我正在使用 React Native 请注意 这种情况仅发生在某些设备上 例如 我有一台 Android 版本为 4 2 2 的三星 启动画面不扭曲 而 Android 版本为 8
  • 使用 Android Exoplayer 调整 Dash 流音量

    我正在尝试设置一个搜索栏来控制 exoplayer 流式破折号实例的级别 我正在使用的设置是演示项目的修改版本 并且无法确定我应该尝试影响搜索栏输出的哪个元素 即如何正确使用 MSG SET VOLUME 等 任何意见将不胜感激 我正在寻找
  • 对超类方法的调用应该是第一个语句吗?

    语音识别的结果可以在onActivityResult int requestCode int resultCode Intent data 方法 如图这个例子 http developer android com resources sam
  • 如何为 App Store 添加关联域? - App Store Connect 的 app-ads.txt 文件

    如您所知 Admob 向发布商发送了有关 app ads txt 文件的电子邮件 Admob 在电子邮件中表示 因此 我们邀请您仔细检查您的 app ads txt 文件 如果 您已经在发布日期之前发布了一份 文件 应发布在列出的网站的根目
  • Osmdroid:如何从我自己的位图(图块)创建和加载地图?

    我开始使用 Osmdroid 我想使用这项技术来显示有关 F1 赛道的地图 我有一张大图片 我可以将它切割成更小的图块 我可以修改osmdroid库来上传这些图片吗 我想将这些位图 图块 保存在我的资产文件夹中 我非常不知道如何做到这一点
  • 等待视图通过 IdleResource 变得可见

    我正在使用 Espresso 2 2 编写仪器测试 我想测试的流程 测试点击的单选按钮 onClick 向 API 发起请求 每次不同时间我收到回复后 积极响应触发活动中调用的接口方法 onRequestSuccess 我正在屏幕上显示名为
  • 如何在android上使用xamarin表单执行脚本

    我正在尝试在 Android Mono 上使用 Xamarin Forms 运行 C 脚本 当我运行脚本时 我收到错误 System IO FileNotFoundException 找不到文件 mscorlib dll 这是我试图执行的代
  • Android:禁用 1.5 纸杯蛋糕动画过渡

    长话短说 如何禁用活动之间的屏幕转换 如果您愿意的话 我们实现了自己的选项卡处理程序 现在它正在选项卡之间进行转换 这看起来很俗气 谢谢 Chris See android content Intent FLAG ACTIVITY NO A
  • Oreo:应用程序未运行时不会触发警报

    我有相对简单的设置 应该在一天中的特定时间触发警报并向用户显示通知 这是相关代码 设置闹钟 long inTime expirationTime Calendar getInstance getTimeInMillis 10000 Inte

随机推荐

  • 使用 php 群发邮件程序还是简单地使用 mail()?

    我正在发送约 30 000 封电子邮件 每条消息的内容都会略有不同 我已经使用 php 阅读过mail 功能对于群发邮件来说不是一个好主意 使用内置的优点和缺点是什么mail 使用群发邮件程序的功能和优缺点 例如斯威夫特梅勒 特别要注意的是
  • 如何从 iPhone 上的用户相册加载图像?

    我想从用户的相册中随机加载图像 但我不想访问图像选择器 即我希望图像是随机背景图像 有谁知道这是否可能 除了 UIImageWriteToSavedPhotosAlbum 之外 我找不到任何参考文献 编辑 我正在尝试在 iPhone 应用程
  • Excel合并多行

    我觉得我错过了一些我想用 Excel 做的简单事情 但我在 Google 上错误地提出了这个问题 就这样 我正在查看一位经营比赛计时公司的朋友的一些 Excel 表格 在一场比赛结束时 他有一张 Excel 表格 其中包含一系列比赛的以下格
  • 将 SVG 过滤器内联为数据 URI

    我尝试使用 CSS 中的数据 URI 添加 SVG 过滤器 但无法将效果应用到我的图像 似乎应该支持它 因为根据 caniuse 所有主要浏览器都支持数据 URI 和 SVG 过滤器 如果我将其保存为 SVG 文件并链接到 css 中的文件
  • 如何在 Android 上的 WebRTC 通话期间将麦克风录制为更压缩的格式?

    我有一个应用程序调用使用WebRTC 但在通话过程中 我需要录制麦克风 WebRTC有一个对象WebRTCAudioRecord录制音频但音频文件太大 PCM 16bit 我想录制但尺寸较小 我试过了MediaRecorder但这不起作用
  • 如何修复 OCaml 中的代码错误?

    我是 OCaml 新手 刚刚找到了在线 OCaml 指南 http try ocamlpro com 到了第五课 我陷入了一些练习中 所以 问题来了 修复所有这些 let 表达式 以便最终获得预期结果 1 let xy let x x an
  • 具有范围的子数组

    我试图将一个对象数组拆分为包含 32 个对象的较小数组 剩下的大约最后放入数组中 这是我正在使用的代码 int a sharedManager inventoryArray2 count float b a 33 int c ceilf b
  • BeginRequest 在 ASP.NET MVC 应用程序中触发静态文件

    我的印象是静态文件 CSS 图像 font face 文件等 完全绕过 ASP NET 并直接由 IIS 提供服务 但是 每个 HTTP 请求都会调用我的 BeginRequest 事件处理程序 包括静态文件的请求 这让我担心 因为我正在创
  • 如何使旧版扩展 (tfs 2013) 在 tfs 2015 update 2 中工作?

    我们让这个扩展在 tfs 2013 下工作 它只是隐藏了积压项目的快速添加面板 请参见下面的代码 我们将服务器更新到 tfs 2015 2 后 代码停止工作 无法使用 VSTS 扩展的新框架 请参阅上一个问题 这是 JavaScript 代
  • 使用包含浮点数组的 OpenCL 将结构传递到 GPU

    我目前有一些数据想要传递到我的 GPU 并将其乘以 2 我创建了一个结构 可以在这里看到 struct GPUPatternData cl int nInput nOutput patternCount offest cl float pa
  • 当类包含在另一个类中时,为什么不转发类工作的声明

    这编译 include Sprite h class GameObject public int x y w h Sprite sprite public GameObject GameObject int x int y int w in
  • 我可以使用 VC++ 2008 创建 Dll 并在 VC++ 6 中使用它吗?

    我用 VC 2008 制作了一个 DLL 当我在控制台应用程序 VC 6 0 中使用它时 出现异常 msvcr90 dll 0xc0000005 访问冲突 Access Violation在这种情况下可以意味着很多事情 并且msvcr90
  • 后台服务之间如何通信

    我正在实现一个应用程序 因为我有两个服务 一个服务执行某些任务并将某些值传递给另一个服务 然后该服务使用该值执行某些任务 当第一个服务生成第一个值时 它应该启动第二个服务 此后 第一个服务生成的值将添加到第二个服务的队列中 第一次当第二个服
  • 从 C# 调用 VBA 函数

    是否可以调用一个 VBA 函数 在 Access 中 该函数从外部世界获取两个字符串参数 例如从 c 中 但其他函数也可以这样做 这是从 C 调用 Access 数据库函数的示例 我过去曾使用该函数来创建类似的功能 private void
  • HTTP 保持活动状态和 ServiceHost / C#?

    如何使用应用程序配置和 C ServiceHost 启用 禁用 HTTP Keep alive 并设置自托管服务的连接超时 例如 MyService service new MyService ServiceHost serviceHost
  • 未定义的变量:GPVAL_DATA_Y_MIN(Gnuplot)

    基于这篇文章 我正在使用 gnuplot gnuplot 4 6 patchlevel 1 gnuplot 范围内的最大值和最小值 我正在尝试使用set yr GPVAL DATA Y MIN GPVAL DATA Y MAX 在我的 pg
  • 是什么导致 Winforms 默默地丢弃未处理的异常(没有 try/Catches)?

    我正在向我的 winforms 控件添加新功能 其中一部分要求曾经始终使用的变量现在是可选的 如果它为空 则从第二个源获取数据 我做了一些更改并运行了我的表单 却发现什么也没有发生 甚至以前有效的功能也没有发生 我很困惑地浏览了代码 发现我
  • 用于查找 C# 类和方法名称的正则表达式

    我正在编写一个影响分析工具 它将解析一堆选定的文件类型并查找文件 在本例中为 cs 文件 内的类和方法调用 我已经成功编写了一个正则表达式 可以查找一行代码是否是方法调用 Regex re new Regex b public privat
  • 为什么Java中对象的Hashcode会改变?

    为什么Java中对象的Hashcode会改变 它有什么变化吗 它与哈希表有什么关系 每个对象都应该有它唯一的哈希码 那么 重新哈希是其原因吗 提前致谢 The defaulthashcode的实现相当于对象标识 但是 某些对象会覆盖哈希码
  • 将图像叠加到相机预览 SurfaceView 上

    我有一个SurfaceView它被用来绘制图像 我想将它们叠加到手机相机的实时反馈上 目前 SurfaceView包含图像的图像具有白色背景 但如果我要将它们覆盖到手机的相机画面上 它们必须是透明的 相机和动画绘制不能同时完成Surface