我正在开展一个有关视力的项目。
为了离线测试我的算法,我需要在嵌入式电路板上记录与超声数据同步的视频流,例如Raspberry PI或Beaglebone Black / White。
目前我的解决方案(可能太糟糕)是基于使用OpenCV将每个帧记录为jpg文件,同时使用当前时间戳记录超声测量作为分离文件的参考。
我在http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html上使用了示例代码 在那里我添加了用于从超声波获取当前时间戳和当前测量值的代码。
问题在于我无法每秒录制超过1帧。
也许问题是在SD卡上写太慢了?
以下是代码:
#include <iostream>
#include <fstream>
#include <sys/time.h>
#include <ctime>
#include <cv.h>
#include <highgui.h>
#include "sonar.h"
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
struct timeval stop, start;
Mat frame;
int distance_sonar = 0;
ofstream data;
data.open("data.txt");
VideoCapture cap(0); // open the default camera
if (!cap.isOpened()) // check if we succeeded
return -1;
int cnt = 0;
std::string filename;
std::time_t t;
stringstream ss_cnt, ss_distance;
while (1)
{
// Check the execution time
gettimeofday(&start, NULL);
// Get a new frame from camera
cap >> frame;
// Get distance from sonar
ss_distance << distance_mm();
t = std::time(0);
ss_cnt << cnt;
filename = "frame" + ss_cnt.str() + ".jpg";
imwrite(filename, frame);
data << ss_cnt.str() + "," + ss_distance.str() << endl;
filename.clear();
ss_cnt.str(std::string());
ss_distance.str(std::string());
gettimeofday(&stop, NULL);
printf("Execution time %lu\n", stop.tv_usec - start.tv_usec);
cnt += 1;
}
return 0;
}
这是输出:
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
Execution time 331004
Execution time 132860
Execution time 4294129723
Execution time 146386
Execution time 120129
Execution time 109446
Execution time 114200
Execution time 110580
Execution time 116459
Execution time 109442
Execution time 4294078506
Execution time 134790
Execution time 112826
Execution time 113419
Execution time 110300
Execution time 111792
Execution time 112051
我目前正在使用两个USB摄像头。第一台相机以1920x1080输出帧,第二台以640x480输出帧。 使用第一台摄像机,每个保存的帧大约为300K。 使用第二台相机,每帧约为90K。 使用第二台摄像机运行相同的代码比第一台(明显)快,但远离我的需要(&gt; = 30 fps)。
我的问题是:是否有可能以帧速率&gt; = 30 fps单独保存每一帧?
注意:我尝试在线程VIDIOC_QUERYMENU: Invalid argument之后解决问题 VIDIOC_QUERYMENU:无效参数,并重新编译opencv库,但没有成功。也许这可能是问题的一部分?
注2:我修改了代码:现在每帧的文件名取决于每次迭代时递增的计数器。
你有什么建议吗?
由于