Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

安卓SDK集成问题 #52

Closed
qwonderkid opened this issue Apr 16, 2024 · 2 comments
Closed

安卓SDK集成问题 #52

qwonderkid opened this issue Apr 16, 2024 · 2 comments

Comments

@qwonderkid
Copy link

尝试把gpupixel接入一个安卓项目。首先使用example中的GPUPixelSourceCamera类可以正常工作。想拿到输出图像的数据做进一步处理。之前在windows平台集成sdk使用sourceImage输入处理画面并用captureAProcessedFrameData()方法也可以正常工作。在安卓中调用几帧后崩溃,附调用代码和堆栈图。请问是否可以指点一下

@qwonderkid
Copy link
Author

package com.pixpark.GPUPixelApp;

import static android.widget.Toast.LENGTH_LONG;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Camera;
import android.os.Bundle;
import android.util.Log;
import android.util.Size;
import android.view.SurfaceHolder;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;

import com.pixpark.GPUPixelApp.camera.CameraXHelper;
import com.pixpark.GPUPixelApp.camera.CustomLifecycleOwner;
import com.pixpark.GPUPixelApp.databinding.ActivityMainBinding;
import com.pixpark.gpupixel.GPUPixel;
import com.pixpark.gpupixel.GPUPixelSource;
import com.pixpark.gpupixel.GPUPixelSourceImage;
import com.pixpark.gpupixel.GPUPixelSourceRawInput;
import com.pixpark.gpupixel.filter.BeautyFaceFilter;
import com.pixpark.gpupixel.filter.FaceReshapeFilter;
import com.pixpark.gpupixel.GPUPixelSourceCamera;
import com.pixpark.gpupixel.GPUPixelView;
import com.pixpark.gpupixel.filter.LipstickFilter;
import com.pixpark.gpupixel.filter.BlusherFilter;

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private static final int CAMERA_PERMISSION_REQUEST_CODE = 200;
private static final String TAG = "GPUPixelDemo";

private GPUPixelSourceCamera sourceCamera;
private GPUPixelView surfaceView;
private BeautyFaceFilter beautyFaceFilter;
private FaceReshapeFilter faceReshapFilter;
private LipstickFilter lipstickFilter;
private  BlusherFilter blusherFilter;
private GPUPixelSourceImage sourceImage;
private SeekBar smooth_seekbar;
private SeekBar whiteness_seekbar;
private SeekBar face_reshap_seekbar;
private SeekBar big_eye_seekbar;
private SeekBar lipstick_seekbar;
private SeekBar blusher_seekbar;
private  SeekBar foreheadwid_seekbar;

private ActivityMainBinding binding;

ImageView imageview;
private CameraXHelper cameraXHelper;
private CustomLifecycleOwner customLifecycleOwner;

private  byte[] pixel;

GPUPixelSource.ProcessedFrameDataCallback callback = new GPUPixelSource.ProcessedFrameDataCallback() {
    @Override
    public void onResult(Bitmap result) {
        int pixelCount = result.getWidth() * result.getHeight();
        Log.d("BitmapLength", "Bitmap pixel data length: " + pixelCount);

    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());

    // get log path
    String path = getExternalFilesDir("gpupixel").getAbsolutePath();
    Log.i(TAG, path);

    GPUPixel.setContext(this);
    // 保持屏幕常亮
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    // preview
    surfaceView = binding.surfaceView;
    surfaceView.setMirror(true);

    blusher_seekbar = binding.bluserSeekbar;

    imageview = binding.imageview;


    cameraXHelper=new CameraXHelper(this);


    customLifecycleOwner=new CustomLifecycleOwner();

    cameraXHelper.addListener(new CameraXHelper.OnFrameListener() {
        @Override
        public void onFrame(byte[] data, int width, int height, boolean isBack) {
            int[] rbga=new int[width*height];
            GPUPixel.nativeYUVtoRBGA(data,width,height,rbga);

            Bitmap bitmap=rgbaToBitmap(rbga,height,width);
            imageview.setImageBitmap(bitmap);
            if(sourceImage != null && faceReshapFilter != null) {
                sourceImage.setImage(bitmap);
                sourceImage.proceed();
                GPUPixel.getInstance().requestRender();
                sourceImage.captureAProcessedFrameData(faceReshapFilter, width,height,callback);

            }
        }
    });


    blusher_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            blusherFilter.setBlendLevel(progress/5.0f);

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });


    foreheadwid_seekbar = binding.foreheadwidSeekbar;

    foreheadwid_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            faceReshapFilter.setForeheadWidthLevel(progress / 100.0f);


        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });


    smooth_seekbar = binding.smoothSeekbar;
    smooth_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            faceReshapFilter.setFaceLengthLevel(-progress / 100.0f);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    whiteness_seekbar = binding.whitenessSeekbar;
    whiteness_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            beautyFaceFilter.setWhiteLevel(progress / 10.0f);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });


    face_reshap_seekbar = binding.thinfaceSeekbar;
    face_reshap_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            faceReshapFilter.setThinLevel(progress / 200.0f);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    big_eye_seekbar = binding.bigeyeSeekbar;
    big_eye_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            faceReshapFilter.setThinCheekLevel(progress / 100.0f);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    lipstick_seekbar = binding.lipstickSeekbar;
    lipstick_seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            faceReshapFilter.setJawWidthLevel(progress / 100.0f);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    //
    this.checkCameraPermission();

}
public static Bitmap rgbaToBitmap(int[] rgba, int w, int h){
    return Bitmap.createBitmap(rgba, w, h, Bitmap.Config.ARGB_8888);
}

public void startCameraFilter() {

    Size size=new Size(640,480);
    cameraXHelper.startCamera(customLifecycleOwner,size);

    // 美颜滤镜
    beautyFaceFilter = new BeautyFaceFilter();
    faceReshapFilter = new FaceReshapeFilter();
    lipstickFilter = new LipstickFilter();
    blusherFilter = new BlusherFilter();

    // camera
    //sourceCamera = new GPUPixelSourceCamera(this.getApplicationContext());
    sourceImage = new GPUPixelSourceImage(null);
    //filter
    sourceImage.addTarget(lipstickFilter);
    lipstickFilter.addTarget(faceReshapFilter);
    faceReshapFilter.addTarget(beautyFaceFilter);
    beautyFaceFilter.addTarget(blusherFilter);
    blusherFilter.addTarget(surfaceView);

    sourceImage.setLandmarkCallbck(new GPUPixel.GPUPixelLandmarkCallback() {
        @Override
        public void onFaceLandmark(float[] landmarks) {
            faceReshapFilter.setFaceLandmark(landmarks);
            lipstickFilter.setFaceLandmark(landmarks);
            blusherFilter.setFaceLandmark(landmarks);
        }
    });


    // set default value
    // beautyFaceFilter.setSmoothLevel(0.5f);
    // beautyFaceFilter.setWhiteLevel(0.4f);
}


public void checkCameraPermission() {
    // 检查相机权限是否已授予
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        // 如果未授予相机权限,向用户请求权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST_CODE);
    } else {
        startCameraFilter();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            startCameraFilter();
        } else {
            Toast.makeText(this, "No Camera permission!", LENGTH_LONG);
        }
    }
}


public void surfaceCreated(SurfaceHolder holder) {
    sourceCamera.setPreviewHolder(holder);
}

@Override
public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(@NonNull SurfaceHolder holder) {

}

}

@qwonderkid
Copy link
Author

2024-04-16 10:13:44.454 18882-18908 libc com.pixpark.gpupixeldemo A Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x100000010 in tid 18908 (GLThread 2137), pid 18882 (rk.gpupixeldemo)
2024-04-16 10:13:44.614 18956-18956 DEBUG pid-18956 A pid: 18882, tid: 18908, name: GLThread 2137 >>> com.pixpark.gpupixeldemo <<<
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #00 pc 00000000001a3248 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::Source::updateTargets(long)+212) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #1 pc 00000000001a3154 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::Source::proceed(bool, long)+72) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #2 pc 000000000010bf4c /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::FaceMakeupFilter::proceed(bool, long)+7816) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #3 pc 000000000012cfc0 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::Filter::update(long)+1580) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #4 pc 000000000012d0a0 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (non-virtual thunk to gpupixel::Filter::update(long)+36) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #5 pc 00000000001a32a4 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::Source::updateTargets(long)+304) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #6 pc 00000000001a3154 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (gpupixel::Source::proceed(bool, long)+72) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #7 pc 00000000002588e4 /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/lib/arm64/libgpupixel.so (Java_com_pixpark_gpupixel_GPUPixel_nativeSourceProceed+96) (BuildId: 717c77cce68743ed053f91c46e7073768105833c)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #15 pc 00000000000023a8 [anon:dalvik-classes3.dex extracted in memory from /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/base.apk!classes3.dex] (com.pixpark.gpupixel.GPUPixelSource$4.run+32)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #18 pc 000000000000213e [anon:dalvik-classes3.dex extracted in memory from /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/base.apk!classes3.dex] (com.pixpark.gpupixel.GPUPixelRenderer.runAll+26)
2024-04-16 10:13:44.693 18956-18956 DEBUG pid-18956 A #21 pc 00000000000020ca [anon:dalvik-classes3.dex extracted in memory from /data/app/~~MRiQLZE6DXOm3GNMT1FPdw==/com.pixpark.gpupixeldemo-9Fb4S55b7JRFQwvnArgEFQ==/base.apk!classes3.dex] (com.pixpark.gpupixel.GPUPixelRenderer.onDrawFrame+14)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant