收藏的链接
实时显示 Opencv处理后的Camera图像 AndroidStudio NDK方法
OpenCV4Android开发实录(3):数字图像基础与OpenCV开发入门
OpenCV4 Android 调用摄像头
从零开始学习Android OpenCV
android 采集摄像头预览帧,使用opencv和MediaCodec直接录制水印滤镜视频
Android 通过cmake的方式接入opencv
Android基于CMake进行OpenCV开发配置
使用过程中容易出现的错误
-
OpenCV Error:Assertion failed (scn ==3 || scn==4) in unknown function, file ......\modules\imgproc\src\color.cpp, line 2433
OpenCV中你用cvtColor(frame, current_gray, CV_RGB2GRAY);在转彩色到灰度的时候, 要求frame是3通道或者4通道的, 如果程序运行到某一帧frame为空的情况下,再执行cvtColor(frame, current_gray, CV_RGB2GRAY)也会报错。
samples 示例效果
Puzzle15 将摄像头数据显示成15块拼图
CameraCalibration 棋盘格标定
ColorBlobDetection 颜色团块追踪
face_detection 人脸检测
ImageManipulations 图像处理
Histograms 直方图
Canny 边缘检测
Sepia 色调变换
Sobel 边缘检测
Zoom 放大镜
Pixelize 像素化
Posterize 色调分离
Tutorial1Camerapreview 左上角有fps
Tutorial2Mixedprocessing 混合处理
gray 灰度图
Canny 边缘检测
find feature 特征检测
Tutorial3Cameracontrol 相机控制
Resolution 分辨率
遇到的问题
预览旋转90度
找到CameraBridgeViewBase的deliverAndDrawFrame 方法,添加以下代码
/*----------------------------修改预览旋转90度问题--------------------------------*/
canvas.rotate(90,0,0);
float scale= canvas.getWidth() / (float)mCacheBitmap.getHeight();
float scale2= canvas.getHeight() / (float)mCacheBitmap.getWidth();
if(scale2> scale){
scale = scale2;
}
if (scale!= 0) {
canvas.scale(scale,scale,0,0);
}
canvas.drawBitmap(mCacheBitmap, 0, -mCacheBitmap.getHeight(), null);
/*----------------------------修改预览旋转90度问题--------------------------------*/
菜单menu不显示
找到src/main/java/org/opencv/android/CameraActivity.java文件,将Activity改成AppCompatActivity
无法加载动态库
E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV
java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
在app下的build.gradle中的cmake里面添加 arguments "-DANDROID_STL=c++_shared"
还是不行的话,需要新建一个CMakeLists.txt文件,然后在app下的build.gradle中添加
externalNativeBuild {
cmake {
path "CMakeLists.txt"
version "3.10.2"
}
}
path对应文件的路径
找不到动态库
3 files found with path 'lib/arm64-v8a/libopencv_java4.so' from inputs:
在app下的build.gradle中添加
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
将opencv打包成aar
下载Android版本的opencvsdk
opencv官网 -> Library -> Releases ->选择Android图标,
下载地址 : opencv430
新建一个空项目,名字随便起,用不到这个
建好之后左上角File -> New -> New Module
如果需要添加c++代码,选择Android Native Library, 这里opencv 已经编译好了so文件,所以选择Android Liabrary即可。
Module name和Pakage name 改为自己喜欢的。其他的我就是按默认的,然后点finish。
新建jniLibs目录
在项目app/src/main目录下新建jniLibs,并将解压后的OpenCv Sdk 目录下对应的路径 sdk/native/libs 中的文件复制到jniLibs。
复制java代码
将解压后的 opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\src下的org文件复制到项目的src/main/java目录下
找不到import org.opencv.engine.OpenCVEngineInterface;
在org.opencv.engine这个包名存在一个aidl的类,所以需要新建aidl目录来存放
新建aidl目录
在src/main目录下新建Directry
选择aidl
新建org.opencv.engin目录,将文件拷贝过来
清单文件
有一些关于R的错误,需要将解压后的opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\res下的AndroidManifest,复制到项目的src\main目录下,进行覆盖
res 文件
需要将解压后的opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\values目录下的attrs,复制到项目的src\main\res\values目录下
生成aar
找到Android studio 右侧的gradle,找到对应的opencv430,双击Tasks/build/下的assemble,等电脑嗡嗡响一小会儿,底部出现successful,就可以在项目的build/outputs/aar中找到生成的aar文件了
//opencvForAndroid 读取视频文件
private void readvideo (String str) {
Mat frameRGB = new Mat();
VideoCapture cap = new VideoCapture();
try{
cap.open(str);
int i =0;
while (measuring) {
// 读取视频帧
cap.read(frameRGB);
//视频结束后 中断循环
if (frameRGB.empty()){
MyLogUtil.e("frameRGB.empty()");
break;
}
MyLogUtil.e(String.valueOf(i));
if (measuring) {
opencvHelper.onPreviewDataUpdate(frameRGB,WIDTH,HEIGHT,WIDTH, HEIGHT,90,1);
}
}
} catch (Exception e) {
/// handle error
}
}