一万年来谁著史,三千里外欲封侯。这篇文章主要讲述Android中用opencv处理图片相关的知识,希望能为你提供帮助。
【Android中用opencv处理图片】一、opencv
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。
opencv官方下载请添加链接描述
我下载的是opencv-4.4.0-android-sdk
二、加载编译
先创建个Android工程,然后File-New-Import Module,导入我们下载好的sdk中的.sdkjava路径,然后将.sdk
ativelibs下的动态库so包引入到lib下。
此时编译老是报错,缺少一个libc++_shared.so的包,网上找到并引入,编译成功。
工程目录如下,opencv即导入的module,jniLibs是引入的动态库包路径。
文章图片
其中配置文件build.grdle(:app)中
defaultConfig中加入配置如下,主要是为了解决上面说的编译时缺少libc++_shared.so包的问题。网上找到的解释是,因为版本差异,libopencv_java4中没有这个so包,所以要编译时假装编译出了我们放在libb目录下的libc++_shared.so。
ndk{
abiFilters "armeabi ","armeabi-v7a"
}
调用的主activity中加载opencv
@Override
protected void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}//openCV4Android 需要加载用到
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.setOnTouchListener(ColorBlobDetectionActivity.this);
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
三、图片缩放
final String oldPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.jpg";
final String newPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_new.jpg";
double scale = 0.1;
// 缩放比例long start = new Date().getTime();
Mat img = Imgcodecs.imread(oldPath);
// 读入图片,将其转换为Mat
Size dsize = new Size(img.width() * scale, img.height() * scale);
// 设置新图片的大小
Mat img2 = new Mat(dsize, CvType.CV_16S);
// 创建一个新的Mat(opencv的矩阵数据类型)
Imgproc.resize(img, img2,dsize);
//调用Imgproc的Resize方法,进行图片缩放if(Imgcodecs.imwrite(newPath, img2)){//将图形保存到new.jpg中
File f = new File(newPath);
if(f.exists())
{
bm=BitmapFactory.decodeFile(newPath);
imgview.setImageBitmap(bm);
long end = new Date().getTime();
Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start));
Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 3).show();
}
}
else{
Toast.makeText(ButtonSizeImage.this, "===========图片缩小失败============!!", 3).show();
}
四、图片转格式
final String webpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test.webp";
final String newWebpPath = Environment.getExternalStorageDirectory() + "/rfid/opencv_test_2.jpg";
long start = new Date().getTime();
Mat img = Imgcodecs.imread(webpPath);
// 读入图片,将其转换为Mat
Imgcodecs.imwrite(newWebpPath, img);
Log.d(TAG, "start:"+start+"===end:"+end + "=====" + (end-start));
Toast.makeText(ButtonSizeImage.this, "start:"+start+"===end:"+end + "=====" + (end-start), 4).show();
推荐阅读
- 解决Mac下AndroidStudio内容时卡顿
- 这个毒奶色到底是啥来头啊?杨幂说的毒奶色是啥梗?_新浪微博
- 怎样看微信群内人员的王者荣耀排行?_微信
- 宋仲基宋慧乔带字搞笑表情包:给你一个眼神自己体会_其它聊天
- 麦当劳金拱门表情包大全:这是一个新的开始_其它聊天
- 空间留言板弹幕怎样关?
- 李维嘉筷子门事件告诉我们:不要随便晒朋友圈_微信
- 微信信用卡还款啥时候收费?微信信用卡还款收费规范_微信
- 微信红包发不出去说异常怎样办?_微信