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
- 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%)
- 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)
- 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.
- 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;
}
Ý 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