Hệ điều hành: Ubuntu 20.04 (Focal Fossa)
Gần đây, tôi đã mua một máy ảnh Logitech c930e để sử dụng trong các kỳ thi có giám thị trực tuyến, trong đó giám thị có thể yêu cầu xuất trình ID do chính phủ cấp. Máy ảnh có chức năng lấy nét tự động, ban đầu có thể lấy nét vào các vật thể ở gần (nếu một vật thể được đặt ở phía trước máy ảnh khi khởi động), nhưng một khi nó chuyển tiêu điểm sang các vật thể ở xa, nó không thể phát hiện lại và lấy nét lại các vật thể ở gần sau đó đặt trước máy ảnh. Điều này làm cho văn bản trên giấy tờ tùy thân do chính phủ cấp được đặt trước máy ảnh trở nên không đọc được.
Sau một số nghiên cứu ban đầu, hóa ra tôi có thể cài đặt v4l-utils
và lấy danh sách các tham số mà tôi có thể điều chỉnh trên máy ảnh như sau (giả sử nút thiết bị được liên kết là /dev/video1
):
$ v4l2-ctl -d /dev/video1 --list-ctrls
Lọc đầu ra để chỉ bao gồm các tùy chọn liên quan đến tiêu điểm mang lại:
$ v4l2-ctl -d /dev/video1 --list-ctrls | tập trung grep
focus_absolute 0x009a090a (int): tối thiểu=0 tối đa=255 bước=5 mặc định=0 giá trị=0 cờ=không hoạt động
focus_auto 0x009a090c (bool): mặc định=1 giá trị=1
Cho nên focus_auto
được đặt thành 1
và focus_absolute
đến 0
theo mặc định, cũng có thể được nhìn thấy bằng cách chạy các lệnh sau:
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_auto
focus_auto: 1
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_absolute
tiêu điểm_tuyệt đối: 0
Sau một số thử nghiệm thủ công, có vẻ như tiêu điểm_tự động: 0
và tiêu điểm_tuyệt đối: 75
mang lại sự cân bằng tốt trong việc làm cho văn bản cận cảnh đủ rõ ràng trong khi không làm mờ quá nhiều các đối tượng ở xa:
$ v4l2-ctl -d /dev/video1 --set-ctrl focus_auto=0
$ v4l2-ctl -d /dev/video1 --set-ctrl focus_absolute=75
Vì vậy, tôi viết một tệp quy tắc udev /etc/udev/rules.d/90-logitech-c930e.rules
để áp dụng các cài đặt này:
KERNEL=="video[0-9]*", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0843", RUN+="/usr/bin/v4l2- ctl -d $devnode --set-ctrl focus_auto=0", RUN+="/usr/bin/v4l2-ctl -d $devnode --set-ctrl focus_absolute=75"
Tập tin này cũng có thể được tìm thấy trên GitHub
Các idNhà cung cấp: 046d
và idSản phẩm: 0843
tôi thu được với lsusb
:
$ lsusb | grep Logitech
Bus 001 Thiết bị 002: ID 046d:0843 Logitech, Inc. Webcam C930e
Sau đó tôi khởi động lại systemd-udevd.service
:
$ Sudo systemctl khởi động lại systemd-udevd.service
Rút phích cắm của máy ảnh và cắm lại. Trong vài giây đầu tiên, focus_auto
được đặt thành 0
và focus_absolute
đến 75
như mong đợi:
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_auto
tiêu điểm_tự động: 0
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_absolute
tiêu điểm_tuyệt đối: 75
Nhưng sau vài chục giây, các cài đặt được hoàn nguyên về mặc định:
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_auto
focus_auto: 1
$ v4l2-ctl -d /dev/video1 --get-ctrl focus_absolute
tiêu điểm_tuyệt đối: 0
Tại sao có thể như vậy? Có thể vô hiệu hóa hành vi này? Nếu vậy, làm thế nào?