2013-04-25 29 views
6

Ứng dụng máy ảnh của tôi xử lý khung máy ảnh thô từ onPreviewFrame() bằng OpenCV và sau đó hiển thị chúng trên màn hình. Tuy nhiên, các khung hình thô được định hướng theo cách camera được gắn trên điện thoại, thường không phải là mặt bên phải. Để khắc phục điều này, tôi xoay chúng theo cách thủ công với OpenCV, điều này tốn thời gian.Định hướng chính xác dữ liệu máy ảnh thô

Tôi đã nhìn vào sử dụng setDisplayOrientation, nhưng tài liệu nói rằng

này không ảnh hưởng đến trật tự của mảng byte thông qua vào onPreviewFrame

và tôi cần các dữ liệu để thực sự được ở phía bên phải, không chỉ hiển thị bên phải. Làm thế nào tôi có thể định hướng chính xác dữ liệu máy ảnh thô? Nếu điều này là không thể, tôi có thể xoay vòng byte một cách hiệu quả được truyền cho tôi trong onPreviewFrame(), nói bằng cách sử dụng OpenGL không?

Trả lời

3

Không, không có cách nào để API này thực hiện việc này cho bạn, nhưng để tìm hiểu cách bạn cần xoay dữ liệu xem mã mẫu tại Camera.Parameters.setRotation. Trong khi setRotation() chỉ ảnh hưởng đến JPEG, bạn muốn áp dụng cùng một lượng xoay chính xác cho dữ liệu bạn nhận được trong onPreviewFrame() như bạn làm với các ảnh JPEG.

Tái tạo các mẫu mã ở đây, với những thay đổi nhỏ:

public void onOrientationChanged(int orientation) { 
    if (orientation == ORIENTATION_UNKNOWN) return; 
    android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    orientation = (orientation + 45)/90 * 90; 
    int rotation = 0; 
    if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
     rotation = (info.orientation - orientation + 360) % 360; 
    } else { // back-facing camera 
     rotation = (info.orientation + orientation) % 360; 
    } 
    mCameraOrientation = rotation; // Store rotation for later use 
} 

... 

void onPreviewFrame(byte[] data, Camera camera) { 
    switch(mCameraOrientation) { 
     case 0: 
      // data is correctly rotated 
      break; 
     case 90: 
      // rotate data by 90 degrees clockwise 
     case 180: 
      // rotate data upside down 
     case 270: 
      // rotate data by 90 degrees counterclockwise 
    } 
} 

Vì vậy, bạn cần phải kế thừa từ OrientationEventListener và ghi đè onOrientationChanged như trên, và sau đó sử dụng các giá trị định hướng tính từ đó để xoay khung xem trước khi họ

1

setDisplayOrientation chỉ quay camera so với bề mặt bạn đang vẽ, nếu tôi nhớ chính xác. Tôi tin rằng bạn muốn xoay giải thích máy ảnh, những gì bạn có thể đạt được với setRotation

+1

Tôi đã nhìn thấy điều này trước đây, nhưng nó nói 'Điều này ảnh hưởng đến hình ảnh được trả về từ JPEG Camera.PictureCallback.' Liệu nó có xoay dữ liệu thô ngay cả khi bạn không sử dụng gọi lại này không? –

+0

dữ liệu thô không thể thao tác được vì nó chỉ là cảm biến "nhìn thấy". Tôi tin rằng nó chỉ viết thẻ Exif tương ứng trong JPEG. Nhưng openCV nên có khả năng đọc Exif, sau đó nó thay đổi tọa độ khi sao chép nó vào Mat tôi tin. – sschrass

+0

Khi tôi sử dụng 'onPreviewFrame()', nó giảm dữ liệu YUV thô thành một mảng byte. Không có chuyển đổi sang JPEG đang diễn ra và tôi không thực sự "chụp ảnh". Vì vậy, nó không có vẻ như giải pháp này sẽ làm việc cho tôi. –

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