2013-05-04 52 views
9

Tôi đang cố gắng viết chương trình C++/Qt cho Linux, nơi tôi chụp ảnh tĩnh từ webcam, thực hiện một số phép biến đổi thành ảnh (cắt xén, thay đổi kích thước, v.v.) và lưu nó vào tệp jpeg.Cách chụp ảnh tĩnh từ webcam trên linux

Nhưng tôi đã gặp phải một số sự cố. Vấn đề chính là trình điều khiển Linux UVC (usb video device class) standart hiện tại không hỗ trợ chụp ảnh tĩnh trực tiếp: http://www.ideasonboard.org/uvc/.

Vì vậy, có hai cách có thể để chụp ảnh tĩnh. Bạn có thể lấy một khung hình từ luồng video từ máy ảnh hoặc bạn có thể chụp một bức ảnh riêng biệt, như máy ảnh cầm tay kỹ thuật số. Cách thứ hai không được hỗ trợ trong trình điều khiển uvc Linux, vì vậy phương pháp đầu tiên là cách duy nhất. Nhưng vấn đề là, nếu bạn muốn lấy khung hình từ luồng video, kích thước của ảnh không được lớn hơn kích thước của video trong cửa sổ xem trước video. Vì vậy, nếu tôi muốn chụp ảnh 2 megapixel, tôi phải bắt đầu phát trực tiếp với kích thước 1600x1200, điều này không quá thoải mái (Ít nhất, trong Qt kích thước của dòng video phụ thuộc vào kích thước cửa sổ videopreview).

Tôi biết rằng có video cho linux 2 API, có thể hữu ích trong tác vụ này, nhưng tôi không biết cách sử dụng nó. Tôi hiện đang học gstreamer, nhưng bây giờ tôi không thể tìm ra cách để làm những gì tôi cần bằng cách sử dụng những công cụ này.

Vì vậy, tôi sẽ đánh giá cao bất kỳ trợ giúp nào. Tôi nghĩ rằng nó không phải là một vấn đề khó khăn cho những người biết Linux, GStreamer, v4l2 API, và những thứ cụ thể khác của Linux.

Nhân tiện, chương trình sẽ chỉ được sử dụng với máy ảnh web Logitech C270 HD.

Xin hãy giúp tôi. Tôi không biết API hoặc khung làm việc nào có thể giúp tôi thực hiện việc này. Có thể bạn biết.

+0

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

+0

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) –

Trả lời

1
**Download And Install 'mplayer'** 
mplayer -vo png -frames 1 tv:// 
+0

Như tôi biết, mplayer sử dụng gstreamer để chơi media ... có thể bạn biết một số mã gstreamer để làm điều tương tự? – locomotion

+0

> mplayer -vo png-khung 1 tv: // không hoạt động. Ảnh màu xanh lá cây đồng bằng xuất hiện trong thư mục chính. – locomotion

+0

Không, trình phát không sử dụng gstreamer để phát phương tiện, thay vào đó cả hai đều sử dụng cùng các thư viện cơ bản như x264 và ffmpeg. –

0

Còn chương trình này thì sao?

#include<opencv2/opencv.hpp> 
using namespace cv; 
int main() 
{ 
    VideoCapture webcam; 
    webcam.open(0); 
    Mat frame; 
    char key; 

    while(true) 
    { 
     webcam >> frame; 
     imshow("My Webcam",frame); 
     key = waitKey(10); 

     if(key=='s') 
     break; 
    } 
    imwrite("webcam_capture.jpg", frame); 
    webcam.release(); 
    return 0; 
} 

Điều này sẽ chụp ảnh có kích thước tối đa cho phép bởi webcam của bạn. Bây giờ bạn có thể thêm hiệu ứng hoặc thay đổi kích thước ảnh đã chụp bằng Qt. Và OpenCV rất dễ tích hợp với Qt, :)

+0

không hoạt động. Tôi đã xóa một phần mã của bạn và bây giờ nó chỉ cần chụp ảnh và lưu nó vào tệp mà không hiển thị cửa sổ. và đầu ra là HIGHGUI ERROR: V4L/V4L2: VIDIOC_S_CROP – locomotion

+0

tốt, sau đó bạn cần phải thiết lập một số tùy chọn để mở chức năng, chẳng hạn như kích thước chụp, khung, vv Hoặc bạn có thể sử dụng GLWidget để hiển thị webcam video bên trong một cửa sổ Qt. –

3

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) 
1
mplayer -vo png -frames 1 tv:// 

có thể cung cấp một đầu ra màn hình xanh như camera vẫn chưa sẵn sàng.

mplayer -vo png -frames 2 tv:// 

Bạn có thể thử tăng số lượng khung hình và chọn số mà máy ảnh cung cấp hình ảnh chính xác.

Các vấn đề liên quan