2015-03-03 31 views
5

Tôi đang tìm cách thiết lập giá trị chế độ cảnh cho máy ảnh web từ C++ (Android NDK).Đặt chế độ cảnh quay camera cho OpenCV trên Android

OpenCV nhận các giá trị từ máy ảnh web khi nó được khởi tạo. Trong nhật ký bên dưới, nhật ký ghi là Supported Scene Modes: auto,action,portrait,landscape,beach,fireworks,night,night-portrait,snow,sports,steadyphoto,sunset,theatre,barcode.

Tôi muốn đặt một trong các giá trị (chẳng hạn như bãi biển) cho máy ảnh.

D/OpenCV::camera﹕ CvCapture_Android::CvCapture_Android(1) 
D/OpenCV::camera﹕ Library name: libopencv_java.so 
D/OpenCV::camera﹕ Library base address: 0x69f3b000 
D/OpenCV::camera﹕ Libraries folder found: /data/app-lib/gms.rewards.selfie-2/ 
D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib: folderPath=/data/app-lib/gms.rewards.selfie-2/ 
E/OpenCV::camera﹕ ||libnative_camera_r4.1.1.so 
E/OpenCV::camera﹕ ||libnative_camera_r4.0.3.so 
E/OpenCV::camera﹕ ||libnative_camera_r2.3.3.so 
E/OpenCV::camera﹕ ||libnative_camera_r4.2.0.so 
E/OpenCV::camera﹕ ||libnative_camera_r2.2.0.so 
E/OpenCV::camera﹕ ||libnative_camera_r3.0.1.so 
E/OpenCV::camera﹕ ||libnative_camera_r4.3.0.so 
E/OpenCV::camera﹕ ||libnative_camera_r4.0.0.so 
E/OpenCV::camera﹕ ||libnative_camera_r4.4.0.so 
D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.4.0.so' 
D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.4.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "_ZN7android17IConsumerListenerD2Ev" referenced by "libnative_camera_r4.4.0.so"..." 
D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.3.0.so' 
D/OpenCV::camera﹕ CameraWrapperConnector::connectToLib ERROR: cannot dlopen camera wrapper library /data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.3.0.so, dlerror="Cannot load library: soinfo_relocate(linker.cpp:975): cannot locate symbol "_ZN7android6Camera17setPreviewTextureERKNS_2spINS_22IGraphicBufferProducerEEE" referenced by "libnative_camera_r4.3.0.so"..." 
D/OpenCV::camera﹕ try to load library 'libnative_camera_r4.2.0.so' 
D/OpenCV::camera﹕ Loaded library '/data/app-lib/gms.rewards.selfie-2/libnative_camera_r4.2.0.so' 
D/OpenCV_NativeCamera﹕ CameraHandler::initCameraConnect(0x6a64eb6d, 1, 0x69359e18, 0x0) 
D/OpenCV_NativeCamera﹕ Connecting to CameraService v 2.3 
D/OpenCV_NativeCamera﹕ Instantiated new CameraHandler (0x6a64eb6d, 0x69359e18) 
I/OpenCV_NativeCamera﹕ initCameraConnect: [antibanding=auto;antibanding-values=off,auto,50hz,60hz;auto-exposure-lock=false;auto-exposure-lock-supported=true;auto-exposure-lock-values=false,true;auto-whitebalance-lock=false;auto-whitebalance-lock-supported=true;auto-whitebalance-lock-values=false,true;effect=none;effect-values=mono,negative,none,posterize,sepia,aqua,solarize,nv-vivid,nv-emboss;exposure-compensation-step=0.1;flash-mode=off;flash-mode-values=off,on,auto,torch,red-eye;focal-length=1.000;focus-areas=(0,0,0,0,0);focus-distances=0.95,1.9,Infinity;focus-mode=fixed;focus-mode-values=fixed;horizontal-view-angle=60.000;jpeg-quality=95;jpeg-thumbnail-height=240;jpeg-thumbnail-quality=90;jpeg-thumbnail-size-values=0x0,320x240,240x320;jpeg-thumbnail-width=320;max-exposure-compensation=20;max-num-detected-faces-hw=10;max-num-focus-areas=0;max-num-metering-areas=4;max-zoom=28;metering-areas=(0,0,0,0,0);min-exposure-compensation=-20;picture-format=jpeg;picture-format-values=jpeg,jfif,exif,yuv420p,yuv420sp;picture-size=1280x960;pic 
D/OpenCV_NativeCamera﹕ Supported Cameras: (null) 
D/OpenCV_NativeCamera﹕ Supported Picture Sizes: 320x240,480x480,640x368,640x480,800x600,960x720,1024x768,1280x720,1280x752,1280x960,1440x1080,1600x1200,1836x1080,1920x1080,2048x1152,2048x1360,2048x1536,2592x1456,2592x1520,2592x1920,2592x1944 
D/OpenCV_NativeCamera﹕ Supported Picture Formats: jpeg,jfif,exif,yuv420p,yuv420sp 
D/OpenCV_NativeCamera﹕ Supported Preview Sizes: 176x144,320x240,352x288,480x480,640x480,704x576,720x408,720x480,720x576,768x432,800x448,960x720,1280x720,1280x752,1280x960,1360x720,1440x1080,1920x1080,1920x1088,1920x1440 
D/OpenCV_NativeCamera﹕ Supported Preview Formats: yuv420p,yuv420sp 
D/OpenCV_NativeCamera﹕ Supported Preview Frame Rates: 5,8,10,15,20,24,25,30 
D/OpenCV_NativeCamera﹕ Supported Thumbnail Sizes: 0x0,320x240,240x320 
D/OpenCV_NativeCamera﹕ Supported Whitebalance Modes: auto,incandescent,fluorescent,warm-fluorescent,daylight,cloudy-daylight,shade,twilight 
D/OpenCV_NativeCamera﹕ Supported Effects: mono,negative,none,posterize,sepia,aqua,solarize,nv-vivid,nv-emboss 
D/OpenCV_NativeCamera﹕ Supported Scene Modes: auto,action,portrait,landscape,beach,fireworks,night,night-portrait,snow,sports,steadyphoto,sunset,theatre,barcode 
D/OpenCV_NativeCamera﹕ Supported Focus Modes: fixed 
D/OpenCV_NativeCamera﹕ Supported Antibanding Options: off,auto,50hz,60hz 
D/OpenCV_NativeCamera﹕ Supported Flash Modes: off,on,auto,torch,red-eye 
D/OpenCV_NativeCamera﹕ initCameraConnect: preview format is set to yuv420sp 
D/OpenCV_NativeCamera﹕ Starting preview 
D/OpenCV_NativeCamera﹕ Preview started successfully 

Ví dụ mã (Không chính xác cùng một mã mà tôi sử dụng):

cv::Mat inframe = cv::Mat(); 
    cv::VideoCapture mCamera; 
    mCamera.open(1); 
    mCamera.set(CV_CAP_PROP_FRAME_WIDTH, 400); 
    mCamera.set(CV_CAP_PROP_FRAME_HEIGHT, 300); 

// mCamera.set("scene mode", "beach"); // <-- looking for a way 

    while (mCamera.isOpened()) { 
    bool grab = mCamera.grab(); 
    if (grab) { 
     mCamera.retrieve(inframe, CV_CAP_ANDROID_COLOR_FRAME_RGB); 

     // To do something for the iframe 

    } else { 
     LOGE("--->Cannot grab a frame from camera."); 
    } 
    } 
    mCamera.release(); 

Trả lời

4

Vấn đề duy nhất là không có bất kỳ API chuẩn để xử lý camera bằng Android NDK. Cần phải trải qua Java, vì quyền truy cập NDK sẽ dành riêng cho phần cứng cụ thể.

Mặc dù có một lớp VideoCapture trong giao diện ++ C của OpenCV, bạn có thể sử dụng nó, nếu bạn thực hiện phương pháp Hoạt động Native, nhưng kể từ NDK không cung cấp API để truy cập camera từ mã nguồn gốc, vì vậy VideoCapture sử dụng giao diện không có giấy tờ, mà làm cho VideoCapture không phổ biến. Nó không hoạt động trên một số thiết bị cũ hoặc mới. Chỉ cần xem xét các vấn đề trên máy ảnh gốc của OpenCV here.

tôi đề nghị sử dụng setSceneMode(String value) đứng về phía quản lý, bạn cũng có thể gửi một yêu cầu từ phía mẹ đẻ để được quản lý để thiết lập một chế độ cảnh do đó làm cho một sự chuyển đổi giữa các SCENE_MODE_# đứng về phía quản lý và sự đếm tương ứng trên mặt mẹ đẻ (bạn nên thực hiện chính mình).

Bằng cách ở đây là các thuộc tính cho máy ảnh Android (của set() phương pháp 's VideoCapture): videoio.hpp #L263 - #L325


Update # 1:

Bạn có thể cố gắng để mở rộng các chức năng của OpenCV's camera_wrapper bởi CameraParameters để đặt chế độ cảnh (như lấy nét hoặc cân bằng trắng) nhưng có thể có sự khác biệt giữa một số phiên bản Android.

Cũng cần lưu ý rằng bạn phải biên dịch mô-đun androidcamera cho tất cả các phiên bản Android để làm việc trên chúng. Đó là lý do tại sao bạn thấy rất nhiều libnative_camera_r#.#.#.so trong thư mục OPENCV_ANDROID_PATH\sdk\native\libs\armeabi-v7a.

+0

Tôi nghĩ rằng không có cách nào để sử dụng setSceneMode cho nó đã được mở bởi lớp VideoCapture. Lớp VideoCapture là một trình bao bọc của V4L2, vì vậy tôi nghĩ có một số cách để thiết lập giá trị bằng phương thức set(), nhưng có vẻ như OpenCV không cung cấp mã nguồn của lớp VideoCapture. – wf9a5m75

+0

Tôi nghĩ như vậy, lớp VideoCapture' của OpenCV không cung cấp cơ hội thiết lập chế độ cảnh. Có, 'VideoCapture' là một trình bao bọc của một số giao diện xử lý phương tiện (ví dụ: V4L2, VFW, DSHOW, OpenNI, v.v.). Ngay cả đối với Android có một lớp bao bọc, nó không phải là một bí mật như bạn nghĩ, bạn có thể có nguồn [ở đây] (https: // github.com/Itseez/opencv/blob/master/modules/videoio/src/cap_android.cpp). – Kornel

+0

Và đây là mô-đun trình bao bọc máy ảnh của OpenCV: [opencv/modules/androidcamera] (https://github.com/Itseez/opencv/tree/master/modules/androidcamera) – Kornel

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