4.17. Các tùy chỉnh cảm biến

Ngoài pixformat()framesize(), lớp CSI còn cung cấp một số điều khiển theo từng cảm biến mà hầu hết ứng dụng đều cần dùng đến sớm hay muộn -- hướng lắp đặt, thời gian phơi sáng, độ khuếch đại, cân bằng trắng, và một vài công cụ hỗ trợ gỡ lỗi. Mỗi tùy chỉnh ánh xạ trực tiếp tới một khái niệm cảm biến đã được đề cập trước đó; API chỉ cung cấp một handle Python cho thao tác ghi thanh ghi mà driver thực hiện bên dưới.

Tất cả các phương thức dưới đây đều tác động lên cảm biến bên dưới. Chúng đều đẩy các lệnh ghi thanh ghi qua bus điều khiển I2C của cảm biến, nên chi phí chỉ tính bằng micro giây và cài đặt mới có hiệu lực từ lần phơi sáng tiếp theo -- thông thường là snapshot() kế tiếp.

4.17.1. Hướng

Camera không biết nó đang được lắp theo chiều nào. Hai cờ lật được áp dụng tại cảm biến sẽ xoay ảnh đúng hướng trước khi bất kỳ điểm ảnh nào rời khỏi chip:

csi0.hmirror(True)
csi0.vflip(True)

hmirror() lật từ trái sang phải và vflip() lật từ trên xuống dưới. Cùng nhau chúng xử lý các trường hợp thực tế: bo mạch lắp ngược (cả hai cờ đều True), bo mạch phía sau gương phẳng (chỉ hmirror), hoặc bo mạch nhìn vào cảnh phản chiếu từ phía dưới (chỉ vflip).

Vì thao tác lật xảy ra trong logic đọc ra của cảm biến, không có chi phí CPU và không tốn bộ nhớ thêm -- khung hình được lưu vào bộ đệm khung hình đã đúng hướng.

4.17.2. Thời gian phơi sáng

Thời gian phơi sáng là thời gian tích hợp -- thời gian photodiode trong mỗi điểm ảnh thu thập điện tích trước khi hàng được đọc ra, tính bằng micro giây. Driver khởi động với vòng tự động phơi sáng của cảm biến đang chạy, nên camera cố gắng giữ giá trị điểm ảnh trung bình gần mức mục tiêu. Tắt vòng lặp này sẽ ghim thời gian phơi sáng vào giá trị mà ứng dụng chọn:

csi0.auto_exposure(False, exposure_us=8000)

Thời gian phơi sáng cố định là lựa chọn đúng khi độ sáng cảnh vật ổn định và ứng dụng cần hiệu ứng motion blur có thể dự đoán hoặc cường độ nhất quán giữa các khung hình để phân ngưỡng. Đọc lại thời gian phơi sáng hiện tại -- dù vòng lặp đặt hay ứng dụng đặt -- là một lời gọi riêng:

us = csi0.exposure_us()

Gọi auto_exposure() với True và không có giá trị phơi sáng sẽ trả quyền điều khiển lại cho vòng lặp.

4.17.3. Độ khuếch đại

Độ khuếch đại là bộ khuếch đại áp dụng cho điện áp điểm ảnh trước khi đưa vào ADC, tính bằng decibel. Cũng như thời gian phơi sáng, driver khởi động với vòng tự động điều chỉnh độ khuếch đại đang bật. Hai mẫu thường gặp. Giới hạn mức trần cho phép vòng lặp thích ứng với ánh sáng nhưng ngăn nó khuếch đại nhiễu vô hạn trong cảnh thiếu sáng:

csi0.auto_gain(True, gain_db_ceiling=16)

Ghim độ khuếch đại cố định là lựa chọn đúng khi ứng dụng cũng ghim thời gian phơi sáng -- sự ổn định độ khuếch đại quan trọng với các ứng dụng so sánh giá trị điểm ảnh giữa các khung hình, như theo dõi màu sắc:

csi0.auto_gain(False, gain_db=0)

Độ khuếch đại hiện tại được đọc lại qua gain_db(). Bất cứ khi nào ứng dụng tắt tự động điều chỉnh độ khuếch đại, cũng nên tắt cả tự động cân bằng trắng và tự động phơi sáng -- nếu không các vòng điều khiển vẫn đang hoạt động sẽ kéo ảnh theo những cách phá vỡ độ khuếch đại cố định.

4.17.4. Cân bằng trắng

Cân bằng trắng là độ khuếch đại theo từng kênh mà ISP áp dụng cho các kênh đỏ, xanh lá và xanh lam sau giai đoạn khử Bayer để một vật thể trắng trông giống màu trắng dưới bất kỳ màu ánh sáng nào. Vòng tự động cân bằng trắng tính toán ba độ khuếch đại đó từ số liệu thống kê theo vùng mà ISP thu thập trên mỗi khung hình và áp dụng chúng ở khung hình tiếp theo.

Hầu hết các ứng dụng để vòng lặp chạy. Theo dõi màu sắc là ngoại lệ phổ biến -- các độ khuếch đại này cũng là thứ vòng lặp sẽ điều chỉnh để đuổi theo vật thể có màu, nên nếu ứng dụng đang cố tìm một vùng màu (blob) đỏ, vòng lặp sẽ âm thầm giảm kênh đỏ và blob sẽ không còn khớp nữa. Khóa vòng lặp sẽ khắc phục điều đó:

csi0.auto_whitebal(False)

Truyền một tuple (r, g, b) tường minh tính bằng decibel để hiệu chỉnh màu sắc có thể tái lặp -- cùng độ khuếch đại trên các bo mạch và phiên làm việc:

csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))

Các độ khuếch đại hiện tại được đọc lại dưới dạng tuple qua rgb_gain_db().

4.17.5. Giới hạn tốc độ khung hình

Các cảm biến chạy ở tốc độ khung hình gốc theo mặc định -- 30 đến 60 khung hình mỗi giây trên hầu hết các linh kiện, cao hơn nhiều trên các cảm biến tốc độ cao khi kích thước khung hình đủ nhỏ. Giới hạn tốc độ cho phép ứng dụng điều tiết camera theo tốc độ mà quá trình xử lý phía sau có thể theo kịp:

csi0.framerate(15)

Trên các cảm biến hỗ trợ điều khiển tốc độ bằng phần cứng, lời gọi này cũng kéo dài ngân sách phơi sáng mỗi khung hình, có thể hữu ích trong điều kiện thiếu sáng; trên các cảm biến khác, driver đơn giản bỏ qua các khung hình thừa ở cấp độ bộ đệm khung hình.

4.17.6. Mẫu thử nghiệm

Mẫu thanh màu thử nghiệm được tích hợp sẵn trong hầu hết các cảm biến và hữu ích để phân biệt vấn đề tạo ảnh với vấn đề đầu ra. Bật mẫu này sẽ vượt qua mảng photodiode và gửi một mẫu cố định qua cùng đường dữ liệu điểm ảnh:

csi0.colorbar(True)

Nếu mẫu thử nghiệm trông đúng nhưng ảnh trực tiếp thì không, lỗi nằm ở quang học hoặc mặt trước analog của cảm biến; nếu ngay cả mẫu thử nghiệm cũng bị hỏng, vấn đề nằm ở đâu đó trên bus dữ liệu điểm ảnh hoặc trong cấu hình pixformat() / framesize(). Truyền False để quay lại ảnh trực tiếp.

Xem csi.CSI để biết API đầy đủ, bao gồm các lệnh ioctl() dành riêng cho cảm biến để truy cập các điều khiển đặc thù của từng họ cảm biến.