AndroidはOpenCVを使って、両眼裸眼の3 D画像を合成します(Native方法を推奨します).


NativeではOpenCVを使用します.
Nativeを使うメリット:-OpenCV Managerをインストールする必要がない-java層のOpenCV方法を熟知する必要がない-C/C++を使用して移植しやすいです.
CMakeを使う
CMakeLists.txtの設定
cmake_minimum_required(VERSION 3.6)

############################################
#      opencv-sdk  ,      include   
############################################
#OpenCV
set(CMAKE_VERBOSE_MAKEFILE on)

#Path
set(OpenCVNative_DIR E:/MyDocuments/Android/AndroidWorkSpace/OpenCV-android-sdk/sdk/native)

#libs
set(libs ${OpenCVNative_DIR}/libs)

#include
include_directories(${OpenCVNative_DIR}/jni/include)

#    opencv .so 
add_library(libopencv_java3 
            SHARED 
            IMPORTED)

set_target_properties(libopencv_java3 PROPERTIES
    IMPORTED_LOCATION "${libs}/${ANDROID_ABI}/libopencv_java3.so")

#  c  
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -fexceptions -frtti")

#   nativelib
add_library( native-lib
             SHARED
             src/main/cpp/native-lib.cpp)

#      
find_library( log-lib
              log )

#  native     
target_link_libraries( native-lib android log
                       libopencv_java3
                       ${log-lib} )
app build.gradleを設定します.
以下は完全なbuild.gradleであり、3点に注意してください.-externalNativeBuildにはcmakeのコンパイル属性が配置されています.例えば、使用するcppflags、コンパイルプロセッサプラットフォーム-sourceSetsにopencvを追加するnativeライブラリのパス-CMakeLists.txtのパスです.
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.righere.test"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions -std=c++11"
                abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
            }
        }
    }
    sourceSets{
        main{
            jniLibs.srcDirs = ['E:\\MyDocuments\\Android\\AndroidWorkSpace\\OpenCV-android-sdk\\sdk\
ative\\libs'
] } } externalNativeBuild { cmake { path "CMakeLists.txt" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
OpenCVの例
以下は一例で簡単にOpencv 4 Android Nativeの使用を理解します.Demoの機能は左右のフォーマットの両眼画像を裸眼3 Dの画像に変換して、android裸眼表示装置に表示します.
native-lib
携帯電話の双眼画像を分割し、裸眼の画像RGB画素に合成し、RGBデータをBitemapのカラーデータに変換し、最後にjava上層部のBitmapに表示する.
画像を分割
    IplImage* srcImg = cvLoadImage("/sdcard/convexd.jpg", CV_LOAD_IMAGE_COLOR);
    int width = w;
    int height = h;
    int IMAGE_SIZE = srcImg->height * srcImg->widthStep;
    IplImage* dstImg[2];
    IplImage* viewImg[2];

    dstImg[0] = cvCreateImage(cvSize(srcImg->width/2, srcImg->height), srcImg->depth, srcImg->nChannels);
    dstImg[1] = cvCreateImage(cvSize(srcImg->width/2, srcImg->height), srcImg->depth, srcImg->nChannels);
    viewImg[0] = cvCreateImage(cvSize(width, height), srcImg->depth, srcImg->nChannels);
    viewImg[1] = cvCreateImage(cvSize(width, height), srcImg->depth, srcImg->nChannels);

    for(int i = 0; i < srcImg->height; i++)
    {
        memcpy(dstImg[0]->imageData + (i * dstImg[0]->widthStep), srcImg->imageData + i * srcImg->widthStep,
               dstImg[0]->widthStep);
    }
    for(int i = 0; i < srcImg->height; i++)
    {
        memcpy(dstImg[1]->imageData + (i * dstImg[1]->widthStep), srcImg->imageData + (int)(srcImg->widthStep) * 1 / 2  + i * srcImg->widthStep,
               dstImg[1]->widthStep);
    }
上ではメモリをコピーして画像を分割したり、opencv内蔵のcvSetImageROI関数を使って画像をカットしたりすることができます.
cvSetImageROI(srcImg, cvRect(0, 0, srcImg->width*0.5, srcImg->height));
cvCopy(srcImg, dstImg[0]);
cvSetImageROI(srcImg, cvRect(srcImg->width*0.5, 0, srcImg->width*0.5, srcImg->height));
cvCopy(srcImg, dstImg[1]);
cvResetImageROI(srcImg);
画像を拡大縮小
    cvResize(dstImg[0], viewImg[0], CV_INTER_LINEAR);
    cvResize(dstImg[1], viewImg[1], CV_INTER_LINEAR);
画像を合成し、rgbサブピクセルデータをColorデータに変換する.
先に私の前の編を見てもいいです.http://blog.csdn.net/danjuan123/article/details/78437110
BitmapはsRGB配列を用いて充填されるので、まずRGBサブピクセル配列を変換します.
    int size = width * height;
    int* outImgrgb = new int[size];
    for(int i = 0; i <  height * width / 2; i ++)
    {
        outImgrgb[2*i] = 0xff;
        outImgrgb[2*i] = (outImgrgb[2*i] << 8) + viewImg[0]->imageData[2*i * 3 + 2];
        outImgrgb[2*i] = (outImgrgb[2*i] << 8) + viewImg[0]->imageData[2*i * 3 + 1];
        outImgrgb[2*i] = (outImgrgb[2*i] << 8) + viewImg[0]->imageData[2*i * 3];

        outImgrgb[2*i + 1] = 0xff;
        outImgrgb[2*i + 1] = (outImgrgb[2*i + 1] << 8) + viewImg[1]->imageData[(2*i + 1) * 3 + 2];
        outImgrgb[2*i + 1] = (outImgrgb[2*i + 1] << 8) + viewImg[1]->imageData[(2*i + 1) * 3 + 1];
        outImgrgb[2*i + 1] = (outImgrgb[2*i + 1] << 8) + viewImg[1]->imageData[(2*i + 1) * 3];
    }
カラーデータを返します
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, outImgrgb);
javaでの設定
// Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
        System.loadLibrary("opencv_java3");
    }

/**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native int[] splitter(int w, int h);

    private void splitPic(){
        if(splitStatus){
            int[] resultInt = splitter(w, h);
            Bitmap resultImg = Bitmap.createBitmap(resultInt, w, h, Bitmap.Config.ARGB_8888);
            imageView.setImageBitmap(resultImg);
            mButton_split.setText("Unsplit");
            splitStatus = false;
            Toast.makeText(this,"OpenCV_native_split_picture_success",Toast.LENGTH_SHORT).show();
        }
        else{
            imageView.setImageResource(R.drawable.convexd);
            mButton_split.setText("Split");
            splitStatus = true;
            Toast.makeText(this,"Original",Toast.LENGTH_SHORT).show();
        }
    }
最後の効果:
githubプロジェクトの住所を添付します.https://github.com/righere/Free3DPicture.git