关于版本
下载地址 现在使用3.5.5 版本
https://opencv.org/
关于使用java 中
直接导入sdk 就可以
创建项目的时候要是kotlin 版本的
我导入的
其中没有修改什么东西
调整了一下 targetSdkVersion 32 版本
然后写demo 测试是否成功了。
demo
//openCV4Android 需要加载用到
private val mLoaderCallback:BaseLoaderCallback = object: BaseLoaderCallback(this) {
override fun onManagerConnected(status: Int) {
if (status == LoaderCallbackInterface.SUCCESS) {
Log.i("TAG", "OpenCV loaded successfully");
/*案例四*/
val imageFromAssetsFile = ImageTools.getImageFromAssetsFile(applicationContext, "123.jpg")
val procSrc2Gray = OpenCvUtils.procSrc2Gray(imageFromAssetsFile)
binding.ivResult.setImageBitmap(procSrc2Gray)
} else {
super.onManagerConnected(status);
}
}
};
/**
* open cv 处理
*
* @param srcBitmap
* @return
*/
public static Bitmap procSrc2Gray(Bitmap srcBitmap) {
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
Bitmap grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
return grayBitmap;
}
这里显得就很简单了。
关于使用 c ++ 部分
创建俩个文件
里面放置什么东西呢?
我的是这样的。。
怎么让android studio 加载呢。有的把libs 放到android 项目里面的lib中也是可以的。
我这里放到一块了。
这里的lib 是可以变的。所以这里写对地址就行了额
这些都是主要的
#导入头文件
include_directories(include)
#导入库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}")
find_library(
log-lib
log
)
target_link_libraries(
app
jnigraphics
opencv_java4
${log-lib}
)
开始使用
导入
导入这里opencv.cpp,看方法里面有没有报错了。没有报错基本上环境ok了
开始写一个图片变灰色
基本方法就是
cvtColor(sourceMat, grayMat, CV_BGRA2GRAY);
结果
c++ 代码
//#include "include/opencv2/core/hal/interface.h"
#include "include/opencv2/imgproc/types_c.h"
//#include "include/opencv2/imgproc.hpp"
//using namespace std;
using namespace cv;
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_example_app_CppUtils_doGray(JNIEnv *env, jobject thiz, jintArray source, jint width,
jint height) {
jint *input;
input = env->GetIntArrayElements(source, JNI_FALSE);
Mat sourceMat(height, width, CV_8UC4, (unsigned char *) input);
Mat grayMat;
cvtColor(sourceMat, grayMat, CV_BGRA2GRAY);
Mat resultMat;
cvtColor(grayMat, resultMat, CV_GRAY2BGRA);
int size = width * height;
jintArray result = env->NewIntArray(size);
uchar *output = resultMat.data;
env->SetIntArrayRegion(result, 0, size, (const jint *) output);
env->ReleaseIntArrayElements(source, input, 0);
return result;
}
java 处理代码
/**
* opencv 变灰色
*/
external fun doGray(imgData: IntArray?, width: Int, height: Int): IntArray?
/**
* opencv 变灰色
*/
fun imgToGrayActive(source: Bitmap): Bitmap? {
val width = source.width
val height = source.height
val pixel = IntArray(width * height)
source.getPixels(pixel, 0, width, 0, 0, width, height)
val grayPixels: IntArray? = doGray(pixel, width, height)
val gray = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
gray.setPixels(grayPixels, 0, width, 0, 0, width, height)
return gray
}
mainactivity 中的使用
至此 告终。。。
感谢
https://www.jianshu.com/p/4871d3dee4fa
https://article.itxueyuan.com/oJDOl1
https://blog.csdn.net/weixin_55626853/article/details/124059445
https://www.freesion.com/article/35731468524/
https://developer.android.google.cn/studio/projects/add-native-code.html#create-sources