android --Opencv

1,129 阅读3分钟

收藏的链接

实时显示 Opencv处理后的Camera图像 AndroidStudio NDK方法

blog.csdn.net/u010677365/…

OpenCV4Android开发实录(3):数字图像基础与OpenCV开发入门

blog.csdn.net/AndrExpert/…

OpenCV4 Android 调用摄像头

blog.csdn.net/chy555chy/a…

从零开始学习Android OpenCV

github.com/onlyloveyd/…

android 采集摄像头预览帧,使用opencv和MediaCodec直接录制水印滤镜视频

blog.csdn.net/u013147734/…

Android 通过cmake的方式接入opencv

www.jianshu.com/p/410422e8d…

Android基于CMake进行OpenCV开发配置

www.jianshu.com/p/9f5758c36…

使用过程中容易出现的错误

  • 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块拼图

middle_img_v2_6f32c795-4c26-441e-ae82-5bfffe24a94g.jpg

CameraCalibration 棋盘格标定

middle_img_v2_6de140ce-2bed-495d-940e-c224e845c77g.jpg

ColorBlobDetection 颜色团块追踪

middle_img_v2_24a034dd-78a6-4743-ae12-2029f981421g.jpg

face_detection 人脸检测

middle_img_v2_a2d02296-5301-4308-ab6e-a37122fb74eg.jpg

ImageManipulations 图像处理

Histograms 直方图

middle_img_v2_4c7aa451-f849-4ceb-a2bd-b72f6430f78g.jpg

Canny 边缘检测

middle_img_v2_ed29e81b-76cb-45b6-a356-e3fa5c0e54fg.jpg

Sepia 色调变换

middle_img_v2_71a6426e-125a-47cc-ace0-72e75884c9ag.jpg

Sobel 边缘检测

middle_img_v2_416c9ae4-e1fc-4c96-8327-4a8bebc64cfg.jpg

Zoom 放大镜

middle_img_v2_35f17cca-1971-469c-bf8e-1e188679448g.jpg

Pixelize 像素化

middle_img_v2_dfb583bb-ef5e-42c0-9bde-417286b0c70g.jpg

Posterize 色调分离

middle_img_v2_4bc452df-444b-4498-858d-102de2b7681g.jpg

Tutorial1Camerapreview 左上角有fps

image.png

Tutorial2Mixedprocessing 混合处理

middle_img_v2_f6209469-47ce-4376-843b-6e2a6bb84c7g.jpg

gray 灰度图

middle_img_v2_964abc1c-6b94-4984-af17-b1c833c3dc1g.jpg

Canny 边缘检测

middle_img_v2_5692278e-3d81-4a20-8291-e3cc84aa76cg.jpg

find feature 特征检测

middle_img_v2_cf8ddfc6-9f5b-45ad-8dac-e9ff63bf211g.jpg

Tutorial3Cameracontrol 相机控制

middle_img_v2_5c7a549f-e7b9-4df0-82fe-1acfc50e3e3g.jpg

Resolution 分辨率

middle_img_v2_94b2ab4e-8878-4efb-a626-5b58fcc8c5dg.jpg

遇到的问题

预览旋转90度

找到CameraBridgeViewBasedeliverAndDrawFrame 方法,添加以下代码

image.png

/*----------------------------修改预览旋转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度问题--------------------------------*/

image.png

菜单menu不显示

找到src/main/java/org/opencv/android/CameraActivity.java文件,将Activity改成AppCompatActivity

image.png

无法加载动态库

E/OpenCV/StaticHelper: OpenCV error: Cannot load info library for OpenCV

java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

image.png

在app下的build.gradle中的cmake里面添加 arguments "-DANDROID_STL=c++_shared"

image.png

还是不行的话,需要新建一个CMakeLists.txt文件,然后在app下的build.gradle中添加

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
        version "3.10.2"
    }
}

path对应文件的路径

image.png

找不到动态库

3 files found with path 'lib/arm64-v8a/libopencv_java4.so' from inputs: image.png 在app下的build.gradle中添加

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

将opencv打包成aar

下载Android版本的opencvsdk

opencv官网 -> Library -> Releases ->选择Android图标,

下载地址 : opencv430

image.png

新建一个空项目,名字随便起,用不到这个

建好之后左上角File -> New -> New Module

image.png

如果需要添加c++代码,选择Android Native Library, 这里opencv 已经编译好了so文件,所以选择Android Liabrary即可。

image.png

Module namePakage name 改为自己喜欢的。其他的我就是按默认的,然后点finish。

新建jniLibs目录

在项目app/src/main目录下新建jniLibs,并将解压后的OpenCv Sdk 目录下对应的路径 sdk/native/libs 中的文件复制到jniLibs。

image.png

image.png

复制java代码

将解压后的 opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\src下的org文件复制到项目的src/main/java目录下 image.png

image.png

找不到import org.opencv.engine.OpenCVEngineInterface;

image.png

在org.opencv.engine这个包名存在一个aidl的类,所以需要新建aidl目录来存放

新建aidl目录

在src/main目录下新建Directry

image.png

选择aidl

image.png

新建org.opencv.engin目录,将文件拷贝过来 image.png

清单文件

有一些关于R的错误,需要将解压后的opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\res下的AndroidManifest,复制到项目的src\main目录下,进行覆盖

image.png

image.png

image.png

res 文件

需要将解压后的opencv-4.3.0-android-sdk\OpenCV-android-sdk\sdk\java\values目录下的attrs,复制到项目的src\main\res\values目录下

image.png

image.png

生成aar

找到Android studio 右侧的gradle,找到对应的opencv430,双击Tasks/build/下的assemble,等电脑嗡嗡响一小会儿,底部出现successful,就可以在项目的build/outputs/aar中找到生成的aar文件了

image.png

  //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
        }

    }