基本思想:使用Android Studio+Opencv4.5 实现滤波,并打包成apk,纯属学习~

该工程git:

https://github.com/sxj731533730/AndroidInvokeCamera.git

另一种实现摄像头获取的方法 https://blog.csdn.net/sxj731533730/article/details/117378441

第一步:首先导入opencv4.5 ,参考https://blog.csdn.net/sxj731533730/article/details/108380540

第二步,修改MainActivity内容: 原内容为:

package com.invoke.camera;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = findViewById(R.id.sample_text);tv.setText(stringFromJNI());}public native String stringFromJNI();
}

修改内容为

package com.invoke.camera;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.JavaCameraView;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.core.Size;public class MainActivity extends AppCompatActivity implements CameraBridgeViewBase.CvCameraViewListener {private final String TAG = "MainActivity";private CameraBridgeViewBase m_cameraView;static {System.loadLibrary("native-lib");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);m_cameraView = findViewById(R.id.camera_view);m_cameraView.setCvCameraViewListener(this);boolean havePermission = getPermissionCamera(this);if (havePermission) {m_cameraView.enableView();m_cameraView.setCameraPermissionGranted();}m_cameraView.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_FRONT);//前置摄像头 CameraBridgeViewBase.CAMERA_ID_BACK为后置摄像头 ; 默认后置}public static boolean getPermissionCamera(Activity activity) {if (ContextCompat.checkSelfPermission(activity,android.Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED) {String[] permissions = new String[]{Manifest.permission.CAMERA};ActivityCompat.requestPermissions(activity,permissions,0);return false;} else {return true;}}@Overridepublic void onCameraViewStarted(int width, int height) {Log.e("opencv450", "--------" + width + "-----------" + height);}@Overridepublic void onCameraViewStopped() {}@Overridepublic Mat onCameraFrame(Mat inputFrame) {Bitmap bmpCanny = Bitmap.createBitmap(inputFrame.cols(), inputFrame.rows(), Bitmap.Config.ARGB_8888);org.opencv.android.Utils.matToBitmap(inputFrame, bmpCanny);detectMat(bmpCanny);Mat ImageMat = new Mat(bmpCanny.getHeight(), bmpCanny.getWidth(), CvType.CV_8U, new Scalar(4));Bitmap myBitmap32 = bmpCanny.copy(Bitmap.Config.ARGB_8888, true);Utils.bitmapToMat(myBitmap32, ImageMat);Log.e("image ", " cols"+inputFrame.cols()+"rows"+inputFrame.rows());return ImageMat;}public native void detectMat(Bitmap bitmap);
}

第二步:修改app/src/main/res/layout/activity_main.xml和AndroidManifest.xml文件

   <org.opencv.android.JavaCamera2Viewandroid:id="@+id/camera_view"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible"tools:layout_editor_absoluteX="0dp"tools:layout_editor_absoluteY="0dp"app:show_fps="true"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera" android:required="true"/><uses-feature android:name="android.hardware.camera.autofocus" android:required="true"/>

第三步:修改opencv 的android头文件 org/opencv/android/CameraBridgeViewBase.java

这个解决方案 查了好久 主要解决 手机 无法自动全屏的问题

  Matrix matrix = new Matrix(); // I rotate it with minimal processif (getDisplay().getRotation() == Surface.ROTATION_0) {matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);matrix.postRotate(90f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );canvas.drawBitmap(mCacheBitmap, matrix, new Paint());} else if (getDisplay().getRotation() == Surface.ROTATION_90) {float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );canvas.drawBitmap(mCacheBitmap, matrix, new Paint());} else if (getDisplay().getRotation() == Surface.ROTATION_180) {matrix.preTranslate((canvas.getWidth() - mCacheBitmap.getWidth()) / 2,(canvas.getHeight() - mCacheBitmap.getHeight()) / 2);matrix.postRotate(270f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );canvas.drawBitmap(mCacheBitmap, matrix, new Paint());} else if (getDisplay().getRotation() == Surface.ROTATION_270) {matrix.postRotate(180f,(canvas.getWidth()) / 2,(canvas.getHeight()) / 2);float scale = (float) canvas.getWidth() / (float) mCacheBitmap.getHeight();matrix.postScale(scale, scale, canvas.getWidth()/2 , canvas.getHeight()/2 );canvas.drawBitmap(mCacheBitmap, matrix, new Paint());}

第四步:写入JNI的c++模块的滤波的代码

#include <jni.h>
#include <string>
#include <opencv2/imgproc.hpp>
#include <android/bitmap.h>
using namespace cv;
extern "C"
JNIEXPORT void JNICALL
Java_com_invoke_camera_MainActivity_detectMat(JNIEnv *env, jobject thiz, jobject bitmap) {AndroidBitmapInfo inBmpInfo;void *inPixelsAddress;int ret;if ((ret = AndroidBitmap_getInfo(env, bitmap, &inBmpInfo)) < 0) {return ;}if ((ret = AndroidBitmap_lockPixels(env, bitmap, &inPixelsAddress)) < 0) {}Mat rgbaImage;rgbaImage.create(inBmpInfo.height, inBmpInfo.width, CV_8UC4);Mat inMat(inBmpInfo.height, inBmpInfo.width, CV_8UC4, inPixelsAddress);cv::bitwise_not(inMat,inMat);   //修改bitmap地址内容// 对inMat 操作 就是对java的bitmap 进行操作cvtColor(inMat, rgbaImage, COLOR_mRGBA2RGBA);Mat bgr;bgr.create(inBmpInfo.height, inBmpInfo.width, CV_8UC3);cvtColor(rgbaImage, bgr, COLOR_RGBA2BGR);//正常显示图片rgbaImage imwrite() 显示AndroidBitmap_unlockPixels(env,bitmap);rgbaImage.release();inMat.release();bgr.release();}

上个拍摄画面,庆祝一下(处理的图片),也可以使用图片反色工具,线下将图片还原http://www.ssbbww.com/h/al.aspx

5、Android Studio+JNI+Opencv4.5 调用系统相机,实现图像滤波相关推荐

  1. Android多层嵌套Fragment中调用系统相机拍照以及裁剪的相关问题解决

    多层嵌套Fragment中调用系统相机拍照.裁剪 最近公司项目有频繁使用相机拍照的需求,然后频繁的实际使用过程中遇到很多大大小小的坑,在此记录下. (ps.关于一些拍照后图片旋转.裁剪设置返回数据为t ...

  2. android studio 调用c++,android studio配置opencv,调用c++,处理图像

    一.下载安卓的opencv sdk 这里下载release版的,下载后解压 二.新建工程 三.编写界面布局(工程等下上传到github) 四.添加Module,Android Studio菜单--&g ...

  3. Android Studio 配置OpenCV4.4.0 不用安装OpenCV Manager (泪崩居然用了礼拜天2天的时间居然还没配置成功,今天又看了下配置成功了)

    Android Studio 配置OpenCV4.4.0 ,说来惭愧居然用户礼拜天2天的时间呢,期间遇到的问题大致有4个问题 这里我也总结出了最后在列举出来,(可能是新版和之前旧版本不一样的问题按照网 ...

  4. Android调用系统相机和相册(更换微信头像)

    最近做了调用系统相机和相册,在其他博客中看到还有对图像进行剪切,大家都知道,我们在玩微信的时候,头像更换是方形图片,接下来我们就对这种情况具体进行描述: 必要的权限: <uses-permiss ...

  5. Android学习之调用系统相机实现拍照功能

    一.今天,来介绍如何调用系统自带的相机进行拍照,主要有以下2种实现的方式: 1.Camera应用程序包含了一个意图过滤器,即intent filter,它使得开发人员能够提供与Camera应用程序同等 ...

  6. 关于Android 4.4(华为)调用系统相机问题

    最近使用测试机(华为,4.4系统)调用系统相机进行拍照时,点击拍照完成,手机又反回了拍照页面,此时应该setResult上一个页面,但是上一个页面的onActivityResult没有被调用,大概有些 ...

  7. Android调用系统相机拍照并保存到指定位置

    Android调用系统相机拍照并保存到指定位置 @Click(R.id.btn_takePhoto)void onclick() {Intent intent = new Intent(MediaSt ...

  8. Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题

    Android开发 调用系统相机相册图片功能,解决小米手机拍照或者图片横竖相反问题,及小米手机相册图片路径问题 1.调用相机,兼容7.0 AndroidManifest配置 <providera ...

  9. android调用系统相机返回图片模糊

    最近需要用到调用系统相机拍摄照片的功能,于是就直接调用系统的相机进行拍照,发现返回的bitmap存储之后都是非常模糊的 调用系统相机拍摄照片,由于StartActivityForResult过时,改用 ...

最新文章

  1. thinkphp实现登录后返回原界面
  2. 排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法
  3. webapck将css 打包后单独提取到一个css文件中
  4. Python 打印不换行
  5. 三十七 Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中...
  6. phpunit autoload.php,关于php:Composer不会创建所有需要的phpunit包含路径
  7. PyTorch系列入门到精通——DataLoader与Dataset
  8. kubernetes endpoints是什么
  9. 怎么修改图片大小尺寸?
  10. rxbus 源码_RxBus 这个 RxBus 稳如老狗 @codeKK Android开源站
  11. 系统管理员已经限制你可以使用的登录类型(网络或交互式)
  12. 山石网科张凌龄:安全市场日新月异 初创公司不容小觑
  13. 【安全牛】一起来打靶第二周
  14. 如何开好项目验收会?
  15. 关于PostgreSQL的绑定变量窥视的问题详解
  16. 《此生,若你安好.便是晴天》 -- @ShinePug
  17. 第九周-求一元二次函数的根
  18. OA项目之部门管理的功能实现
  19. html两个tab页面,html如何实现tab页面切换
  20. 日常中文短句翻译英文有哪些好方法?

热门文章

  1. 重庆大学计算机学院 罗辛,罗辛-中国科学院大学-UCAS
  2. 微信小程序,封装同步请求
  3. Python 情感分析
  4. 将uniapp项目运行到微信开发者工具上
  5. java代码实现万年历
  6. 清华OJ重名剔除(Deduplicate)
  7. 小鑫吃苹果 3105
  8. 通过Navicat快速更改数据库名称
  9. 程序员最值得加入的200家国产替代软件公司汇总!!!
  10. Python时间与日期操作(datetime、time、calendar)