opencvを使用してAndroidで写真を処理する

1. opencv
OpenCVは、Linux、Windows、Android、およびMac OSオペレーティングシステムで実行できるBSDライセンス(オープンソース)に基づくクロスプラットフォームのコンピュータービジョンおよび機械学習ソフトウェアライブラリです。軽量で効率的です。一連の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

2.
最初にロードしてコンパイルしてAndroidプロジェクトを作成し、次にFile-New-Import Moduleをロードして、ダウンロードしたSDKに。\ sdk \ javaパスをインポートしてから、動的ライブラリをインポートして、。\ sdk \ native \ libsの下にパッケージ化します。 lib。
現時点では、コンパイルは常にエラーを報告しており、libc ++ _ shared.soパッケージが欠落しており、オンラインで検出および導入されており、コンパイルは成功しています。
プロジェクトディレクトリは次のとおりです。opencvはインポートされたモジュールであり、jniLibsはインポートされた動的ライブラリパッケージパスです。
opencvを使用してAndroidで写真を処理する
次の構成
は、主にコンパイル中にlibc ++ _ shared.soパッケージがないという問題を解決するために、構成ファイルbuild.grdle(:app)のdefaultConfigに追加されます。インターネットで見つかった説明によると、バージョンの違いにより、libopencv_java4にはsoパッケージがないため、コンパイルするときは、libc ++ _shared.soをコンパイルしてlibbディレクトリに配置するふりをします。

ndk{
    abiFilters "armeabi ","armeabi-v7a"
}

呼び出されたメインアクティビティに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;
            }
        }
    };

3、画像ズーム

                    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();
                    }

4、画像変換

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();

おすすめ

転載: blog.51cto.com/xuepiaoqiyue/2542755