2013-06-10 18 views
7

yavaşlatan bir C++ uygulamasında hem benim, Windows makinede yanı sıra Raspberry Pi (ARM, Debian Wheezy) üzerinde OpenCV kullanarak bir Webcam kareleri yakalama ediyorum. Sorun, CPU kullanımıdır. Sadece 2 saniyede bir gibi kareleri işlemem gerekiyor - böylece gerçek zamanlı canlı görüntü yok. Ama bunu nasıl başarabilirim? Hangisini önerirsiniz?OpenCV WebCam yakalama

  1. tut her bir kare, ancak sürecin sadece bazı: Bu biraz yardımcı olur. En yeni kareleri aldım ancak bu seçeneğin CPU kullanımı üzerinde önemli bir etkisi yok (% 25'ten az)
  2. Her kareyi tut, ancak uyu: CPU kullanımı üzerinde iyi etki, ancak aldığım kareler eski (5-10sn)
  3. Her döngüde VideoCapture oluşturun/yok edin: Bazı döngülerden sonra uygulama çöküyor - VideoCapture düzgün şekilde temizlenmiş olsa bile.
  4. Başka fikri olan? peşin

Teşekkür

#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; 
} 

cevap

4
  1. her döngüde VideoCapture yok/oluşturma: Windows üzerinde biraz zahmetli olabilir

henüz test edilmemiş (ve belki diğer işletim sistemleri çok) üzerine - VideoCapture oluşturma genellikle siyah veya gri sonra ilk çerçeve tuttu. İkinci çerçeve iyi olmalı :)

Diğer fikirler:
- değiştirilmiş fikir nr 2 - uykudan sonra 2 kare yakala. İlk çerçeve eski olabilir, ancak ikinci yeni olmalıdır. Bu test edilmemiş ve genellikle ben bu konuda emin değilim, ama bunu kontrol etmek kolaydır.
- iki kez aynı kareyi yakala (ama RasberryPi özellikle elde etmek zor olabilir) kadar Sonunda uykudan sonra size (uyku olmadan) döngü beklerken kareleri alabilecek.

+1

İlk diğer fikri oldukça iyi çalıştı. Devam etmeden önce en az 3 kare kapıyorum. CPU yaklaşık% 20 ve zaman ofseti/gecikmesi kabul edilebilir. – Matthias