2011-02-02 12 views
7

Ứng dụng iphone của tôi thu thập dữ liệu thời gian thực từ máy ảnh bằng AVCaptureSession của AVFoundation. Tôi có thể truy cập dữ liệu đó trong phương thức ủy nhiệm của nó trong thời gian chạy và tạo ra một hình ảnh từ nó. Nó có thể là CGImage, UIImage hoặc chỉ là dữ liệu thô (CMSampleBufferRef).Xác định độ sáng/độ sáng của hình ảnh

Điều tôi đang cố gắng làm là tính toán độ sáng, độ sáng của dữ liệu đó (hình ảnh). Hoặc nó có thể là một số giá trị khác có thể cho tôi biết ánh sáng đầu vào sáng như thế nào.

Có cách nào tiêu chuẩn để nhận giá trị này không? Có lẽ sử dụng OpenGL.

Xin cảm ơn trước.

Trả lời

13

Chỉ cần chuyển đổi hình ảnh của bạn thành YUV format và tính trung bình của kênh luma. Chuyển đổi màu là một hoạt động điển hình và bất kỳ khung xử lý ảnh phong nha nào cũng hỗ trợ nó. Ví dụ, OpenCV (bạn nói OpenGL, nhưng điều đó thực sự không liên quan gì đến xử lý ảnh, tôi giả sử bạn có nghĩa là OpenCV) có CvtColor.

Nếu bạn không có một khuôn khổ như vậy tiện dụng nhưng có quyền truy cập vào các cường độ pixel, bạn có thể sử dụng phương trình:

Y' = 0.299*R + 0.587*G + 0.144*B 

để có được những kênh luma, và sau đó tính toán mức trung bình. R, G và B đại diện cho các kênh màu đỏ, xanh lá cây và xanh dương tương ứng.

EDIT

Lưu ý rằng nó có thể là máy ảnh của bạn sẽ bù đắp cho những cảnh tươi sáng/tối bằng cách thay đổi khẩu độ của nó. Điều này phụ thuộc vào máy ảnh, nhưng tôi nghĩ hầu hết các máy ảnh đều làm điều này - nếu không, ảnh của bạn có thể kết thúc hoặc bão hòa (màu trắng tinh khiết) hoặc màu đen đơn thuần - trong cả hai trường hợp, vô dụng. Mắt người thực sự là do the same thing.

Nhược điểm là rất khó để biết bạn đang ở trong một môi trường tối hoặc sáng chỉ bằng cách nhìn vào một hình ảnh. Trong trường hợp đó, bạn có thể phải vượt ra ngoài hình ảnh và truy vấn máy ảnh. Về lý thuyết, bạn có thể thực hiện điều này trực tiếp thông qua trình điều khiển (không chắc) hoặc có thể bằng cách xem siêu dữ liệu hình ảnh (ví dụ: với JPEG, có EXIF).

Cuối cùng, bạn chưa nói chính xác bạn muốn biết độ sáng của. Nếu đó là cảnh tổng thể, thì trung bình sẽ đủ tốt. Nếu đó là một phần của cảnh, bạn có thể phải làm điều gì đó thông minh hơn một chút. Hãy cho chúng tôi biết nếu đó là trường hợp.

+0

Cảm ơn, tôi đoán điều đó có hiệu quả. Tôi sẽ thử và đăng kết quả ở đây. – krafter

+0

Hãy xem nhận xét đã chỉnh sửa của tôi - Tôi đã xác định được một vấn đề tiềm năng và một số cách bạn có thể giải quyết nó. – misha

+0

Có, điều này thực sự hoạt động: nhận được thông tin pixel chia nó thành cường độ màu của nó sau đó tính toán Y như bạn đã hiển thị ở đây. Vì tôi cần giá trị độ sáng trung bình của các xung ánh sáng nhỏ (nhanh) trước khi máy ảnh có thể điều chỉnh nó, phương pháp này hoạt động tốt. Cảm ơn một lần nữa. – krafter