[英]extract frame from a video for detection with opencv
我正在開發一個程序來檢測視頻或圖像中的對象。 它適用於圖像,但現在我想將其用於視頻。 我使用特定的文件夾來選擇圖像,因此我想在檢測之前將視頻中的幀保存在該文件夾中。 可變視頻和Salvataggio已設置。 在以下代碼中,我導航拋出該文件夾以分析視頻:
DIR *dir;
dir = opendir(video.c_str());
string vidName;
struct dirent *ent;
if (dir != NULL) {
while ((ent = readdir (dir)) != NULL) {
vidName= ent->d_name;
if(vidName.compare(".")!= 0 && vidName.compare("..")!= 0)
{
//string vidPath(neg + vidName);
estraiframe(video, vidName, salvataggio);
}
}
closedir (dir);
}
else {
cout<<"directory "<< video << " not present"<<endl;
}
}
estraiframe函數將幀保存在輸出文件夾中。
void estraiframe(string path, string vidName, string output){
string vidPath(path + vidName);
VideoCapture cap(vidPath);
if( !cap.isOpened()){
cout << "Cannot open the video file" << endl;
return;
}
double count = cap.get(CV_CAP_PROP_FRAME_COUNT);
double rate = cap.get(CV_CAP_PROP_FPS);
int counter = 0;
for (int i=1; i< count; i+=rate*5)
{
cap.set(CV_CAP_PROP_POS_FRAMES,i);
Mat frame;
cap.read(frame);
counter++;
string nomeframe = to_string(counter) + "-frame_from"+vidName+".jpg";
string percorso (output+nomeframe);
cout << percorso;
imwrite(percorso,frame);
}
}
顯然可以,但是在最后一幀之后,它給了我以下錯誤:
斷言stream_index <ogg-> nstreams在libavformat / oggdec.c中失敗:898我為此鎖定,但是我沒有發現錯誤在哪里
您的視頻包含各種流索引,例如3個音頻,而1個視頻流將產生4個流索引。 我建議您檢查視頻中包含的流的數量,並打印ogg-> nstreams以檢查是否對應。 在898行查看oggdec.c中的源代碼
static int ogg_read_seek(AVFormatContext *s, int stream_index,
int64_t timestamp, int flags)
{
struct ogg *ogg = s->priv_data;
struct ogg_stream *os = ogg->streams + stream_index;
int ret;
av_assert0(stream_index < ogg->nstreams); /* Line 898 */
您顯然在這里越界。
顯然我設法解決了問題,我修改了提取框架的功能。
void estraiframe(string path, string vidName, string output){
string vidPath(path + vidName);
VideoCapture cap(vidPath);
if( !cap.isOpened()){
cout << "Cannot open the video file" << endl;
return;
}
double rate = cap.get(CV_CAP_PROP_FPS);
int counter = 0;
Mat frame;
int i=1;
while(1)
{
cap.read ( frame);
if( frame.empty()) break;
counter++;
if (counter == rate*5*i){
i++;
string nomeframe = to_string(counter) + "-frame_from"+vidName+".jpg";
string percorso (output+nomeframe);
imwrite(percorso, frame);
}
char key = waitKey(10);
if ( key == 27) break;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.