usb摄像头无法识别问题

1、操作:

开机前插入了usb摄像头

2、现象:

主板的usb口无法识别到摄像头,vid/pid无法识别;拔掉重插,仍然无法识别,摄像头呈黑屏状态。

3、原因:

开机前插入摄像头,在开机启动过程中会随着开机启动识别上一次,(可以见debug串口的打印)然后随着开机进入休眠状态,外部再次进行插拔会无法唤醒。

4、解决:

diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 581bd13a0488..464c5390a7a1 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -1793,6 +1793,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
                pm_runtime_set_autosuspend_delay(&hdev->dev, 0);
 #endif
 
+#if 0
        /*
         * Hubs have proper suspend/resume support, except for root hubs
         * where the controller driver doesn't have bus_suspend and
@@ -1807,7 +1808,7 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)
                if (drv->bus_suspend && drv->bus_resume)
                        usb_enable_autosuspend(hdev);
        }
-
+#endif
        if (hdev->level == MAX_TOPO_LEVEL) {
                dev_err(&intf->dev,
                        "Unsupported bus topology: hub nested too deep\n");

以下是一个简单的 Android USB 摄像头人脸识别的代码示例: 1. 添加依赖库 在你的 build.gradle 文件中添加以下依赖库: ``` implementation 'org.bytedeco:javacv-platform:1.5.3' implementation 'org.bytedeco.javacpp-presets:opencv:4.5.1-1.5.3' ``` 2. 打开 USB 摄像头 首先,你需要使用 Android 的 Camera2 API 打开 USB 摄像头。你可以使用以下代码来打开 USB 摄像头: ```java private CameraDevice mCameraDevice; private HandlerThread mBackgroundThread; private Handler mBackgroundHandler; private String mCameraId = "1"; private ImageReader mImageReader; private Size mPreviewSize; private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() { @Override public void onOpened(@NonNull CameraDevice cameraDevice) { mCameraDevice = cameraDevice; startPreview(); } @Override public void onDisconnected(@NonNull CameraDevice cameraDevice) { cameraDevice.close(); mCameraDevice = null; } @Override public void onError(@NonNull CameraDevice cameraDevice, int error) { cameraDevice.close(); mCameraDevice = null; } }; private void openCamera() { CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraId); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); mPreviewSize = map.getOutputSizes(SurfaceTexture.class)[0]; if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQUEST); return; } manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } ``` 3. 实现人脸识别 一旦你打开了 USB 摄像头并开始预览,你就可以使用 OpenCV 库来实现人脸识别。以下是一个简单的示例代码: ```java private CascadeClassifier mFaceDetector; private Mat mGray; private Mat mRgba; private void startPreview() { SurfaceTexture texture = mTextureView.getSurfaceTexture(); assert texture != null; texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight()); Surface surface = new Surface(texture); try { mCaptureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); mCaptureRequestBuilder.addTarget(surface); mImageReader = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 2); mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler); Surface readerSurface = mImageReader.getSurface(); mCaptureRequestBuilder.addTarget(readerSurface); mCameraDevice.createCaptureSession(Arrays.asList(surface, readerSurface), mSessionStateCallback, mBackgroundHandler); } catch (CameraAccessException e) { e.printStackTrace(); } mFaceDetector = new CascadeClassifier(); mFaceDetector.load(getCascadeFile(R.raw.lbpcascade_frontalface)); mGray = new Mat(); mRgba = new Mat(); } private File getCascadeFile(int id) { try { InputStream is = getResources().openRawResource(id); File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); File cascadeFile = new File(cascadeDir, "cascade.xml"); FileOutputStream os = new FileOutputStream(cascadeFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } is.close(); os.close(); return cascadeFile; } catch (Exception e) { e.printStackTrace(); return null; } } private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image == null) { return; } Image.Plane[] planes = image.getPlanes(); ByteBuffer buffer = planes[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes); Size size = new Size(mPreviewSize.getWidth(), mPreviewSize.getHeight()); Mat yuv = new Mat(size, CvType.CV_8UC1); yuv.put(0, 0, bytes); Imgproc.cvtColor(yuv, mRgba, Imgproc.COLOR_YUV2RGBA_NV21); Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGBA2GRAY); MatOfRect faces = new MatOfRect(); mFaceDetector.detectMultiScale(mGray, faces, 1.3, 5, 0, new Size(30, 30), new Size()); for (Rect rect : faces.toArray()) { Imgproc.rectangle(mRgba, rect.tl(), rect.br(), new Scalar(0, 255, 0, 255), 3); } image.close(); } }; ``` 这个示例代码使用了 OpenCV 库中的级联分类器来识别人脸。当你检测到人脸时,你可以在预览中显示一个矩形来标识出人脸的位置。 这只是一个简单的示例,你可以根据你的需求调整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值