2016-06-01 26 views

Trả lời

1

hãy có một cái nhìn

camera2 with mobile vision? #65

Ok, tôi thấy điều này

Không có kế hoạch ngắn hạn cho một phiên bản camera2 của lớp CameraSource trong API chính thức. Tuy nhiên, với cách cấu trúc API, một phiên bản thay thế của CameraSource có thể được viết bởi cộng đồng nhà phát triển sử dụng camera2. Tất cả các API hiện có để làm việc với khung và thiết bị dò là đủ để hỗ trợ triển khai camera2.

+0

Cảm ơn trước, nhưng tôi đã đọc thông tin đó ...: D – Vietnt134

2

Có thể sử dụng API Camera2 với API Google Vision.

Để bắt đầu, Trình khám khuôn mặt Google Vision API nhận đối tượng Frame sử dụng để phân tích (phát hiện các khuôn mặt và các mốc của nó).

API Camera1 cung cấp khung xem trước ở định dạng hình ảnh NV21, lý tưởng cho chúng tôi. Google Vision Frame.Builder hỗ trợ cả hai setImageData (ByteBuffer ở định dạng hình ảnh NV16, NV21 hoặc YV12) và setBitmap để sử dụng Bitmap làm Khung xem trước để xử lý.

Vấn đề của bạn là API Camera2 cung cấp khung xem trước ở định dạng khác. Đó là YUV_420_888. Để làm mọi thứ hoạt động, bạn phải chuyển đổi khung xem trước thành một trong các định dạng được hỗ trợ.

Khi bạn nhận được khung xem trước Camera2 từ ImageReaderImage, bạn có thể sử dụng chức năng này để chuyển đổi sang định dạng được hỗ trợ (NV21 trong trường hợp này).

private byte[] convertYUV420888ToNV21(Image imgYUV420) { 
    // Converting YUV_420_888 data to YUV_420_SP (NV21). 
    byte[] data; 
    ByteBuffer buffer0 = imgYUV420.getPlanes()[0].getBuffer(); 
    ByteBuffer buffer2 = imgYUV420.getPlanes()[2].getBuffer(); 
    int buffer0_size = buffer0.remaining(); 
    int buffer2_size = buffer2.remaining(); 
    data = new byte[buffer0_size + buffer2_size]; 
    buffer0.get(data, 0, buffer0_size); 
    buffer2.get(data, buffer0_size, buffer2_size); 
    return data; 
} 

Sau đó, bạn có thể sử dụng các byte trở lại [] để tạo ra một khung Google Vision:

outputFrame = new Frame.Builder() 
    .setImageData(nv21bytes, mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.NV21) 
    .setId(mPendingFrameId) 
    .setTimestampMillis(mPendingTimeMillis) 
    .setRotation(mSensorOrientation) 
    .build(); 

Cuối cùng, bạn gọi các máy dò với Frame tạo:

mDetector.receiveFrame(outputFrame); 

Dù sao, nếu bạn muốn biết thêm về điều này, bạn có thể kiểm tra ví dụ làm việc của tôi có sẵn miễn phí trên GitHub: Camera2Vision. Tôi hy vọng tôi đã giúp :)

+0

Tôi đã thử chuyển đổi dữ liệu bằng 'conversionYUV420888ToNV21()' nhưng không quét mã vạch hoặc qrcode ở tất cả –

+0

@ LalitPoptani Nếu bạn gặp sự cố, vui lòng mở một vấn đề mới tại đây: https://github.com/EzequielAdrianM/Camera2Vision/issues và cung cấp thêm một số thông tin để tôi có thể giúp bạn. –

Các vấn đề liên quan