Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.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-未调用OnPreviewFrame_Android_Opencv_Android Camera_Previewcallback - Fatal编程技术网

Android-未调用OnPreviewFrame

Android-未调用OnPreviewFrame,android,opencv,android-camera,previewcallback,Android,Opencv,Android Camera,Previewcallback,这是我的cameraPreview,我在SurfaceChanged中设置了侦听器。 我可以在应用程序中看到摄像头,但从未调用OnPreviewFrame。 下面是大部分代码 public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private static boolean DEBUGGING = true; private static final String LO

这是我的cameraPreview,我在SurfaceChanged中设置了侦听器。 我可以在应用程序中看到摄像头,但从未调用OnPreviewFrame。 下面是大部分代码

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private static boolean DEBUGGING = true;
    private static final String LOG_TAG = "CameraPreviewSample";
    private static final String CAMERA_PARAM_ORIENTATION = "orientation";
    private static final String CAMERA_PARAM_LANDSCAPE = "landscape";
    private static final String CAMERA_PARAM_PORTRAIT = "portrait";
    protected Activity mActivity;
    private SurfaceHolder mHolder;
    protected Camera mCamera;
    protected List<Camera.Size> mPreviewSizeList;
    protected List<Camera.Size> mPictureSizeList;
    protected Camera.Size mPreviewSize;
    protected Camera.Size mPictureSize;
    private int mSurfaceChangedCallDepth = 0;
    private int mCameraId;
    private LayoutMode mLayoutMode;
    private int mCenterPosX = -1;
    private int mCenterPosY;
    public Mat frame1=null;
    public Mat frame2=null;
    PreviewReadyCallback mPreviewReadyCallback = null;
    //////Alon
    public static int SENSITIVITY_VALUE = 20;
    public static int BLUR_SIZE = 10;

    public Rect objectBoundingRectangle = new Rect(0, 0, 0, 0);

    double ballAverage = 131.5;
    int frameCounter = 0;

    public static enum LayoutMode {
        FitToParent, // Scale to the size that no side is larger than the parent
        NoBlank // Scale to the size that no side is smaller than the parent
    };

    public interface PreviewReadyCallback {
        public void onPreviewReady();
    }

    /**
     * State flag: true when surface's layout size is set and surfaceChanged()
     * process has not been completed.
     */
    protected boolean mSurfaceConfiguring = false;

    public CameraPreview(Activity activity, int cameraId, LayoutMode mode) {
        super(activity); // Always necessary
        mActivity = activity;
        mLayoutMode = mode;
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            if (Camera.getNumberOfCameras() > cameraId) {
                mCameraId = cameraId;
            } else {
                mCameraId = 0;
            }
        } else {
            mCameraId = 0;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
            mCamera = Camera.open(mCameraId);
        } else {
            mCamera = Camera.open();
        }
        Camera.Parameters cameraParams = mCamera.getParameters();
        mPreviewSizeList = cameraParams.getSupportedPreviewSizes();
        mPictureSizeList = cameraParams.getSupportedPictureSizes();

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(mHolder);
        } catch (IOException e) {
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        mSurfaceChangedCallDepth++;
        doSurfaceChanged(width, height);
        mSurfaceChangedCallDepth--;
    }

    private void doSurfaceChanged(int width, int height) {
        mCamera.stopPreview();

        Camera.Parameters cameraParams = mCamera.getParameters();
        boolean portrait = isPortrait();

        // The code in this if-statement is prevented from executed again when surfaceChanged is
        // called again due to the change of the layout size in this if-statement.
        if (!mSurfaceConfiguring) {
            Camera.Size previewSize = determinePreviewSize(portrait, width, height);
            Camera.Size pictureSize = determinePictureSize(previewSize);
            if (DEBUGGING) { Log.v(LOG_TAG, "Desired Preview Size - w: " + width + ", h: " + height); }
            mPreviewSize = previewSize;
            mPictureSize = pictureSize;
            mSurfaceConfiguring = adjustSurfaceLayoutSize(previewSize, portrait, width, height);
            // Continue executing this method if this method is called recursively.
            // Recursive call of surfaceChanged is very special case, which is a path from
            // the catch clause at the end of this method.
            // The later part of this method should be executed as well in the recursive
            // invocation of this method, because the layout change made in this recursive
            // call will not trigger another invocation of this method.
            if (mSurfaceConfiguring && (mSurfaceChangedCallDepth <= 1)) {
                return;
            }
        }

        configureCameraParameters(cameraParams, portrait);
        mSurfaceConfiguring = false;

        try {
            mCamera.startPreview();
        } catch (Exception e) {
            Log.w(LOG_TAG, "Failed to start preview: " + e.getMessage());

            // Remove failed size
            mPreviewSizeList.remove(mPreviewSize);
            mPreviewSize = null;

            // Reconfigure
            if (mPreviewSizeList.size() > 0) { // prevent infinite loop
                surfaceChanged(null, 0, width, height);
            } else {
                Toast.makeText(mActivity, "Can't start preview", Toast.LENGTH_LONG).show();
                Log.w(LOG_TAG, "Gave up starting preview");
            }
        }

        if (null != mPreviewReadyCallback) {
            mPreviewReadyCallback.onPreviewReady();
        }



        //////////////////////////Alon
        if (mCamera == null) {
            return;
        }



        mCamera.setPreviewCallback(new PreviewCallback() {

            @Override
            public void onPreviewFrame(byte[] data, Camera camera) {

                Mat frame = Byte_to_Mat(data);
                if(frame1==null) {
                    frame1 = frame;
                }
                else
                {
                    if (frame2 == null)
                    {
                        frame2 = frame;
                    }
                    else
                    {
                        frame1 = frame2;
                        frame2 = frame;
                    }
                    detectBall(frame1,frame2);
                }

            }
        });
    }
    public Mat Byte_to_Mat(byte[] data) {

        Mat jpegData = new Mat(1, data.length, CvType.CV_8UC1);
        jpegData.put(0, 0, data);
        return jpegData;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        stop();
    }

    public void stop() {
        if (null == mCamera) {
            return;
        }
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public boolean isPortrait() {
        return (mActivity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
    }

    public void setOneShotPreviewCallback(PreviewCallback callback) {
        if (null == mCamera) {
            return;
        }
        mCamera.setOneShotPreviewCallback(callback);
    }

    public void setPreviewCallback(PreviewCallback callback) {
        if (null == mCamera) {
            return;
        }
        mCamera.setPreviewCallback(callback);
    }

    public Camera.Size getPreviewSize() {
        return mPreviewSize;
    }

    public void setOnPreviewReady(PreviewReadyCallback cb) {
        mPreviewReadyCallback = cb;
    }
公共类CameraPreview扩展了SurfaceView实现了SurfaceHolder.Callback{ 私有静态布尔调试=true; 私有静态最终字符串日志\u TAG=“CameraPreviewSample”; 专用静态最终字符串摄影机参数方向=“方向”; 专用静态最终字符串CAMERA_PARAM_横向=“横向”; 专用静态最终字符串照相机参数纵向=“纵向”; 保护活性; 私人地勤人员; 受保护的摄像机mCamera; 受保护列表mPreviewSizeList; 受保护列表; 受保护的摄像头。大小mPreviewSize; 受保护的摄像头。大小和大小; private int mSurfaceChangedCallDepth=0; 麦卡默雷德私人酒店; 私人布局模式mLayoutMode; 私有int-mCenterPosX=-1; 私营企业; 公共Mat frame1=null; 公共Mat frame2=null; PreviewerAyCallback MPReviewerAyCallback=null; //////阿隆 公共静态int灵敏度_值=20; 公共静态整型模糊大小=10; public Rect objectBoundingRectangle=新Rect(0,0,0,0); 双平均压载=131.5; int frameCounter=0; 公共静态枚举布局模式{ FitToParent,//缩放到没有边大于父边的大小 NoBlank//缩放到没有边小于父边的大小 }; 公共接口预览和回调{ 公共无效;无效;无效(); } /** *状态标志:当设置了曲面的布局大小并且surfaceChanged()时为true *该过程尚未完成。 */ 受保护的布尔值mSurfaceConfiguring=false; 公共CameraPreview(活动、内部cameraId、布局模式){ 超级(活动);//总是必要的 活动性=活动性; mLayoutMode=模式; mHolder=getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区); if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.gingerbrand){ if(Camera.getNumberOfCameras()>camerRAID){ mCameraId=cameraId; }否则{ mCameraId=0; } }否则{ mCameraId=0; } if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.gingerbrand){ mCamera=Camera.open(mCameraId); }否则{ mCamera=Camera.open(); } Camera.Parameters cameraParams=mCamera.getParameters(); MPReviewIzeList=cameraParams.getSupportedPreviewSizes(); mpicuteResizeList=cameraParams.getSupportedPictureSizes(); } @凌驾 已创建的公共空白表面(表面持有人){ 试一试{ mCamera.setPreviewDisplay(mHolder); }捕获(IOE异常){ mCamera.release(); mCamera=null; } } @凌驾 公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){ mSurfaceChangedCallDepth++; doSurfaceChanged(宽度、高度); mSurfaceChangedCallDepth--; } 私有void doSurfaceChanged(整数宽度、整数高度){ mCamera.stopPreview(); Camera.Parameters cameraParams=mCamera.getParameters(); 布尔纵向=isPortrait(); //当SURFACHECHANGE被禁用时,将阻止再次执行此if语句中的代码 //由于此if语句中布局大小的更改而再次调用。 如果(!mSurfaceConfiguring){ Camera.Size previewSize=确定预览大小(纵向、宽度、高度); Camera.Size pictureSize=确定图像大小(previewSize); if(调试){Log.v(Log_标记,“所需预览大小-w:+width+”,h:+height);} mPreviewSize=预览大小; mPictureSize=图片大小化; msurfaceconfiguration=调整surfacelayoutsize(预览大小、纵向、宽度、高度); //如果递归调用此方法,则继续执行此方法。 //surfaceChanged的递归调用是非常特殊的情况,它是来自 //此方法末尾的catch子句。 //该方法的后面部分也应该在递归过程中执行 //调用此方法,因为布局更改在此递归 //调用将不会触发此方法的另一次调用。 if(mSurfaceConfiguring&&(mSurfaceChangedCallDepth 0){//防止无限循环 表面更改(空、0、宽度、高度); }否则{ Toast.makeText(mActivity,“无法开始预览”,Toast.LENGTH_LONG.show(); w(Log_标签,“放弃启动预览”); } } if(null!=mprevieweradycallback){ mPreviewReadyCallback.onPreviewReady(); } //////////////////////////阿隆 if(mCamera==null){ 返回; } setPreviewCallback(新的PreviewCallback(){ @凌驾 预览帧上的公共无效(字节[]数据,摄像头){ Mat frame=字节到Mat(数据); if(frame1==null){ 框架1=框架; } 其他的 { if(frame2==null) { 框架2=框架; } 其他的 { frame1=frame2; 框架2=框架; } 探测球(第1帧、第2帧); } } }); } 公用Mat字节到Mat(字节[]数据){ Mat jpegData=新Mat(1,data.length,CvType.CV_8U