Thật không may, các cuộc gọi C4V2 trong opencv không hoạt động để chụp ảnh tĩnh với bất kỳ máy ảnh nào mà tôi đã dùng thử bằng cách sử dụng trình điều khiển UVC.
Để gỡ lỗi vấn đề tôi đã chơi với cố gắng để thực hiện điều này với c mã gọi trực tiếp c4v2.
Tôi đã chơi với mã ví dụ được tìm thấy here. Nó sử dụng phương pháp kéo khung hình từ luồng video.
Bạn có thể biên dịch nó với:
gcc -O2 -Wall `pkg-config --cflags --libs libv4l2` filename.c -o filename
tôi đã thử nghiệm với 3 camera logitech. Tốt nhất của rất nhiều có vẻ là Logitech C910. Nhưng ngay cả nó cũng có những vấn đề quan trọng.
Dưới đây là những vấn đề tôi đã gặp phải khi cố gắng hoàn thành nhiệm vụ tương tự của bạn với mã này.
Nó hoạt động khá nhiều mỗi lần với chiều rộng và chiều cao được đặt thành 1920x1080.
Khi tôi truy vấn khả năng khác trực tiếp từ dòng lệnh sử dụng ví dụ:
v4l2-ctl --list-formats-ext
và tôi thử một số "có sẵn" kích thước nhỏ hơn khác, nó được treo trong các lựa chọn chờ đợi cho máy ảnh để giải phóng bộ đệm .
Ngoài ra khi tôi cố gắng để thiết lập kích thước khác trực tiếp từ dòng lệnh sử dụng ví dụ:
v4l2-ctl -v height=320 -v width=240 -v pixelformat=YUYV
Sau đó kiểm tra với
v4l2-ctl -V
tôi thấy rằng nó trả về định dạng pixel đúng nhưng khá thường xuyên không đúng kích cỡ.
Dường như máy ảnh này được liệt kê trên UVC site dưới dạng UVC và do đó tương thích v4l2 không bị ngạt. Tôi nghi ngờ nó chỉ là xấu cho các máy ảnh khác. Hai loại khác mà tôi đã thử cũng được liệt kê là tương thích trên trang web nhưng có vấn đề tồi tệ hơn.
Tôi đã thực hiện một số thử nghiệm khác trên LogitechC910 sau khi tôi đăng nội dung này. Tôi nghĩ tôi sẽ đăng kết quả trong trường hợp nó giúp người khác ra ngoài.
Tôi đã viết một kịch bản để kiểm tra mã grabber v4l2 nêu trên trên tất cả các định dạng máy ảnh tuyên bố nó hỗ trợ khi nó được truy vấn với v4l2 đây là kết quả:
640x480 => Hangs on clearing buffer
160x120 => Works
176x144 => Works
320x176 => Works
320x240 => Works
432x240 => Works
352x288 => Works
544x288 => Works
640x360 => Works
752x416 => Hangs on clearing buffer
800x448 => Hangs on clearing buffer
864x480 => Works
960x544 => Works
1024x576 => Works
800x600 => Works
1184x656 => Works
960x720 => Works
1280x720 => Works
1392x768 => Works
1504x832 => Works
1600x896 => Works
1280x960 => Works
1712x960 => Works
1792x1008 => Works
1920x1080 => Works
1600x1200 => Works
2048x1536 => Works
2592x1944 => Hangs on clearing buffer.
Nó chỉ ra rằng các thiết lập mặc định của 640x480 không hoạt động và đó là những gì bị mắc kẹt tôi và hầu hết những người khác đã đăng trên bảng tin.
Vì nó đang lấy khung hình video nên khung hình đầu tiên chụp khi bắt đầu có thể có phơi sáng không chính xác (thường là màu đen hoặc gần với nó). Tôi tin rằng điều này là bởi vì kể từ khi nó đang được sử dụng như một máy quay video nó điều chỉnh tiếp xúc khi nó đi và không quan tâm đến các khung hình đầu tiên. Tôi tin rằng điều này cũng bị mắc kẹt tôi và những người khác nhìn thấy khung hình đầu tiên là màu đen hoặc gần như màu đen và nghĩ rằng đó là một số loại lỗi. Các khung sau có phơi sáng chính xác
Hóa ra là opencv với trình đóng gói python hoạt động tốt với máy ảnh này nếu bạn tránh các mỏ đất được liệt kê ở trên và bỏ qua tất cả các thông báo lỗi. Các thông báo lỗi là do thực tế trong khi máy ảnh chấp nhận các lệnh v4l2 nó không trả lời đúng. Vì vậy, nếu bạn thiết lập chiều rộng nó thực sự được thiết lập một cách chính xác nhưng nó đáp ứng với một chiều rộng không chính xác.
Để chạy dưới opencv với wrappers python bạn có thể làm như sau:
import cv2
import numpy
cap = cv2.VideoCapture(0) #ignore the errors
cap.set(3, 960) #Set the width important because the default will timeout
#ignore the error or false response
cap.set(4, 544) #Set the height ignore the errors
r, frame = cap.read()
cv2.imwrite("test.jpg", frame)
Tôi không biết liệu điều này có thể giúp ích hay không, đó là lý do tại sao tôi đặt nó làm nhận xét. Có một chương trình oss gọi là "pho mát" có hình ảnh và quay video. Hãy xem ở đây: https://apps.ubuntu.com/cat/applications/precise/cheese/ ... Có lẽ hãy xem mã có thể giúp bạn. – Joe
Bản sao có thể có của [Thư viện webcam cho C trên Linux?] (Http: // stackoverflow.com/questions/278112/webcam-library-for-c-on-linux) –