2012-03-15 38 views
9

Tôi có một ứng dụng xem trước máy ảnh, thực hiện một số chức năng xử lý ảnh cơ bản trên mọi khung hình (ví dụ: phát hiện cạnh, thay đổi màu sắc, hình ảnh dọc v.v.) và hiển thị khung đã sửa đổi cho màn hình "thời gian thực". Tương tự như ứng dụng "Máy ảnh giấy" trong Android Market.Android: Xử lý ảnh theo thời gian thực

Một bản tóm tắt của phương pháp của tôi:

1: Tạo hai lần xem chồng chéo trong một framelayout:

Một SurfaceView để vượt qua để Camera.setPreviewDisplay(). (Đi qua null sẽ ngăn chặn việc xem trước máy ảnh bắt đầu trên một số thiết bị - opencv được sử dụng để làm điều này trước khi Android 4.0?).

Lớp có tên "LiveView" mở rộng Chế độ xem và triển khai Camera.PreviewCallBack. Chế độ xem này nhận khung từ máy ảnh và hiển thị khung sau khi sửa đổi (ví dụ: phát hiện cạnh). Chế độ xem này nằm ở trên cùng của SurfaceView.

2: Tôi gọi Camera.setPreviewCallbackWithBuffer(), vì vậy mà khung được gửi đến LiveView tôi

3: Trong onPreviewFrame() của LiveView, tôi lấy khung đã chụp (byte []) , chuyển đổi từ YUV tới RGB và thực hiện các chức năng xử lý hình ảnh, và gọi postInvalidate() (việc chuyển đổi và xử lý hình ảnh YUV2RGB được thực hiện trong mã nguồn gốc)

4: trong phương pháp OnDraw() của LiveView, tôi tạo ra một bitmap từ khung RGB đã sửa đổi (byte []) và vẽ bitmap thành canvas.

Công trình này (từ 5fps đến 10fps trên các thiết bị khác nhau), nhưng tôi muốn biết cách người khác tiếp cận vấn đề này và cách cải thiện vấn đề. Cụ thể:

  • Tôi có đạt được hiệu suất nào bằng cách mở rộng GLSurfaceView thay vì Chế độ xem để tạo Lớp LiveView không?
  • Nghe có vẻ rất không hiệu quả khi có hai mặt được cập nhật cho mỗi khung hình. Có cách nào khác không?
  • Để làm điều này hiệu quả hơn, tôi có nên truy cập máy ảnh ở cấp độ gốc không? - Tôi tin OpenCV có cách tiếp cận này?

Nhiều Cảm ơn

Trả lời

4

Tôi cũng đã làm một cái gì đó như thế này. Những gì tôi làm là mở rộng Chế độ xem máy ảnh. Tôi không nghĩ rằng chế độ xem máy ảnh được cập nhật mọi khung hình nhưng được truy xuất. Và chỉ có Chế độ xem mà bạn đã thay đổi sẽ phải được cập nhật. OpenCv thực hiện công việc tốt hơn so với máy ảnh gốc. Sau khi nhập org.opencv.highgui.VideoCapture, bạn có thể trực tiếp truy cập vào máy ảnh sử dụng:

VideoCapture camera; 
camera.retrieve(mGrayMat, Highgui.CV_CAP_ANDROID_GREY_FRAME); 

để chuyển đổi mGrayMat để mRgbaMat: (org.opencv.imgproc.Imgproc)

Imgproc.cvtColor(mGrayMat, mRgbaMat, Imgproc.COLOR_GRAY2BGRA, 4); 
Các vấn đề liên quan