前言
现组建了一个Android的水友圈,有Android的高级UI及跨平台技术,还有jvm性能优化等材料;能够从初始Android到Android进阶视频学习,包含Android开源实战,文末有进圈形式。
1. OpenCV 装置
OpenCV 是一个计算视觉的开源库,次要算法波及图像处理和机器学习。是 Intel 公司奉献进去的,因为它能够收费利用在商业和钻研畛域,且国内大多数图像处理相干的应用程序中都采纳的是 OpenCV,因而前面很大一部分内容咱们都基于 OpenCV 来讲。官网给咱们封装了很多 java 层的接口,但总的来说可扩展性不是很高,因而前面咱们次要采纳 c++ 来写,而后本人编译成 so 库来供 Android 调用。为了便于办法和算法的解说,咱们临时基于 VS 环境来编写代码,也能够间接基于 android 环境开发。接下来咱们一步步来搭建 VS 的开发环境: 首先咱们找到 opencv 的官网 opencv.org/opencv-4-0-… ,目前最高版本是 4.0 点击 Win pack 进行下载。下载下来是一个 exe 文件,咱们不要装置间接解压就好。找到 build\x64\vc14\bin 下,把目录进行拷贝配置环境变量:
而后新建 VS 空我的项目,找到菜单栏的 调试窗口 -> 属性 -> 配置属性 -> VC++ 目录:
在蕴含目录和库目录中新增咱们 opencv 的解压目录。而后咱们写一个简略实例测试能即可:
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; void main(){ // 本地读取一张图片 Mat src = imread("C:/Users/hcDarren/Desktop/android/NDK/NDK_Day56/test1.jpg"); Mat gray; // 转灰度 cvtColor(src, gray, COLOR_BGR2GRAY); // 将灰度图显示到窗口 namedWindow("test pic",CV_WINDOW_NORMAL); imshow("test pic", gray); waitKey(0); } 复制代码
大家依照我这个配置去做,可能还是会遇到很多问题。但所有的问题都离不开两个方面,一个是头文件,一个是实现的 dll 动静库。
2. Android 滤镜成果
咱们来看一个比拟常见同时也是非常简单的例子,关上 QQ 空间发说说图片时会有一个滤镜性能,咱们能够本人先去看看那些滤镜成果。 实现这样的成果有多种计划,Java 层用 ColorMatrix 矩阵来实现,Java 层操作 Bitmap 像素,Native 层操作 Bitmap 像素指针等等。这里我把三种计划都写上,心愿大家可能做到触类旁通。以黑白图转灰度图为例:
2.1 Java 层用 ColorMatrix 矩阵来实现
public static Bitmap gary(Bitmap bitmap) { Bitmap gary = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); Canvas canvas = new Canvas(gary); Paint paint = new Paint(); // 比拟风行的办法。几个加权系数0.3,0.59,0.11是依据人的亮度感知零碎调节进去的参数,是个宽泛应用的标准化参数 ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 0.30f, 0.59f, 0.11f, 0, 0, 0.30f, 0.59f, 0.11f, 0, 0, 0.30f, 0.59f, 0.11f, 0, 0, 0, 0, 0, 1f, 0 }); ColorMatrixColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix); paint.setColorFilter(colorFilter); canvas.drawBitmap(bitmap, 0, 0, paint); return gary; }复制代码
2.2 Java 层操作 Bitmap 像素
public static Bitmap gary(Bitmap bitmap) { int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()]; bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); for (int i = 0; i < pixels.length; i++) { int pixel = pixels[i]; int a = (pixel >> 24) & 0xff; int r = (pixel >> 16) & 0xff; int g = (pixel >> 8) & 0xff; int b = pixel & 0xff; int gery = (int) (0.30f * r + 0.59f * g + 0.11f * b); pixels[i] = (a << 24) | (gery << 16) | (gery << 8) | gery; } Bitmap gary = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); gary.setPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight()); return gary; }复制代码
2.3 Native 层操作 Bitmap 像素指针
extern "C" JNIEXPORT void JNICALL Java_com_ndk_day51_BitmapUtil_gary(JNIEnv *env, jclass type, jobject bitmap) { // 获取 Bitmap 信息 AndroidBitmapInfo bitmapInfo; AndroidBitmap_getInfo(env, bitmap, &bitmapInfo); // 锁定画布 void *pixels; AndroidBitmap_lockPixels(env, bitmap, &pixels); for (int i = 0; i < bitmapInfo.width * bitmapInfo.height; ++i) { uint32_t *p_pixel = reinterpret_cast<uint32_t *>(pixels) + i; uint32_t pixel = *p_pixel; int a = (pixel >> 24) & 0xff; int r = (pixel >> 16) & 0xff; int g = (pixel >> 8) & 0xff; int b = pixel & 0xff; int gery = r * 0.3f + g * 0.59f + b * 0.11f; *p_pixel = (a << 24) | (gery << 16) | (gery << 8) | gery; } // 解锁画布 AndroidBitmap_unlockPixels(env, bitmap); }复制代码
如果咱们不是很理解矩阵的操作,能够去 Google 查查材料。下面的代码也还会有些许问题,如果咱们想用到我的项目中还得好好思考思考。
总结:
Android学习、面试;文档、视频资源收费获取》,可复制链接后用石墨文档 App 或小程序关上链接或者私信我材料支付。
https://shimo.im/docs/TG8PDh9…