结合使用USB相机和智能手机相机

时间:2019-02-28 13:49:54

标签: android opencv usb-camera

我试图通过将USB摄像头连接到智能手机并使用智能手机摄像头来捕获两个图像,即一个。我使用了来自github(https://github.com/jiangdongguo/AndroidUSBCamera)的代码从USB摄像头捕获图像。另一方面,我正在尝试使用OPENCV从智能手机相机捕获图像。

根据我的代码,我可以使用USB相机捕获图像并为移动相机执行相机预览,但是无法捕获图像。以下是我的活动。

    public class USBCameraActivity extends AppCompatActivity implements CameraDialog.CameraDialogParent, CameraViewInterface.Callback, CameraBridgeViewBase.CvCameraViewListener2{

    @BindView(R.id.camera_view)
    public View mTextureView;

    @BindView(R.id.seekbar_brightness)
    public SeekBar mSeekBrightness;
    @BindView(R.id.seekbar_contrast)
    public SeekBar mSeekContrast;
    @BindView(R.id.switch_rec_voice)
    public Switch mSwitchVoice;

    myJavaCameraView cameraBridgeViewBase;



    private static final String TAG="USBCameraActivity";
    // myJavaCameraView myJavaCameraView;
    ImageButton mCaptureButton;
    ImageButton mCaptureButton2;
    Mat rgb;


    private BaseLoaderCallback baseLoaderCallback=new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case BaseLoaderCallback.SUCCESS:
                    cameraBridgeViewBase.enableView();
                    break;
                default:
                    super.onManagerConnected(status);
                    break;
            }
        }
    };


    private UVCCameraHelper mCameraHelper;
    private CameraViewInterface mUVCCameraView;
    private AlertDialog mDialog;

    private boolean isRequest;
    private boolean isPreview;

    private UVCCameraHelper.OnMyDevConnectListener listener = new UVCCameraHelper.OnMyDevConnectListener() {

        @Override
        public void onAttachDev(UsbDevice device) {
            if (mCameraHelper == null || mCameraHelper.getUsbDeviceCount() == 0) {
                showShortMsg("check no usb camera");
                return;
            }
            // request open permission
            if (!isRequest) {
                isRequest = true;
                if (mCameraHelper != null) {
                    mCameraHelper.requestPermission(0);
                }
            }
        }

        @Override
        public void onDettachDev(UsbDevice device) {
            // close camera
            if (isRequest) {
                isRequest = false;
                mCameraHelper.closeCamera();
                showShortMsg(device.getDeviceName() + " is out");
            }
        }

        @Override
        public void onConnectDev(UsbDevice device, boolean isConnected) {
            if (!isConnected) {
                showShortMsg("fail to connect,please check resolution params");
                isPreview = false;
            } else {
                isPreview = true;
                showShortMsg("connecting");
                // initialize seekbar
                // need to wait UVCCamera initialize over
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Looper.prepare();
                        if(mCameraHelper != null && mCameraHelper.isCameraOpened()) {
                            mSeekBrightness.setProgress(mCameraHelper.getModelValue(UVCCameraHelper.MODE_BRIGHTNESS));
                            mSeekContrast.setProgress(mCameraHelper.getModelValue(UVCCameraHelper.MODE_CONTRAST));
                        }
                        Looper.loop();
                    }
                }).start();
            }
        }

        @Override
        public void onDisConnectDev(UsbDevice device) {
            showShortMsg("disconnecting");
        }
    };
    @SuppressLint("NewApi")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_usbcamera);
        //ButterKnife.bind(this);
        //initView();




        //mCaptureButton2.setOnClickListener(mOnClickListener2);

        // step.1 initialize UVCCameraHelper
        mUVCCameraView = (CameraViewInterface) mTextureView;
        mUVCCameraView.setCallback(this);
        mCameraHelper = UVCCameraHelper.getInstance();
        mCameraHelper.setDefaultFrameFormat(UVCCameraHelper.FRAME_FORMAT_YUYV);
        mCameraHelper.initUSBMonitor(this, mUVCCameraView, listener);

        cameraBridgeViewBase=  (myJavaCameraView) findViewById(R.id.java_camera_view);
        cameraBridgeViewBase.setVisibility(JavaCameraView.VISIBLE);
        cameraBridgeViewBase.setCvCameraViewListener(this);

        mCaptureButton= (ImageButton) findViewById(R.id.capture_button);
        mCaptureButton.setVisibility(View.VISIBLE);
        mCaptureButton.setOnClickListener(mOnClickListener);

        mCaptureButton2=(ImageButton) findViewById(R.id.capture_button2);
        mCameraHelper.setOnPreviewFrameListener(new AbstractUVCCameraHandler.OnPreViewResultListener() {
            @Override
            public void onPreviewResult(byte[] nv21Yuv) {

            }
        });





                }




    @Override
    protected void onResume(){
        super.onResume();
        if(OpenCVLoader.initDebug()){
            Log.i(TAG,"success");
            baseLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);

        }
        else{
            Log.d(TAG,"Unsuccessful");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11,this,baseLoaderCallback);
        }


    }




    private void initView() {


        mSeekBrightness.setMax(100);
        mSeekBrightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(mCameraHelper != null && mCameraHelper.isCameraOpened()) {
                    mCameraHelper.setModelValue(UVCCameraHelper.MODE_BRIGHTNESS,progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
        mSeekContrast.setMax(100);
        mSeekContrast.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if(mCameraHelper != null && mCameraHelper.isCameraOpened()) {
                    mCameraHelper.setModelValue(UVCCameraHelper.MODE_CONTRAST,progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        // step.2 register USB event broadcast
        if (mCameraHelper != null) {
            mCameraHelper.registerUSB();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        // step.3 unregister USB event broadcast
        if (mCameraHelper != null) {
            mCameraHelper.unregisterUSB();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_toobar, menu);
        return true;
    }

    protected final View.OnClickListener mOnClickListener=new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.capture_button:
                    if(mCameraHelper==null || !mCameraHelper.isCameraOpened()){
                        showShortMsg("Camera Open Failed");
                    }
                    String picPath = UVCCameraHelper.ROOT_PATH + "test_"+System.currentTimeMillis()
                            + UVCCameraHelper.SUFFIX_JPEG;



                    mCameraHelper.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
                        @Override
                        public void onCaptureResult(String path) {
                            Log.i(TAG,"save path:" + path);



                        }
                    });

                    break;


                case R.id.capture_button2:

                    Date sdf=new Date();
                    String currentDateandtime=sdf.toString();
                    String filename=Environment.getExternalStorageDirectory().getPath()+currentDateandtime+".jpeg";

                    cameraBridgeViewBase.takePicture(filename);
                    Toast.makeText(USBCameraActivity.this, "Picture has been taken ", Toast.LENGTH_LONG).show();
                    Log.d(TAG, "Path " + filename);
            }



        }
    };








    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.menu_recording:
                if (mCameraHelper == null || !mCameraHelper.isCameraOpened()) {
                    showShortMsg("sorry,camera open failed");
                    return super.onOptionsItemSelected(item);
                }
                if (!mCameraHelper.isPushing()) {
                    String videoPath = UVCCameraHelper.ROOT_PATH + System.currentTimeMillis();
                    FileUtils.createfile(FileUtils.ROOT_PATH + "test666.h264");
                    // if you want to record,please create RecordParams like this
                    RecordParams params = new RecordParams();
                    params.setRecordPath(videoPath);
                    params.setRecordDuration(0);
                    params.setVoiceClose(mSwitchVoice.isChecked());    // is close voice
                    mCameraHelper.startPusher(params, new AbstractUVCCameraHandler.OnEncodeResultListener() {
                        @Override
                        public void onEncodeResult(byte[] data, int offset, int length, long timestamp, int type) {
                            // type = 1,h264 video stream
                            if (type == 1) {
                                FileUtils.putFileStream(data, offset, length);
                            }
                            // type = 0,aac audio stream
                            if(type == 0) {

                            }
                        }

                        @Override
                        public void onRecordResult(String videoPath) {
                            Log.i(TAG,"videoPath = "+videoPath);
                        }
                    });
                    // if you only want to push stream,please call like this
                    // mCameraHelper.startPusher(listener);
                    showShortMsg("start record...");
                    mSwitchVoice.setEnabled(false);
                } else {
                    FileUtils.releaseFile();
                    mCameraHelper.stopPusher();
                    showShortMsg("stop record...");
                    mSwitchVoice.setEnabled(true);
                }
                break;
            case R.id.menu_resolution:
                if (mCameraHelper == null || !mCameraHelper.isCameraOpened()) {
                    showShortMsg("sorry,camera open failed");
                    return super.onOptionsItemSelected(item);
                }
                showResolutionListDialog();
                break;
            case R.id.menu_focus:
                if (mCameraHelper == null || !mCameraHelper.isCameraOpened()) {
                    showShortMsg("sorry,camera open failed");
                    return super.onOptionsItemSelected(item);
                }
                mCameraHelper.startCameraFoucs();
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    private void showResolutionListDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(USBCameraActivity.this);
        View rootView = LayoutInflater.from(USBCameraActivity.this).inflate(R.layout.layout_dialog_list, null);
        ListView listView = (ListView) rootView.findViewById(R.id.listview_dialog);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(USBCameraActivity.this, android.R.layout.simple_list_item_1, getResolutionList());
        if (adapter != null) {
            listView.setAdapter(adapter);
        }
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                if (mCameraHelper == null || !mCameraHelper.isCameraOpened())
                    return;
                final String resolution = (String) adapterView.getItemAtPosition(position);
                String[] tmp = resolution.split("x");
                if (tmp != null && tmp.length >= 2) {
                    int widht = Integer.valueOf(tmp[0]);
                    int height = Integer.valueOf(tmp[1]);
                    mCameraHelper.updateResolution(widht, height);
                }
                mDialog.dismiss();
            }
        });

        builder.setView(rootView);
        mDialog = builder.create();
        mDialog.show();
    }


    private List<String> getResolutionList() {
        List<Size> list = mCameraHelper.getSupportedPreviewSizes();
        List<String> resolutions = null;
        if (list != null && list.size() != 0) {
            resolutions = new ArrayList<>();
            for (Size size : list) {
                if (size != null) {
                    resolutions.add(size.width + "x" + size.height);
                }
            }
        }
        return resolutions;
    }


    protected void onDestroy() {
        super.onDestroy();
        FileUtils.releaseFile();
        // step.4 release uvc camera resources
        if (mCameraHelper != null) {
            mCameraHelper.release();
        }
        if (cameraBridgeViewBase!=null)
            cameraBridgeViewBase.disableView();
    }

    private void showShortMsg(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public USBMonitor getUSBMonitor() {
        return mCameraHelper.getUSBMonitor();
    }

    @Override
    public void onDialogResult(boolean canceled) {
        if (canceled) {
            showShortMsg("取消操作");
        }
    }

    public boolean isCameraOpened() {
        return mCameraHelper.isCameraOpened();
    }

    @Override
    public void onSurfaceCreated(CameraViewInterface view, Surface surface) {
        if (!isPreview && mCameraHelper.isCameraOpened()) {
            mCameraHelper.startPreview(mUVCCameraView);
            isPreview = true;
        }
    }

    @Override
    public void onSurfaceChanged(CameraViewInterface view, Surface surface, int width, int height) {

    }

    @Override
    public void onSurfaceDestroy(CameraViewInterface view, Surface surface) {
        if (isPreview && mCameraHelper.isCameraOpened()) {
            mCameraHelper.stopPreview();
            isPreview = false;
        }
    }

    @Override
    public void onCameraViewStarted(int width, int height) {
        rgb=new Mat(height,width,CvType.CV_8UC4);


    }

    @Override
    public void onCameraViewStopped() {
        rgb.release();

    }

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
        rgb=inputFrame.rgba();
        return rgb;
    }
    }
////////////////////////////////////////////////////    
/////The following is the activity_usbcamera.xml////
////////////////////////////////////////////////////

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ff000000"
        tools:context=".view.USBCameraActivity"
        tools:ignore="MergeRootFrame">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="@color/colorPrimary"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:navigationIcon="@null"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

        <com.serenegiant.usb.widget.UVCCameraTextureView
            android:id="@+id/camera_view"
            android:layout_width="match_parent"
            android:layout_height="255dp"
            android:layout_alignTop="@id/toolbar"
            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_marginStart="0dp"
            android:layout_marginLeft="0dp"
            android:layout_marginTop="2dp" />

        <ImageButton
            android:id="@+id/capture_button"
            android:layout_width="54dp"
            android:layout_height="48dp"

            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginStart="5dp"
            android:layout_marginLeft="5dp"
            android:layout_marginEnd="325dp"
            android:layout_marginRight="325dp"
            android:layout_marginBottom="21dp"
            android:background="@null"
            android:scaleType="centerCrop"
            android:src="@android:drawable/ic_menu_camera" />


        <ImageButton
            android:id="@+id/capture_button2"
            android:layout_width="54dp"
            android:layout_height="48dp"

            android:layout_alignParentStart="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginStart="330dp"
            android:layout_marginLeft="330dp"
            android:layout_marginEnd="0dp"
            android:layout_marginRight="0dp"
            android:layout_marginBottom="10dp"
            android:background="@null"
            android:scaleType="centerCrop"
            android:src="@android:drawable/ic_menu_camera"
            android:visibility="visible" />

        <LinearLayout
            android:id="@+id/llayout_contrast"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="10dp"
            android:orientation="horizontal"
            android:visibility="invisible">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingTop="7dp"
                android:paddingBottom="7dp"
                android:text="(contrast)"
                android:textColor="@color/colorWhite"
                android:visibility="invisible" />

            <SeekBar
                android:id="@+id/seekbar_contrast"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/llayout_brightness"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_above="@id/llayout_contrast"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginBottom="-29dp"
            android:orientation="horizontal"
            android:visibility="invisible">

            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:paddingTop="7dp"
                android:paddingBottom="7dp"
                android:text="(brightness)"
                android:textColor="@color/colorWhite"
                android:visibility="invisible" />

            <SeekBar
                android:id="@+id/seekbar_brightness"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:visibility="invisible" />
        </LinearLayout>

        <Switch
            android:id="@+id/switch_rec_voice"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/llayout_brightness"
            android:layout_alignStart="@+id/llayout_brightness"
            android:layout_below="@+id/toolbar"
            android:layout_marginLeft="13dp"
            android:layout_marginStart="13dp"
            android:layout_marginTop="27dp"
            android:checked="true"
            android:text="closeVoice"
            android:textColor="@color/colorWhite" />

        <com.jiangdg.usbcamera.view.myJavaCameraView
            android:id="@+id/java_camera_view"
            android:layout_width="396dp"
            android:layout_height="257dp"
            android:layout_alignStart="@+id/llayout_contrast"
            android:layout_alignParentTop="true"
            android:layout_marginTop="294dp" />


    </RelativeLayout>

//////////////////////////////////////////////////////////////////    
////////    The following is the myJavaCameraView.java///////////
////////////////////////////////////////////////////////////////    
        package com.jiangdg.usbcamera.view;

        import android.content.Context;
        import android.hardware.Camera;
        import android.util.AttributeSet;
        import android.util.Log;
        import android.view.SurfaceView;

        import org.opencv.android.JavaCameraView;
        import org.xml.sax.Attributes;

        import java.io.FileOutputStream;

        public class myJavaCameraView extends JavaCameraView implements android.hardware.Camera.PictureCallback {
        static {
            System.loadLibrary("native-lib");
        }

        private static final String TAG="OpenCV";
        private String mPictureFileName;
        private Context context;

        public myJavaCameraView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            this.context=context;
        }

        public void takePicture(final String fileName){
            Log.i(TAG,"Taking Pictures");
            this.mPictureFileName=fileName;
            mCamera.setPreviewCallback(null);


            mCamera.takePicture(null, null, null);
        }


        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.i(TAG,"Saving");
            mCamera.startPreview();
            mCamera.setPreviewCallback(this);

            try{
                FileOutputStream fos= new FileOutputStream(mPictureFileName);

                fos.write(data);
                fos.close();

            } catch (java.io.IOException e){
                Log.e("PictureDemo","Exception in photoCallback", e);
            }
        }
        }

任何人都可以帮助我进行调试。

0 个答案:

没有答案