使用OpenCV原生的JavaCamera2View打开相机,发现相机帧率非常的低,只有3-4帧,而且色彩也不对。

1.帧率低的解决方案:
这个问题的原因在于OpenCV在设置预览长宽的时候,首先是获取相机支持的最大尺寸,以这个尺寸作为基准和connect_camera的API传进来的View的长宽做条件匹配,如果View的长宽不满足OpenCV的要求,那么会直接使用相机的最大输出尺寸进行预览,而这个就是预览帧率低的根本原因。

一般市面上的所有相机都会支持到640*480的尺寸,因此我们就用这个尺寸,改下源码即可

org\opencv\android\CameraBridgeViewBase.java

    private void onEnterStartedState() {Log.d(TAG, "call onEnterStartedState");/* Connect camera */if (!connectCamera(640, 480)) {

org\opencv\android\JavaCamera2View.java

    boolean calcPreviewSize(final int width, final int height) {Log.i(LOGTAG, "calcPreviewSize: " + width + "x" + height);if (mCameraID == null) {Log.e(LOGTAG, "Camera isn't initialized!");return false;}CameraManager manager = (CameraManager) getContext().getSystemService(Context.CAMERA_SERVICE);try {CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraID);StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);int bestWidth = 0, bestHeight = 0;float aspect = (float) width / height;android.util.Size[] sizes = map.getOutputSizes(ImageReader.class);bestWidth = width;bestHeight = height;
//            for (android.util.Size sz : sizes) {
//                int w = sz.getWidth(), h = sz.getHeight();
//                Log.d(LOGTAG, "trying size: " + w + "x" + h);
//                if (width >= w && height >= h && bestWidth <= w && bestHeight <= h
//                        && Math.abs(aspect - (float) w / h) < 0.2) {
//                    bestWidth = w;
//                    bestHeight = h;
//                }
//            }Log.i(LOGTAG, "best size: " + bestWidth + "x" + bestHeight);assert(!(bestWidth == 0 || bestHeight == 0));if (mPreviewSize.getWidth() == bestWidth && mPreviewSize.getHeight() == bestHeight)return false;else {mPreviewSize = new android.util.Size(bestWidth, bestHeight);return true;}} catch (CameraAccessException e) {Log.e(LOGTAG, "calcPreviewSize - Camera Access Exception", e);} catch (IllegalArgumentException e) {Log.e(LOGTAG, "calcPreviewSize - Illegal Argument Exception", e);} catch (SecurityException e) {Log.e(LOGTAG, "calcPreviewSize - Security Exception", e);}return false;}

重新build下apk,你会发现帧率能够达到25fps左右了。其实还有改善空间的,OpenCV的相机是使用的SurfaceView进行的渲染,我们知道SurfaceView是通过CPU去渲染的,同时OpenCV对CPU的算力占用也是比较大的,因此可以尝试将预览图像的渲染交给GPU去完成,这样能够提升预览的帧率。

BTW,之前写过一个GPU渲染的demo,帧率可以达到基本30fps,Anyway,对于Camera的图像处理的操作,我始终认为最好的方案还是在HAL去完成,因为预览数据从HAL通过CallBack的机制传递到APP非常耗时,以前也看过Camera在Android的数据流,这个过程中预览数据至少要发生2次拷贝。

2.图像色彩不对的解决方案
这问题也是比较坑爹的,就直接上代码吧。

org\opencv\android\JavaCamera2View.java

        @Overridepublic Mat rgba() {if (mPreviewFormat == ImageFormat.NV21)Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);else if (mPreviewFormat == ImageFormat.YV12)Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2RGB_I420, 4); // COLOR_YUV2RGBA_YV12 produces inverted colorselse if (mPreviewFormat == ImageFormat.YUV_420_888) {assert (mUVFrameData != null);//Imgproc.cvtColorTwoPlane(mYuvFrameData, mUVFrameData, mRgba, Imgproc.COLOR_YUV2RGBA_NV21);Imgproc.cvtColorTwoPlane(mYuvFrameData, mUVFrameData, mRgba, Imgproc.COLOR_YUV2BGRA_NV21);} elsethrow new IllegalArgumentException("Preview Format can be NV21 or YV12");return mRgba;}

也就是Mat和Bitmap对于图像处理的差异性导致的

OpenCV相机帧率低以及花屏问题相关推荐

  1. Unity游戏运行后出现花屏解决方案

    最近有个项目在unity中运行完美,但是打包出apk在Android端出现花屏,这个问题我Google了很久然后结合网上的一些资料找到如下两种解决方案: 方案一:修改相机clearFlag的设置 可以 ...

  2. ffmpeg 切片花屏_FFmpeg相机花屏花图问题解决方法

    FFmpeg相机花图问题解决方法 一.问题现象 使用FFmpeg进行进行相机rtsp连接获取相机码流并解码在本地显示,这个过程中有遇见相机花图等问题,排查后发现有花图.正常情况下图像为 出现花图的情况 ...

  3. ffmpeg 切片花屏_FFmpeg相机花屏花图问题解决方法-Go语言中文社区

    FFmpeg相机花图问题解决方法 一.问题现象 使用FFmpeg进行进行相机rtsp连接获取相机码流并解码在本地显示,这个过程中有遇见相机花图等问题,排查后发现有花图.正常情况下图像为 出现花图的情况 ...

  4. 相机录像出现花屏_[Unity3D]花屏问题解决

    "多年前遇到的花屏问题,通过不断的测试.重现.修改.反思,终于得出了最终原因和最终答案!" 你的屏幕花了? 去检查一下,你游戏中的相机clearFlag的设置,是不是没有clear ...

  5. 大疆DJI无人机GoPro运动相机MOV或MP4视频文件恢复后花屏解决技术思路方法

    从事数据恢复的工作人员.航拍录像从业人员.摄影爱好者等有时会遇到视频文件损坏问题,下面分析的就是常见的情况:大疆DJI无人机GoPro运动相机MOV或MP4视频文件丢失之后(删除.病毒感染或者格式化等 ...

  6. OpenCV 打开USB摄像头帧率低问题解决

    采用OpenCV对USB摄像头进行视频图像抓取时,如果图像帧抓取帧率低,可采用以下方式提高帧率. cv::VideoCapture camera_capture; camera_capture.ope ...

  7. android 摄像头花屏_关于Android 4.4相机预览、录像花屏的问题的解决方法

    关于Android 4.4相机预览.录像花屏的问题的解决方法 系统: lc android4.4 在做前后摄像头录像的时候,发现会出现花屏的时候,但不是必现,可能会在某一次重启之后会出现,而且出现之后 ...

  8. opencv usb镜头帧率低 图像卡顿

    opencv 打开usb镜头卡顿(帧率低) 以下是qt 代码,opencv 版本3.4.1 1.核心问题是设置cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J ...

  9. 低延时高RTSP兼容的EasyPlayer-RTSP-win解决H.264一帧多个nal单元录像花屏问题方案

    我们来讲解一下关于H264编码格式中的一帧多nal(Network Abstract Layer, 即网络抽象层),关于H264和NAL,这里引用一段话来科普一下: [转] 在H.264/AVC视频编 ...

  10. SkeyePlayer RTSP/RTMP流媒体超低延迟播放器源码解析系列之H264一帧多NAL写MP4录像花屏问题解决方案

    接上一篇[SkeyePlayer源码解析系列之录像写MP4]之续篇,我们来讲解一下关于H264编码格式中的一帧多nal(Network Abstract Layer, 即网络抽象层),关于H264和N ...

最新文章

  1. html图片查看器工作原理,五分钟了解浏览器的工作原理
  2. 数据结构---排序算法的总结
  3. 华为把服务器虚拟底层锁了,华为全面关闭解码锁服务:马上升级到很吓人的技术!...
  4. 页面404?找不到页面咋整?
  5. python的时间序列,Python时间序列
  6. C++中const与指针、引用的分析(转自china_unix GP-King)
  7. 神仙打架?苹果短暂撤销 Facebook 和 Google 的企业证书
  8. 毕向东java基础,B站直达,目录,b站浏览目录太难受,在这做一个
  9. matlab函数xlsread函数,matlab中xlsread函数
  10. 讨论《蔚蓝(Celeste)》的设计
  11. PCL教程-点云配准之正态分布变换算法(NDT)
  12. 计算RSBF各项指标
  13. 第三方网站登录微信——保姆级
  14. c语言实例 魔术师的猜牌术(1),C语言实例:魔术师的猜牌术(1)
  15. can总线分析仪与stm32的收发操作
  16. python中怎么表示正数_在Python程序的列表中计算正数和负数
  17. spring事务管理:什么是事务?
  18. subtext3php,Sublimetext 3 实现编辑markdown时同步刷新网页预览
  19. WPF 与 WinForm 调用系统右键菜单/资源管理器右键菜单/桌面右键菜单
  20. 19 Go Web 框架(二):框架技术详解

热门文章

  1. Loadrunner请求自定义的http(json)文件and参数化
  2. Visual Studio 2010添加新项缺失[ADO.NET 实体数据模型]解决方法
  3. 从软件project的角度写机器学习3——主要监督学习算法的project性分析
  4. 0903 - Firebase Analytics PK Google Analytics
  5. 关于android输入框被键盘遮挡的问题
  6. 64位 centos 服务器 编译安装 gcc-4.6.2 和 codeviz
  7. DeNA/上海纵游通过使用AWS大量缩短新款游戏和服务的上线时间
  8. OCS 2007 R2 标准版部署
  9. MySQL 数据库 alter 和 update 的区别
  10. 天猫运动户外狂欢日来了!700多个大牌要如何回馈消费者