2012-08-24 28 views
10

Tôi đang cố gắng phát triển một ứng dụng cho Android và tôi sẽ cần phải có được các hình ảnh không nén với độ phân giải cao nhất có thể từ máy ảnh. Tôi đã thử rawCallback của takePicture và postviewCallback, nhưng chúng không hoạt động.Cách đặt độ phân giải máy ảnh trong Android bằng OpenCV?

Hiện tại tôi đang thử với OpenCV (phiên bản 2.4) bằng cách sử dụng VideoCapture, nhưng tôi bị kẹt trong mặc định 960x720, điều này rất kém đối với những gì tôi cần; và điện thoại của tôi, Samsung Galaxy S3, có thể cung cấp, về mặt lý thuyết, lên đến 8Mpx (3,264 × 2,448 cho hình ảnh và 1,920 × 1,080 cho video, theo Wikipedia). VideoCapture.set (Highgui.CV_CAP_PROP_FRAME_WIDTH/HEIGHT, một số số) khiến máy ảnh trả về một hình ảnh đen như tôi đã tìm thấy.

Có cách nào để có được độ phân giải cao hơn, thông qua OpenCV hoặc với API Android mà không cần nén?

Tôi thực sự xin lỗi nếu điều này đã được yêu cầu trước đó; Tôi đã tìm kiếm ngày và tôi không tìm thấy gì cả.

Cảm ơn bạn đã dành thời gian!

EDIT: Mặc dù nó không phải là chính xác những gì tôi đã yêu cầu, tôi thấy rằng có một cách để làm một cái gì đó rất giống nhau: nếu bạn đặt một OnPreviewCallback cho máy ảnh, sử dụng setPreviewCallback, bạn có được dữ liệu hình ảnh thô từ máy ảnh (ít nhất là trong S3 tôi đang làm việc với). Tôi để nó ở đây trong trường hợp ai đó thấy nó hữu ích trong tương lai.

EDIT: Một giải pháp từng phần được giải thích trong câu trả lời bên dưới. Để tổng hợp,

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth); 
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight); 

hoạt động trong một số điều kiện; vui lòng xem bên dưới để biết thêm chi tiết.

Trả lời

2

Bạn phải nhận hỗ trợ xem trước máy ảnh được hỗ trợ bằng cách gọi getSupportedPreviewSizes.

Sau này, bạn có thể đặt bất kỳ độ phân giải nào bằng phương pháp setPreviewSize. Và đừng quên setParameters cuối cùng. Thực tế nhiều ví dụ Android của OpenCV chứa thông tin này (xem mẫu 3).

1

Trong trường hợp ai bao giờ tìm thấy hữu ích này, tôi tìm thấy một (một phần) giải pháp: Nếu biến VideoCapture của bạn được gọi vc, điều này sẽ làm việc:

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth); 
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight); 

tâm rằng sự kết hợp của chiều rộng và chiều cao phải là một của các định dạng hình ảnh được hỗ trợ cho máy ảnh của bạn, nếu không nó sẽ chỉ nhận được một hình ảnh màu đen. Bạn có thể lấy chúng thông qua Camera.Parameters.getSupportedPictureSizes().

Tuy nhiên, việc đặt độ phân giải cao dường như vượt quá dung lượng bộ đệm chuyển đổi YUV, vì vậy tôi vẫn đang vật lộn với điều đó. Tôi sẽ tạo một câu hỏi riêng biệt mới cho điều đó, để giữ cho mọi thứ rõ ràng hơn: new thread

0

setPreviewSize không đặt độ phân giải hình ảnh. setPictureSize thực hiện.