简介

  简而言之,就是在之前的最初基本布局,继续完善了camera前后摄切换、闪光灯开关,以及添加了边缘预览模式,以及预览分辨率设置功能。

边缘模式

原理讲解

  简单的说,就是利用ndk,使用opencv集成的Canny功能,对预览图像做边缘检测,然后将这个检测结果当做预览图像显示出来。

代码讲解

  1、首先是从setting界面的FirstPopupWindowView窗口,选择进入的预览模式中加上一个选项:边缘模式。

com.example.camera_opencv_android.MyVariable

public String[] firstMenu = { "预览模式", "分辨率"};
public String[] priviewMenu = {"普通模式", "灰阶模式", "边缘模式"};

2、接着在预览模式选择函数:initPreviewPopupWindowView中,加上边缘模式选项对应的操作

com.example.camera_opencv_android.MainActivity

previewListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {if(arg2==0){myVariable.previewFlag = 0;}else if(arg2 == 1){myVariable.previewFlag = 1;}else if(arg2 == 2){myVariable.previewFlag = 2;}if (myVariable.previewPopupwindow != null && myVariable.previewPopupwindow.isShowing()) {  myVariable.previewPopupwindow.dismiss();  myVariable.previewPopupwindow = null;  }
}});public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// TODO Auto-generated method stub
myVariable.mRgba = inputFrame.rgba();
if(myVariable.previewFlag==0){
}else if(myVariable.previewFlag == 1){PreviceGray.grayProc(myVariable.mRgba.getNativeObjAddr());
}else if(myVariable.previewFlag == 2){PreviceGray.canny(myVariable.mRgba.getNativeObjAddr());
}.............}
   通过对previewFlag的设置,来选择预览模式:
           (1)、previewFlag为0表示正常预览;(2)、previewFlag为1表示灰阶预览;(3)、previewFlag为1表示边缘预览;对应的ndk里面图像处理函数,在PreviceGray.cpp中。

效果演示

  效果截图如下:
               (图一)                            (图二)

闪光灯开关

  1、在上一篇初始化界面控件函数mainInit中,设置了闪光灯开关的控件ID为2,所以对应的函数操作如下:
@Override
public void onClick(View v) {............}else if(v.getId() == 2){if(myVariable.myFlashLight == 0){myVariable.mOpenCvCameraView.setFlashMode(MainActivity.this, 4);myVariable.myFlashLight = 1;}else{myVariable.mOpenCvCameraView.setFlashMode(MainActivity.this, 1);myVariable.myFlashLight = 0;}
}
当被点击的控件ID为2的时候,检查当前闪光灯状态,如果是enable则关闭闪光灯;如果是关闭,则开启闪光灯。
对闪光灯真正的操作函数为:setFlashMode。

com.example.camera_opencv_android.WTCamera

public void setFlashMode (Context item, int type){Camera.Parameters params = mCamera.getParameters();List<String> FlashModes = params.getSupportedFlashModes();switch (type){case 0:if (FlashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))params.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO);elseToast.makeText(item, "Auto Mode not supported", Toast.LENGTH_SHORT).show();break;case 1:if (FlashModes.contains(Camera.Parameters.FLASH_MODE_OFF))params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);elseToast.makeText(item, "Off Mode not supported", Toast.LENGTH_SHORT).show();          break;case 2:if (FlashModes.contains(Camera.Parameters.FLASH_MODE_ON))params.setFlashMode(Camera.Parameters.FLASH_MODE_ON);elseToast.makeText(item, "On Mode not supported", Toast.LENGTH_SHORT).show();       break;case 3:if (FlashModes.contains(Camera.Parameters.FLASH_MODE_RED_EYE))params.setFlashMode(Camera.Parameters.FLASH_MODE_RED_EYE);elseToast.makeText(item, "Red Eye Mode not supported", Toast.LENGTH_SHORT).show();          break;case 4:if (FlashModes.contains(Camera.Parameters.FLASH_MODE_TORCH))params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);elseToast.makeText(item, "Torch Mode not supported", Toast.LENGTH_SHORT).show();        break;}mCamera.setParameters(params);
}

分辨率设置

具体代码

  1、这里是在setting选项中,除了之前选项:预览模式之外,新加入选项:分辨率,对应操作函数如下:
private void initFirstPopupWindowView(View v) {firstListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {if(arg2==0){initPreviewPopupWindowView();}else if(arg2 == 1){initResolutionPopupWindowView();}}
}); private void resolutionChange(){if(myVariable.myCameraID == 0){myVariable.myDisplayOrientation = -1;}else{myVariable.myDisplayOrientation = 2;}myVariable.mOpenCvCameraView.setResolution(myVariable.s, myVariable.myCameraID);
}private void initResolutionPopupWindowView() {resolutionListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {if(arg2==0){myVariable.s.height=1080;myVariable.s.width=1920;resolutionChange();}else if(arg2 == 1){myVariable.s.height=960;myVariable.s.width=1280;resolutionChange();}else if(arg2 == 2){myVariable.s.height=720;myVariable.s.width=1280;resolutionChange();}else if(arg2 == 3){myVariable.s.height=480;myVariable.s.width=864;resolutionChange();}else if(arg2 == 4){myVariable.s.height=480;myVariable.s.width=720;resolutionChange();}else if(arg2 == 5){myVariable.s.height=360;myVariable.s.width=480;resolutionChange();}............  }
});
在分辨率选择窗口中,根据不同选择,来设置不同的分辨率到结构myVariable.s中。接着在resolutionChange中,利用setResolution进行具体的解析力
设置。

com.example.camera_opencv_android.WTCamera

public void setResolution(Camera.Size resolution, int cameraID) {disconnectCamera();myConnectCamera((int)resolution.width, (int)resolution.height, cameraID);
}

这里需要稍微改动下Opencv库中的代码:

org.opencv.android.JavaCameraView

protected boolean initializeCamera(int width, int height, int cameraID) {..........try {mCamera = Camera.open(cameraID);}
}@Override
protected boolean connectCamera(int width, int height) {.............if (!initializeCamera(width, height, 0))return false;.............
}@Override
protected boolean myConnectCamera(int width, int height, int cameraID) {/* 1. We need to instantiate camera* 2. We need to start thread which will be getting frames*//* First step - initialize camera connection */Log.d(TAG, "Connecting to camera");if (!initializeCamera(width, height, cameraID))return false;mCameraFrameReady = false;/* now we can start update thread */Log.d(TAG, "Starting processing thread");mStopThread = false;mThread = new Thread(new CameraWorker());mThread.start();return true;
}

在connectCamera调用的函数initializeCamera中,加上了初始化cameraId的参数,另外新写了一个函数myConnectCamera,该函数在

connectCamera基础上,加上了前后摄camera的选择操作。主要是为了方便之后的camera前后摄切换功能。

效果演示

  效果截图如下:
                (图三)                            (图四)

前后摄切换

  和闪光灯开关类似,camera切换控件ID为3。对应操作代码如下:
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == 1){initFirstPopupWindowView(v);
}else if(v.getId() == 3){                if(myVariable.myCameraID == 0){myVariable.s.height=960;myVariable.s.width=1280;myVariable.myDisplayOrientation = 2;myVariable.mOpenCvCameraView.changeCamera(myVariable.s, 1);myVariable.myCameraID = 1;}else{myVariable.s.height=1080;myVariable.s.width=1920;myVariable.myDisplayOrientation = -1;myVariable.mOpenCvCameraView.changeCamera(myVariable.s, 0);myVariable.myCameraID = 0;}}
com.example.camera_opencv_android.WTCamera
public void changeCamera(Camera.Size resolution, int cameraID){disconnectCamera();myConnectCamera((int)resolution.width, (int)resolution.height, cameraID);
}
    从代码中可以看到,点击camera切换控件之后,首先检查当前使用的camera设备:myCameraID,为0表示为后摄,为1表示为前摄。然后修改myCameraID值,表示进行了切换,接着从新设置了camera的分辨率。最后通过函数changeCamera来调用myConnectCamera,最终进行了分辨率和camera的切换。
    函数myConnectCamera,已经在之前分辨率设置功能中,做了讲解。
具体演示下载:http://download.csdn.net/detail/u011630458/9261617

基于opencv的相机之camera切换/闪光灯/边缘模式/分辨率(二)相关推荐

  1. android opencv 获取小图在大图的坐标_Android开发—基于OpenCV实现相机实时图像识别跟踪...

    利用OpenCV实现实时图像识别和图像跟踪 图像识别 什么是图像识别 图像识别,是指利用计算机对图像进行处理.分析和理解,以识别各种不同模式的目标和对像的技术.根据观测到的图像,对其中的物体分辨其类别 ...

  2. 基于OpenCV进行相机标定

    相机已经存在了很长一段时间. 随着二十世纪末廉价针孔相机的推出,相机已经在日常生活中普及.虽然价格便宜,但是成像存在严重的畸变.不过,这些畸变是固定的形式,基于标定和重映技术可以纠正畸变.此外,基于标 ...

  3. Opencv计算相机响应函数(Camera Response Function)与Radiance

    本文主要用于记录自己在学习CRF过程中遇到的一些问题. 两个论文截图 CRF模型 B = f ( V ( t ⋅ L ) ) B=f(V( t\cdot L)) B=f(V(t⋅L)) 其中 B B ...

  4. 基于opencv的相机之加密解密功能实现(十三)

    简介 本篇是对实现图片处理功能:[加密解密]实现的记录. 实现原理 在图片上滑动的时候,会有红色画笔功能,用户可以在图片上画出想要加密的文字.图像等信息.在初始化的时候,将被加密图片的所有R分量像素全 ...

  5. 记录--uniapp自定义相机 自定义界面拍照录像闪光灯切换摄像头

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 因公司业务需要,需要开发水印相机功能,而项目代码用的uniapp框架,App端只能简单调用系统的相机,无法自定义界面,在此基础上,只能开发 ...

  6. OpenCV相机校准camera calibration的实例(附完整代码)

    OpenCV相机校准camera calibration的实例 OpenCV相机校准camera calibration的实例 OpenCV相机校准camera calibration的实例 #inc ...

  7. 在Ubuntu中用Qt基于OpenCV调用大恒相机

    在Ubuntu中用Qt基于OpenCV调用大恒相机 前言 视觉萌新买了工业相机却不会用,上网也查不到具体方法,没办法只能自己硬刚了.刚开始自己摸索,碰到好多问题解决不了,Qt报错不知道咋回事,缺少的链 ...

  8. 基于OpenCV的单目相机标定与三维定位

    相机是产生图像数据的硬件,广泛应用于消费电子.汽车.安防等领域.围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等.目前大火的自动驾驶中相机也是重要的硬件组成,如环视 ...

  9. OpenCV全向相机校准Omnidirectional Camera Calibration

    OpenCV全向相机校准 全向相机校准 前言 单相机校准 立体校准 图像校正 立体声重建 全向相机校准 前言 本教程将介绍全向摄像机校准模块的以下部分: 校准单个摄像机. 校准一对立体声摄像机. 校正 ...

最新文章

  1. conda init 关闭和重启shell_Linux的/etc/init.d详解
  2. QCustomPlot使用手册(一)
  3. java %1$s_%1$s %1$d Android string (java Android 格式化字符串)
  4. java获取浏览器版本号
  5. vue封装axios接口
  6. wampServer配置WWW根目录遇到的坑
  7. 返回值 包装类_java中基本类型包装类
  8. python iterableiterator
  9. .net下汇总搜索引擎关键字编码
  10. html静态页面作业 我的家乡网站设计——我的家乡-杭州(7页) HTML+CSS+JavaScript 大学生家乡网页作品 老家网页设计作业模板 学生网页制作源代码下载
  11. 微信小程序云开发-支付
  12. 情人节程序员用HTML网页表白【粉色烂漫的七夕情人节专题页面】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  13. Linux笔记:文件共享服务Samba基础使用
  14. narwal机器人_NARWAL云鲸智能扫拖机器人,海外Kickstarter众筹销量第一
  15. html如何画出四个圆圈,css3如何绘制一个圆圆的loading转圈动画
  16. 串口发送+RAM+VGA传图
  17. 亚马逊账户安全需要做什么?亚马逊账户规则
  18. 思科路由器配置GRE隧道
  19. 计算机网络技术教程第3版课后答案,《计算机网络技术基础教程》课后习题答案刘四清版3.doc...
  20. 用pyxel 学写 Kill Virus 像素游戏

热门文章

  1. 没有一起打过飞机的哥们不是好基友
  2. centos添加java环境变量
  3. java keyframe_JavaFX图像幻灯片中的KeyFrame和持续时间
  4. 张小龙:突然搭错了神经,写了个邮件,微信就此开始!
  5. Airpods Battery Monitor Mac(AirPods电池监控器)
  6. Matlab入门 (2 )编程基础
  7. dcom 配置 我的电脑 显示红色箭头
  8. 服装产业数字化升级,低代码赋能企业柔性生产
  9. html5 隐藏video控件的下载按钮
  10. WPS表格查找替换技巧:让你的工作效率翻倍