2013-04-18 30 views
19

Tôi đang cố gắng ghi lại luồng video của Logitech C920 trong OpenCV. Với Labview tôi có thể truy cập luồng MJPG ở tốc độ 30fps 1080p. Trong opencv tôi bị giới hạn ở 5fps hoặc 640x480.Chụp 1080p ở tốc độ 30 khung hình/giây từ logitech c920 với openCV 2.4.3

Đây là mã có liên quan đến các thiết lập máy ảnh:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 

Những tất cả trở lại 1, tuy nhiên tôi nhận được một dòng 5fps 1080p tương ứng với các dòng YUY2.
Nếu tôi thêm các dòng sau:

this->camRef.set(CV_CAP_PROP_FPS, 30); 

này trả về 0. tôi nhận được một dòng 30 fps ở độ phân giải 640x480. Với tôi, có vẻ như cài đặt MJPG không được chấp nhận nhưng tôi không biết phải làm gì hoặc cách khắc phục điều đó.

CHỈNH SỬA: Sau đây là sự cố chương trình.

this->camRef.read(this->image); 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)   << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)  << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl; 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 

Sau đó trong mã chạy của tôi, tôi có như sau:

void camera::run() 
{ 
    while(true) 
    { 
     if(this->camRef.read(this->image) == 0) 
     { 
      if(this->capture) 
      { 
       cv::imwrite(fileName,this->image); 
       this->count++; 
      } 
     } 
     msleep(15); 
    } 
} 

EDIT2: Giải pháp là để thiết lập các codec fourCC trước khi thiết lập chiều cao của camera và chiều rộng.

+0

nếu bạn muốn thiết lập fps (phải được hỗ trợ bởi máy ảnh), bạn phải làm điều đó sau khi thiết lập codec, nhưng trước khi chiều rộng/cài đặt độ cao – MartinM

+1

Âm thanh như EDIT2 của bạn cung cấp cho bạn 1080p ở tốc độ 30 khung hình/giây. Nên được biến thành một câu trả lời và chấp nhận sau đó để làm cho vấn đề xuất hiện giải quyết. –

Trả lời

1

Hãy thử để có được hình ảnh đầu tiên từ chụp trước khi thiết lập bất cứ điều gì:

VideoCapture cap(0); 
if(!cap.isOpened()) 
return -1; 

Mat frame; 
cap >> frame; 
double fps; 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0); 
//add the loop here 

và kiểm tra xem nó sẽ làm việc mà không cần thiết lập MJPG. Nếu nó sẽ hoạt động, hãy thử với MJPG.

Đối với tôi hơi lạ khi bạn phải lấy khung hình đầu tiên trước khi đặt bất kỳ thứ gì, nhưng đó là cách duy nhất nó hoạt động cho tôi (cửa sổ 7 32bit).



// chỉnh sửa:
Yo có thể cố gắng sử dụng API khác nhau - xem phần thứ hai của câu trả lời của tôi ở đây: https://stackoverflow.com/a/14188280/1598485 OpenCV đang cố gắng sử dụng API tốt nhất theo mặc định, nhưng có lẽ trong bạn trường hợp một số API khác sẽ hoạt động tốt hơn.

+0

Cảm ơn bạn đã trả lời. Tôi đã thử những gì bạn nói và bây giờ mã của tôi bị treo trước khi hiển thị một hình ảnh. cap.read trả về 1 và sau đó nó đổ vỡ khi nó cố đọc lại từ máy ảnh. –

+0

Trong dòng nào? Vui lòng hiển thị mã của bạn với dòng này được đánh dấu. – cyriel

+0

Tôi đã cập nhật câu hỏi gốc để hiển thị mã bạn đã yêu cầu. –

6

Là tác giả của bài đăng đã tìm thấy giải pháp nhưng không thêm giải pháp đó làm câu trả lời, tôi sẽ đưa giải pháp vào đây.

Bạn phải thiết lập các codec trước khi bạn thiết lập độ phân giải truy nã:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
+0

Cảm ơn! Nó hoạt động như đã nói!Mặt khác, tôi muốn đề cập rằng mặc dù điều này sẽ cho phép độ phân giải fullHD @ 30, chất lượng hình ảnh có thể rất kém (tỷ lệ nén phải cao để đáp ứng giới hạn băng thông của USB 2.0) – cbuchart

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