Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android opencv中显示Mat的奇怪情况_Android_Opencv - Fatal编程技术网

android opencv中显示Mat的奇怪情况

android opencv中显示Mat的奇怪情况,android,opencv,Android,Opencv,我正在做一个简单的测试来显示opencv4android中Mat对象的内容。我发现dump()方法有效,它提供了矩阵的所有条目,而get()方法失败,我打算从矩阵中获取单个条目。这两种方法在mainactivity的onTouchEvent中实现,一种执行良好,另一种使程序崩溃。我不知道为什么。有什么想法吗 public class puzzle15Activity extends Activity { Mat showMat; private static final String

我正在做一个简单的测试来显示opencv4android中Mat对象的内容。我发现dump()方法有效,它提供了矩阵的所有条目,而get()方法失败,我打算从矩阵中获取单个条目。这两种方法在mainactivity的onTouchEvent中实现,一种执行良好,另一种使程序崩溃。我不知道为什么。有什么想法吗

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");
}
}
公共类活动扩展活动
{
垫showMat;
私有静态最终字符串TAG=“Sample::Activity”;
公共双[]a;
双b;
私有SampleCvViewBase mView=null;
专用BaseLoaderCallback mOpenCVCallBack=新BaseLoaderCallback(此)
{
@凌驾
已连接管理器上的公共无效(int状态){
开关(状态){
案例加载程序CallbackInterface.SUCCESS:
{
Log.i(标记“OpenCV已成功加载”);
//mView=新视图(mAppContext);
mView=新的SampleCvViewBase(mAppContext);
setContentView(mView);
mView.openCamera();
}中断;
违约:
{
超级管理器已连接(状态);
}中断;
}
}
};
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
Log.i(标记“onCreate”);
super.onCreate(savedInstanceState);
initAsync(OpenCVLoader.OPENCV_VERSION_2_4_2,this,mOpenCVCallBack);
}
@凌驾
公共事件(MotionEvent m)
{
Toast.makeText(this,mView.mrgba.dump(),Toast.LENGTH_SHORT.show();
a=mView.mrgba.get(1,1);
//b=a[1];//这里b不能这样分配。。。。。。。
//Toast.makeText(this,Double.toString(b),Toast.LENGTH_SHORT.show();
返回false;
}
}
类SampleCvViewBase扩展了SurfaceView实现了SurfaceHolder.Callback,Runnable{
私有静态最终字符串TAG=“Sample::SurfaceView”;
私人地勤人员;
私有视频捕获mCamera;
Mat-mrgba;
公共int[]列表={1,2,3};
公共SampleCvViewBase(上下文){
超级(上下文);
mrgba=新垫(4,4,CvType.CV_16S);
mHolder=getHolder();
mHolder.addCallback(this);
}
公共布尔openCamera(){
已同步(此){
松开摄像头();
mCamera=新的视频捕获(Highgui.CV\u CAP\u ANDROID);
如果(!mCamera.isOpened()){
mCamera.release();
mCamera=null;
返回false;
}
}
返回true;
}
公共无效释放摄影机(){
Log.i(标签“释放摄像头”);
已同步(此){
if(mCamera!=null){
mCamera.release();
mCamera=null;
}
}
}
公共摄像机(整数宽度、整数高度){
Log.i(标签,“设置摄像头(“+宽度+”,“+高度+”);
已同步(此){
if(mCamera!=null&&mCamera.isOpened()){
列表大小=mCamera.getSupportedPreviewSizes();
int mFrameWidth=宽度;
int mframehight=高度;
{
double minDiff=double.MAX_值;
用于(尺寸:尺寸){
if(数学绝对值(尺寸高度-高度)
哎呀,我错误地调用了不存在的矩阵组件。最初,矩阵只有一个通道。这就解释了问题所在。谢谢