2012-11-19 2 views
0

나는 opencv4android에서 Mat 객체의 내용을 보여주는 간단한 테스트를하고 있습니다. dump() 메서드가 작동한다는 것을 알았습니다. get() 메서드가 실패하는 동안 행렬의 모든 항목을 제공하며, 행렬에서 개별 항목을 가져 오려고했습니다. 이 두 가지 방법은 mainactivity에서 onTouchEvent로 구현되며, 하나는 잘 실행되지만 다른 하나는 프로그램을 중단시킵니다. 나는 이유를 모른다. 어떤 생각?android opencv에서 Mat를 보여주는 이상한 상황

public class puzzle15Activity extends Activity 
{ 
     Mat showMat; 
private static final String TAG = "Sample::Activity"; 
public double[] a; 
     double b; 
     private SampleCvViewBase mView=null; 
     private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) 
{ 
    @Override 
    public void onManagerConnected(int status) { 
     switch (status) { 
      case LoaderCallbackInterface.SUCCESS: 
      { 
       Log.i(TAG, "OpenCV loaded successfully"); 
       //mView = new puzzle15View(mAppContext); 
       mView=new SampleCvViewBase(mAppContext); 
       setContentView(mView); 
       mView.openCamera(); 

      } break; 
      default: 
      { 
       super.onManagerConnected(status); 
      } break; 
     } 

    } 
}; 


@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    Log.i(TAG, "onCreate"); 
    super.onCreate(savedInstanceState); 
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2,this,mOpenCVCallBack); 

} 


@Override 
public boolean onTouchEvent(MotionEvent m) 
{ 
    Toast.makeText(this,mView.mrgba.dump(),Toast.LENGTH_SHORT).show(); 
    a= mView.mrgba.get(1,1); 
       //b=a[1];//here b can't be assigned this way....... 
    //Toast.makeText(this,Double.toString(b),Toast.LENGTH_SHORT).show(); 
    return false; 
} 
} 



class SampleCvViewBase extends SurfaceView implements SurfaceHolder.Callback, Runnable { 
private static final String TAG = "Sample::SurfaceView"; 

private SurfaceHolder  mHolder; 
private VideoCapture  mCamera; 
Mat mrgba; 
public int[] list={1,2,3}; 

public SampleCvViewBase(Context context) { 
    super(context); 
    mrgba=new Mat(4,4,CvType.CV_16S); 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
} 

public boolean openCamera() { 
    synchronized (this) { 
     releaseCamera(); 
     mCamera = new VideoCapture(Highgui.CV_CAP_ANDROID); 
     if (!mCamera.isOpened()) { 
      mCamera.release(); 
      mCamera = null; 
      return false; 
     } 
    } 
    return true; 
} 

public void releaseCamera() { 
    Log.i(TAG, "releaseCamera"); 
    synchronized (this) { 
     if (mCamera != null) { 
       mCamera.release(); 
       mCamera = null; 
     } 
    } 
} 

public void setupCamera(int width, int height) { 
    Log.i(TAG, "setupCamera("+width+", "+height+")"); 
    synchronized (this) { 
     if (mCamera != null && mCamera.isOpened()) { 
      List<Size> sizes = mCamera.getSupportedPreviewSizes(); 
      int mFrameWidth = width; 
      int mFrameHeight = height; 
      { 
       double minDiff = Double.MAX_VALUE; 
       for (Size size : sizes) { 
        if (Math.abs(size.height - height) < minDiff) { 
         mFrameWidth = (int) size.width; 
         mFrameHeight = (int) size.height; 
         minDiff = Math.abs(size.height - height); 
        } 
       } 
      } 

      mCamera.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, mFrameWidth); 
      mCamera.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, mFrameHeight); 
     } 
    } 

} 

public void surfaceChanged(SurfaceHolder _holder, int format, int width, int height) { 
    Log.i(TAG, "surfaceChanged"); 
    setupCamera(width, height); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    Log.i(TAG, "surfaceCreated"); 
    (new Thread(this)).start(); 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.i(TAG, "surfaceDestroyed"); 
    releaseCamera(); 
} 

public void run() { 
    Log.i(TAG, "Starting processing thread"); 
    while (true) { 
     Bitmap bmp = null; 

     synchronized (this) { 
      if (mCamera == null) 
       break; 

      if (!mCamera.grab()) { 
       Log.e(TAG, "mCamera.grab() failed"); 
       break; 
      } 

     } 

      } 

    Log.i(TAG, "Finishing processing thread"); 
} 
} 

답변

0

나는 결코 존재하지 않는 매트릭스 구성 요소를 호출했습니다. 처음에는 행렬에 채널이 하나만 있습니다. 그것은 문제를 설명합니다. 감사.