Android开发使用OpenCv中JavaCameraView预览图左旋90度问题

2023-11-13

转自:https://blog.csdn.net/yd_yandong/article/details/52698696

本文参考地址:http://stackoverflow.com/questions/14816166/rotate-camera-preview-to-portrait-android-opencv-camera点击打开链接

至于预览图左旋90的问题不再贴图了

下面说一下解决办法:

我使用的开发工是Android Studio 2.2

如果你导入了OpenCv的SDK,请继续阅读,其他请立即关闭本博客。

首先找到CameraBridgeViewBase这个类:添加全局变量

 
private WindowManager windowManager;

接下来是构造方法中对windowManager初始化:

 
  1. public CameraBridgeViewBase(Context context, int cameraId) {

  2. super(context);

  3. mCameraIndex = cameraId;

  4. getHolder().addCallback(this);

  5. mMaxWidth = MAX_UNSPECIFIED;

  6. mMaxHeight = MAX_UNSPECIFIED;

  7. windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

  8. }

  9.  
  10. public CameraBridgeViewBase(Context context, AttributeSet attrs) {

  11. super(context, attrs);

  12.  
  13. int count = attrs.getAttributeCount();

  14. Log.d(TAG, "Attr count: " + Integer.valueOf(count));

  15.  
  16. TypedArray styledAttrs = getContext().obtainStyledAttributes(attrs, R.styleable.CameraBridgeViewBase);

  17. if (styledAttrs.getBoolean(R.styleable.CameraBridgeViewBase_show_fps, false))

  18. enableFpsMeter();

  19.  
  20. mCameraIndex = styledAttrs.getInt(R.styleable.CameraBridgeViewBase_camera_id, -1);

  21.  
  22. getHolder().addCallback(this);

  23. mMaxWidth = MAX_UNSPECIFIED;

  24. mMaxHeight = MAX_UNSPECIFIED;

  25. windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

  26. styledAttrs.recycle();

  27. }


接下来把deliverAndDrawFrame(CvCameraViewFrame frame)方法替换为下面的代码:

 
  1. protected void deliverAndDrawFrame(CvCameraViewFrame frame) {

  2. Mat modified;

  3.  
  4. if (mListener != null) {

  5. modified = mListener.onCameraFrame(frame);

  6. } else {

  7. modified = frame.rgba();

  8. }

  9.  
  10. boolean bmpValid = true;

  11. if (modified != null) {

  12. try {

  13. Utils.matToBitmap(modified, mCacheBitmap);

  14. } catch (Exception e) {

  15. Log.e(TAG, "Mat type: " + modified);

  16. Log.e(TAG, "Bitmap type: " + mCacheBitmap.getWidth() + "*" + mCacheBitmap.getHeight());

  17. Log.e(TAG, "Utils.matToBitmap() throws an exception: " + e.getMessage());

  18. bmpValid = false;

  19. }

  20. }

  21.  
  22. if (bmpValid && mCacheBitmap != null) {

  23. Canvas canvas = getHolder().lockCanvas();

  24. if (canvas != null) {

  25. canvas.drawColor(0, android.graphics.PorterDuff.Mode.CLEAR);

  26. int rotation = windowManager.getDefaultDisplay().getRotation();

  27. int degrees = 0;

  28. // config degrees as you need

  29. switch (rotation) {

  30. case Surface.ROTATION_0:

  31. degrees = 90;

  32. break;

  33. case Surface.ROTATION_90:

  34. degrees = 0;

  35. break;

  36. case Surface.ROTATION_180:

  37. degrees = 270;

  38. break;

  39. case Surface.ROTATION_270:

  40. degrees = 180;

  41. break;

  42. }

  43.  
  44. Matrix matrix = new Matrix();

  45. matrix.postRotate(degrees);

  46. Bitmap outputBitmap = Bitmap.createBitmap(mCacheBitmap, 0, 0, mCacheBitmap.getWidth(), mCacheBitmap.getHeight(), matrix, true);

  47.  
  48. if (outputBitmap.getWidth() <= canvas.getWidth()) {

  49. mScale = getRatio(outputBitmap.getWidth(), outputBitmap.getHeight(), canvas.getWidth(), canvas.getHeight());

  50. } else {

  51. mScale = getRatio(canvas.getWidth(), canvas.getHeight(), outputBitmap.getWidth(), outputBitmap.getHeight());

  52. }

  53.  
  54. if (mScale != 0) {

  55. canvas.scale(mScale, mScale, 0, 0);

  56. }

  57. Log.d(TAG, "mStretch value: " + mScale);

  58.  
  59. canvas.drawBitmap(outputBitmap, 0, 0, null);

  60.  
  61. if (mFpsMeter != null) {

  62. mFpsMeter.measure();

  63. mFpsMeter.draw(canvas, 20, 30);

  64. }

  65. getHolder().unlockCanvasAndPost(canvas);

  66.  
  67. }

  68. }

  69. }

上面还引用了getRatio(int widthSource, int heightSource, int widthTarget, int heightTarget)方法:

 
  1. private float getRatio(int widthSource, int heightSource, int widthTarget, int heightTarget) {

  2. if (widthTarget <= heightTarget) {

  3. return (float) heightTarget / (float) heightSource;

  4. } else {

  5. return (float) widthTarget / (float) widthSource;

  6. }

  7. }


看到这里你也许已经明白了,核心代码是如下这些:

 
 
  1. int rotation = windowManager.getDefaultDisplay().getRotation();

  2. int degrees = 0;

  3. // config degrees as you need

  4. switch (rotation) {

  5. case Surface.ROTATION_0:

  6. degrees = 90;

  7. break;

  8. case Surface.ROTATION_90:

  9. degrees = 0;

  10. break;

  11. case Surface.ROTATION_180:

  12. degrees = 270;

  13. break;

  14. case Surface.ROTATION_270:

  15. degrees = 180;

  16. break;

  17. }

  18.  
  19. Matrix matrix = new Matrix();

  20. matrix.postRotate(degrees);

其实就是更改Rotation参数。
下面看一下效果:

现在可能又出现了一个问题:图像预览界面不能全屏,如图:画红色线条部分为黑色边框。

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

Android开发使用OpenCv中JavaCameraView预览图左旋90度问题 的相关文章

  • TNN行业首发Arm 32位 FP16指令加速,理论性能翻倍

    转自 https cloud tencent com developer article 1774206 https www cnblogs com zhangshenghui p 11825760 html FP16是半精度浮点格式 相比
  • Android中Acition和Category常量表

    Action Action常量 对应字符串 简单说明 ACTION MAIN android intent action MAIN 应用程序入口 ACTION VIEW android intent action VIEW 显示指定数据 A
  • assert在debug 和 release版本中的区别

    转自 https blog csdn net panfengsoftware article details 8910468 debug版本与release的不同点 debug版本中含有调试信息 不会对程序进行优化 assert相应的宏会被
  • Tensorflow的Bazel编程(二)

    转自 http blog csdn net langb2014 article details 54312697 安装官网 https bazel build versions master docs tutorial Java html
  • Android-打包AAR步骤以及最为关键的注意事项

    转自 https www jianshu com p f391d0a6691e 简介 最近因为项目的要求 需要把开发的模块打包成aar 供其他项目调用 在搞了一段时间后 发现这里还是有很多需要注意的地方 所以记录一下 帮助大家不要走弯路 首
  • Android系统运动传感器

    转自 https blog csdn net liang123l article details 53992197 Android平台提供了多种感应器 让你监控设备的运动 传感器的架构因传感器类型而异 重力 线性加速度 旋转矢量 重要运动
  • android studio 安装说明

    转自 http www cnblogs com liuhongfeng archive 2015 12 30 5084896 html 1 下载android studio 含SDK版本 http www android studio or
  • 纯手工gcc 编译android native Cpp代码

    纯手工gcc 编译android native Cpp代码 api level 19 32位 编译成功 api level 19 home charlie android tool android ndk r10e toolchains a
  • 解决camera1 onPreviewFrame()会阻塞UI线程

    转自 https blog csdn net qq 31939617 article details 86360335 https www huaweicloud com zhishi arc 13664997 html 注意 onPrev
  • 各国语言对应翻译表

    为了工作方便 自己做了一个地区语言的英文翻译 让自己可以更快的找到自己需要的地方 同时 分享给大家 谢谢 中文 各国语言 翻译 序号 中文 翻译 1 阿尔巴尼亚语 2 阿拉伯语 3 阿姆哈拉语 4 阿塞拜疆语 Az rbaycan 5 爱尔
  • Android:手把手带你了解实用的Android Jetpack

    转自 https blog csdn net carson ho article details 104243841 前言 在2018年 Google I O 大会上发布了一系列辅助Android开发者开发的实用工具集合 Jetpack 今
  • Nv21转Bitmap(高效率转化)

    转自 https blog csdn net qq1137830424 article details 81980673 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 ht
  • java static 静态方法的使用 注意事项

    定义为 static function1 function1 中不能引用this或super 在android 中这样用的话 会出现以下的报错 W dalvikvm 2783 JNI WARNING instance fieldID 0x5
  • Android性能调优工具TraceView介绍

    转自 http www trinea cn android android traceview 本文主要介绍Android性能调优工具TraceView的使用及通过其确定性能点 目前性能优化专题已完成以下部分 性能优化总纲 性能问题及性能调
  • 在Android Studio中下载Android SDK的两种方式(第二种好用)

    转自 https www cnblogs com mxj961116 p 10423479 html Android studio下载地址 http www android studio org 方式一 设置HTTP Proxy1 打开Se
  • Android数据的四种存储方式SharedPreferences、SQLite、ContenProvider

    作为一个完整的应用程序 数据存储操作是必不可少的 因此 Android系统一共提供了四种数据存储方式 分别是 SharePreference SQLite Content Provider File 由于Android系统中 数据基本都是私
  • Android开发使用OpenCv中JavaCameraView预览图左旋90度问题

    转自 https blog csdn net yd yandong article details 52698696 本文参考地址 http stackoverflow com questions 14816166 rotate camer
  • Java反射机制的学习

    转自 http www cnblogs com keis archive 2011 03 29 1998736 html Java反射机制是Java语言被视为准动态语言的关键性质 Java反射机制的核心就是允许在运行时通过Java Refl
  • Android APP应用启动页白屏(StartingWindow)优化

    转自 https www cnblogs com whycxb p 9312914 html 本人采用这种方法没有效果 启动图片出来第一帧 我应用的第一帧也出来了 启动背景颜色没有调试出来 Theme AppCompat Light Dar
  • android 反射机制和反射调用方法

    对于android 中很多类没有开放出来 考虑到这些API不稳定 后续有可能会更改 所有没有在SDK中暴露出来给用户使用 但是我们在开放的过程中还是需要使用到一些android 系统中未开放出来的class 这时候我们就可以通过反射机制来调

随机推荐

  • 希尔排序—C语言实现

    目录 前言 希尔排序 发展历史 基本思想 时间复杂度 我们以一组数字来说操作说明 gap的选取 动图演示 代码 总结 前言 在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据 当然操作数据首先想到的就是数据的排序 排过顺序的
  • PHP正则表达式匹配教程

    一 什么是正则表达式 正则表达式是一种用于搜索 匹配 替换某种文本的字符串模式 常用于处理文本数据 校验输入数据等 在PHP中 可以使用preg系列函数 preg match preg replace等 处理正则表达式 二 正则表达式语法
  • 解决org.apache.hadoop.ipc.RenoteException(java.io.IOException)

    前言 用VMware搭了一个spark 集群环境 练习spark shell 因为懒一直没关虚拟机 一直卡到玩不了了 没关闭spark hadoop集群 直接干掉了 虚拟机 然后 网卡炸了 各种修修补补 master节点死活ping不通 子
  • 连接mysql的url是什么意思_URL是什么意思?

    这个维基百科上有翻译 URL Uniform Resource Locator 统一资源定位符 URI Uniform Resource Identifier 统一资源标志符 URL 是一种比较统一的带参数指向某个地址的格式 格式为 协议类
  • 私有云笔记推荐(obsidian+nas同步)

    文章目录 Joplin Leanote 蚂蚁笔记 obsidian webdav 内网穿透 Trilium vnote 总结 nas同步 Obsidian Joplin https joplinapp org https www jians
  • C++11 原子变量

    目录 什么时原子变量 atomic 类成员 原子变量的使用 C C Linux服务器开发 后台架构师 零声教育 学习视频教程 腾讯课堂 什么时原子变量 原子操作 原子指的是一系列不被 CPU上下文交换的机器指令 这些指令组合在一起就形成了原
  • Sonar安全

    1 Using Struts 1 ActionForm is security sensitive 使用Struts1的ActionForm是安全敏感的 All ActionForm s properties should be valid
  • doccano 解决 pydantic.errors.PydanticImportError: `pydantic:ConstrainedStr` has been removed in V2.

    文章目录 报错信息 环境 描述 解决措施 其他 doccano一直转圈圈 报错信息 File C Users anaconda3 envs UIE lib site packages pydantic migration py line 2
  • 通过axios实现的一个搜索查询展示案例

    代码如下 App js import React Component from react import Search List from components export default class App extends Compon
  • Flink实战之实时风控规则引擎

    问题导读 1 怎样构建一个风控业务架构 2 风控规则模型有哪些 3 怎样实现Flink CEP 动态更新 一 项目背景 目前钱大妈基于云原生大数据组件 DataWorks MaxCompute Flink Hologres 构建了离线和实时
  • java程序员专业技能_java程序员简历专业技能怎么写

    专业技能 案例一 1 了解Javascript编程 jQuery框架以及AJAX等前台技术 并且能够熟练使用 jQuery easy UI等jQuery插件 2 掌握Spring框架 包括IOC和DI AOP编程 声明式事务处理及SSH的整
  • 【Python3】smtp邮件内容格式(三)

    邮件正文内容 文本方式 第三个参数 第一个为文本内容 第二个 plain 设置文本格式 第三个 utf 8 设置编码方式 message MIMEText Python 邮件发送测试 plain utf 8 邮件正文 html方式 第三个参
  • 设计模式SOLID

    一 单一职责原则 一个类或者一个模块只完成一个功能 class UserInfo userId username email telephone 二 开闭原则 对扩展开放 对修改关闭 class Alert void check error
  • Java并发编程-第二章

    以下内容来自 Java并发编程 书籍第二章 补充 1 volatile的有序性 volatile通过内存屏障实现禁止指令重排序保证有序性 硬件层面的内存屏障分为Load Barrier 和 Store Barrier即读屏障和写屏障 2 同
  • 企业号回调模式php,.net开发微信企业号之回调模式触发功能

    1 首先服务器跟域名指向的80端口必须不能缺少 2 然后在企业号后台配置里选择回调模式 选择回调模式时候需要配置域名 这时候就跟我们的代码相关了 这一次的配置 对于服务器来说 属于get的请求 我们要在服务器上面写上get请求的方法 以及返
  • Python3下载安装教程并安装numpy模块

    使用到的资源 numpy python3 5 for win7 64bit python3安装教程 第一步 在路径下下载python3的可执行文件 下载来了安装第一步就是双击下载下的安装文件安装python3 5 2版本的python 记得
  • csp-Z字形扫描

    201412 2 试题名称 Z字形扫描 时间限制 2 0s 内存限制 256 0MB 问题描述
  • numpy pad函数

    在卷积神经网络中一个重要的操作就是padding 翻译为填充 就是把一张图片的作为填上一些像素点 以免使得在卷积过程中 图像边缘的点的信息卷积次数过少 而使信息丢失 在numpy函数中已经把padding封装好了 此处重点讨论这函数的具体用
  • 在python中WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.

    这种情况下就是你的pip版本有问题 需要进行升级 这个问题的解决是参考 WARNING You are using pip version 20 2 4 however version 20 3 1 is available 天天向上200
  • Android开发使用OpenCv中JavaCameraView预览图左旋90度问题

    转自 https blog csdn net yd yandong article details 52698696 本文参考地址 http stackoverflow com questions 14816166 rotate camer