2017-10-13 3 views
6

this library for GPUImage processing을 사용하고 있습니다.AndroidFastImageProcessing에서 3 개의 입력에 대해 MultiInputFilter가 작동하지 않습니다.

iOS GPUImage 라이브러리에서와 같이 필터를 병렬로 실행하려고하는데 하나의 필터에 3 입력을 추가하는 동안 MultiInputFilter을 확장하는 동안 문제가 발생합니다. 나는 결합하는 것을 시도하고있다

  1. BasicCameraInputFilter
  2. CannyEdgeDetectionFilter
  3. BasicCameraInputFilter 직접 카메라 입력입니다
  4. SobelEdgeDetectionFilter

.

BasicCameraInputFilter cameraInput = new BasicCameraInputFilter(); 
CannyEdgeDetectionFilter cannyEdgeDetectionFilter = new CannyEdgeDetectionFilter(1.0f,0.3f,0.6f); 
SobelEdgeDetectionFilter sobelEdgeDetectionFilter = new SobelEdgeDetectionFilter(); 
CombinationFilter combinationFilter = new CombinationFilter(); 

cameraInput.addTarget(combinationFilter); 
cannyEdgeDetectionFilter.addTarget(combinationFilter); 
sobelEdgeDetectionFilter.addTarget(combinationFilter); 
combinationFilter.registerFilterLocation(cameraInput,0); 
combinationFilter.registerFilterLocation(cannyEdgeDetectionFilter,1); 
combinationFilter.registerFilterLocation(sobelEdgeDetectionFilter,2); 
combinationFilter.addTarget(this); 

registerInitialFilter(cameraInput); 
registerFilter(cannyEdgeDetectionFilter); 
registerFilter(sobelEdgeDetectionFilter); 
registerTerminalFilter(combinationFilter); 

여기 library 사용중인 일자 밖으로 나는 저자가 2015 년부터 활성화되지 않았기 때문에 그가 유지되고 있다고 생각하지 않습니다 내 CombinationFilter

"precision mediump float;\n" 
+"uniform sampler2D " + UNIFORM_TEXTURE0 + ";\n" 
+"uniform sampler2D " + UNIFORM_TEXTUREBASE + 1 + ";\n" 
+"uniform sampler2D " + UNIFORM_TEXTUREBASE + 2 + ";\n" 
+"varying vec2 " + VARYING_TEXCOORD + ";\n" 

+"void main(){\n" 
+" vec4 color1 = texture2D(" + UNIFORM_TEXTURE0 + ", " + VARYING_TEXCOORD + ");\n" 
+" vec4 color2 = texture2D(" + UNIFORM_TEXTUREBASE + 1 + ", " + VARYING_TEXCOORD + ");\n" 
+" vec4 color3 = texture2D(" + UNIFORM_TEXTUREBASE + 2 + ", " + VARYING_TEXCOORD + ");\n" 

+" vec4 whiteColor = vec4(1.0);\n" 
+" whiteColor.r = color1.r * color2.r * color3.r;\n" 
+" whiteColor.g = color1.g * color2.g * color3.g;\n" 
+" whiteColor.b = color1.b * color2.b * color3.b;\n" 
+" gl_FragColor = whiteColor;\n" 
+"}\n"; 
+0

발생하는 문제점은 무엇입니까? – Brian

+1

잘 정의 된 예제를 게시했습니다. 그러나 문제는 무엇입니까? 오류 메시지 또는 예기치 않은 결과의 스크린 샷을 표시 할 수 있습니까? – Rabbid76

+0

오류가없고 그냥 작동하지 않으며 디버그 쉐이더를 제대로 처리 할 수 ​​없습니다 .. – Thesoham24

답변

4

내 조각 쉐이더입니다. 안드로이드에서 이미지를 조작하려고한다면 opencv을 사용할 것입니다. 다음은 Canny와 Sobel 필터를 결합하는 방법입니다.

public class ImageManipulationsActivity extends Activity implements CvCameraViewListener2 { 
    private static final String TAG     = "OCVSample::Activity"; 

    private CameraBridgeViewBase mOpenCvCameraView; 

    private Mat     mIntermediateMat; 

    public static int   viewMode = VIEW_MODE_RGBA; 

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { 
     @Override 
     public void onManagerConnected(int status) { 
      switch (status) { 
       case LoaderCallbackInterface.SUCCESS: 
       { 
        Log.i(TAG, "OpenCV loaded successfully"); 
        mOpenCvCameraView.enableView(); 
       } break; 
       default: 
       { 
        super.onManagerConnected(status); 
       } break; 
      } 
     } 
    }; 

    public ImageManipulationsActivity() { 
     Log.i(TAG, "Instantiated new " + this.getClass()); 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     Log.i(TAG, "called onCreate"); 
     super.onCreate(savedInstanceState); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 


     mOpenCvCameraView = new CameraBridgeViewBase(this); 
     mOpenCvCameraView.setCvCameraViewListener(this); 

     setContentView(mOpenCvCameraView); 
    } 

    @Override 
    public void onPause() 
    { 
     super.onPause(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    @Override 
    public 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_3_0_0, this, mLoaderCallback); 
     } else { 
      Log.d(TAG, "OpenCV library found inside package. Using it!"); 
      mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); 
     } 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     if (mOpenCvCameraView != null) 
      mOpenCvCameraView.disableView(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     Log.i(TAG, "called onCreateOptionsMenu"); 
     return false; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     Log.i(TAG, "called onOptionsItemSelected; selected item: " + item); 

     return false; 
    } 

    public void onCameraViewStarted(int width, int height) { 
     mIntermediateMat = new Mat(); 
    } 

    public void onCameraViewStopped() { 
     // Explicitly deallocate Mats 
     if (mIntermediateMat != null) 
      mIntermediateMat.release(); 

     mIntermediateMat = null; 
    } 

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     Mat rgba = inputFrame.rgba(); 
     Size sizeRgba = rgba.size(); 

     Mat rgbaInnerWindow; 


      rgbaInnerWindow = rgba.submat(top, top + height, left, left + width); 
      Imgproc.Canny(rgbaInnerWindow, mIntermediateMat, 80, 90); 

      Mat grayInnerWindow = gray.submat(top, top + height, left, left + width); 
      Imgproc.Sobel(mIntermediateMat, grayInnerWindow, CvType.CV_8U, 1, 1); 
      Core.convertScaleAbs(grayInnerWindow, mIntermediateMat, 10, 0); 
      Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4); 
      grayInnerWindow.release(); 
      rgbaInnerWindow.release(); 


     return rgba; 
    } 
} 
+0

간단한 대답 Niza에게 감사하지만 GPU에서 opencv가 작동합니까? – Thesoham24

+1

네이티브 코드 (C++) –

관련 문제