2015-12-14 17 views
5

Tôi đã phát triển một dự án phân tích hình ảnh thời gian thực bằng cách sử dụng C++ và OpenCV yêu cầu các khung được trích xuất từ ​​webcam. Tôi đang gặp sự cố khi cố gắng trích xuất các khung này ở bất kỳ tốc độ nào - hiện tại tôi chỉ có thể quản lý khoảng 18 khung hình/giây. Đây là mã đơn giản tôi đang sử dụng để trích xuất khung từ webcam:Trích xuất nhanh các khung hình từ webcam: C++ & OpenCV so với Matlab

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <ctime> 

using namespace std; 
using namespace cv; 

int main (int argc, char* argv[]) 
{ 

    VideoCapture cap(0); 
    if(!cap.isOpened()) return -1; 
    namedWindow("video", CV_WINDOW_AUTOSIZE); 

    clock_t start = clock(); 

    for (int i = 0; i < 101; ++i) 
    { 
     Mat frame; 
     cap >> frame; 
     imshow("video", frame); 
     waitKey(1); 
    } 

    clock_t finish = clock(); 

    double time_elapsed = (finish - start)/1000.0; 
    double fps = 100/time_elapsed; 

    cout << "\n\nTIME: " << time_elapsed << "\n\nFPS: " << fps << "\n\n"; 

    return 0; 
} 

Tôi đã thử các mã khác nhưng không cho phép tôi trích xuất khung hình nhanh hơn 18 khung hình/giây. Tôi hy vọng sẽ đạt tốc độ tương tự như những gì tôi có thể đạt được trong Matlab của 40 - 50 fps (sử dụng đoạn mã sau):

vid = videoinput('winvideo', 1, 'MJPG_640x480'); 
triggerconfig(vid, 'manual');  
start(vid); 

tic; 

for k = 1:100; 
    clc; 
    disp(k); 
    I = peekdata(vid, 1); 
    imshow(I); 
    drawnow; 
end 

toc; 

close(); 
stop(vid); 
delete(vid); 

tôi đã xem xét sử dụng các file mex để tăng tốc độ ++ Dự án C của tôi và cũng cho phép hỗ trợ GPU/CUDA nhưng tôi đã gặp phải một số vấn đề về phần cứng vì vậy tôi đã nhìn thấy nếu có một cách tiếp cận đơn giản hơn hoặc thứ tôi đang thiếu trong mã hiện tại của mình.

Cảm ơn trước!

EDIT Tôi chỉ cần chạy một phân tích hiệu suất trên mã và có một vài điểm dính cụ thể là:

VideoCapture cap(0);   10.5% 
cap >> frame;     36.8% 
imshow("video", frame);   31.6% 
+0

bạn có thể kiểm tra mã tại http://answers.opencv.org/question/72386/how-to-get-fps-in-opencv-live -capture/cho tôi biết nếu có bất kỳ sự khác biệt nào. – sturkmen

+0

Cảm ơn bạn đã trả lời. Việc thử cả hai ví dụ trong liên kết của bạn chỉ cho phép tôi đạt mức trung bình 15 khung hình/giây. – MSTTm

+0

nếu bạn chạy chế độ gỡ lỗi, hãy thử chế độ phát hành. – sturkmen

Trả lời

3

waitkey (1) được làm chậm bạn xuống. Bạn có thể thử làm điều đó trên mỗi ví dụ, lặp lại thứ mười. Xem http://answers.opencv.org/question/52774/waitkey1-timing-issues-causing-frame-rate-slow-down-fix/

Cách tính FPS của bạn khá tệ. Cố gắng
double time_elapsed = (finish - start)/CLOCKS_PER_SEC; Nó không được bảo đảm rằng CLOCKS_PER_SEC == 1000

+0

'waitKey (1)' chỉ nên làm chậm 1ms, có thể do webcam sản xuất khung hình chậm. Đó không phải là không phổ biến với webcam giá rẻ – mirosval

+0

Trên thực tế, nó gửi tất cả các tin nhắn một cửa sổ nhận được, vì vậy phải mất * ít nhất * 1ms. –

+0

Phải, nhưng vẫn với 18 FPS bạn có 55ms để xử lý từng khung hình. Tại 30 FPS bạn vẫn sẽ có 33ms, vì vậy nếu 1 hoặc 5ms của nó cho 'waitKey (1) 'không quan trọng tôi nghĩ. Bạn vẫn sẽ đợi webcam. – mirosval

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