2013-06-10 39 views
7

Tôi đang chụp khung từ Webcam bằng OpenCV trong ứng dụng C++ trên cả máy tính Windows cũng như trên RaspberryPi (ARM, Debian Wheezy). Vấn đề là việc sử dụng CPU. Tôi chỉ cần xử lý khung như sau mỗi 2 giây - vì vậy không có thời gian thực xem trực tiếp. Nhưng làm thế nào để đạt được điều đó? Bạn sẽ gợi ý cái nào?OpenCV làm chậm ảnh chụp WebCam

  1. Lấy mỗi khung, nhưng chỉ xử lý một số: Điều này sẽ giúp ích một chút. Tôi nhận được các khung hình gần đây nhất nhưng tùy chọn này không có tác động đáng kể đến việc sử dụng CPU (dưới 25%)
  2. Lấy/Xử lý từng khung nhưng ngủ: Tác động tốt đến việc sử dụng CPU, nhưng khung tôi nhận được cũ (5-10 giây)
  3. Tạo/hủy VideoCapture trong mỗi chu kỳ: Sau một số chu kỳ ứng dụng gặp sự cố - ngay cả khi VideoCapture được làm sạch chính xác.
  4. Bất kỳ ý tưởng nào khác?

Cảm ơn trước

#include <opencv2/opencv.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <vector> 
#include <unistd.h> 
#include <stdio.h> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    cv::VideoCapture cap(0); //0=default, -1=any camera, 1..99=your camera 

    if(!cap.isOpened()) 
    { 
     cout << "No camera detected" << endl; 
     return 0; 
    } 

    // set resolution & frame rate (FPS) 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,240); 
    cap.set(CV_CAP_PROP_FPS, 5); 

    int i = 0; 
    cv::Mat frame; 

    for(;;) 
    { 
     if (!cap.grab()) 
      continue; 

     // Version 1: dismiss frames 
     i++; 
     if (i % 50 != 0) 
      continue; 

     if(!cap.retrieve(frame) || frame.empty()) 
      continue; 

     // ToDo: manipulate your frame (image processing) 

     if(cv::waitKey(255) ==27) 
      break; // stop on ESC key 

     // Version 2: sleep 
     //sleep(1); 
    } 

    return 0; 
} 

Trả lời

4
  1. Tạo/Phá hủy VideoCapture trong mỗi chu kỳ: chưa được thử nghiệm

Nó có thể là một chút rắc rối trên Windows (và có thể trên các hệ điều hành khác nữa) - Khung đầu tiên được chụp sau khi tạo VideoCapture thường có màu đen hoặc xám. Khung thứ hai nên là tốt :)

Ý tưởng khác:
- ý tưởng sửa đổi nr 2 - sau khi ngủ lấy 2 khung. Khung đầu tiên có thể cũ, nhưng thứ hai phải là mới. Nó không được kiểm tra và nói chung tôi không chắc chắn về điều đó, nhưng thật dễ dàng để kiểm tra nó.
- Cuối cùng sau khi ngủ bạn có thể lấy khung trong khi vòng lặp (không ngủ) chờ cho đến khi bạn lấy cùng một khung hai lần (nhưng nó có thể khó đạt được đặc biệt là trên RasberryPi).

+1

Ý tưởng khác đầu tiên của bạn hoạt động khá tốt. Tôi đang lấy ít nhất 3 khung hình trước khi tiếp tục. CPU khoảng 20% ​​và thời gian bù/trễ có thể chấp nhận được. – Matthias