2017-06-10 19 views
0

私は検出対象のためのカスケードを使用していますが、私が検出した後、私のビデオを保存したいしかし、私はちょうどフレームを保存することができ を(私は最後のフレームを保存することができます)そして、私のコードはここにある:OpenCVの保存ビデオ

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <opencv2/objdetect/objdetect.hpp> 
using namespace std; 
using namespace cv; 
int main() 
{ 
CascadeClassifier nesne; 
nesne.load("cascade.xml"); 
string filename = "a.avi"; 
    VideoCapture capture(filename); 

Mat frame; 
Mat grires; 
namedWindow("algilanan", 1); 

while(true) 
{ 
capture>>frame; 
cvtColor(frame, grires, CV_BGR2GRAY); //resmi gri renk uzayına çevirir. 
vector<Rect> nesvek; 
nesne.detectMultiScale(grires, nesvek, 1.1, 3, 0, Size(30,30)); 
for(int i = 0; i < nesvek.size(); i++) 
{ 
Point pt1(nesvek[i].x + nesvek[i].width, nesvek[i].y + nesvek[i].height); 
Point pt2(nesvek[i].x, nesvek[i].y); 
rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); 

} 
int frame_width= capture.get(CV_CAP_PROP_FRAME_WIDTH); 
int frame_height= capture.get(CV_CAP_PROP_FRAME_HEIGHT); 
VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height),true); 
video.write(frame); 
imshow("algilanan", frame); 
waitKey(33); 

} 
return 0; 
} 
+0

フォーマットコード。 – Zernike

答えて

4

単一フレームを保存できる理由は、ループの繰り返しごとにVideoWriterを再初期化するためです。ループ外で初期化する必要があります。これを試して。

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <stdio.h> 
#include <opencv2/objdetect/objdetect.hpp> 
using namespace std; 
using namespace cv; 
int main() 
{ 
CascadeClassifier nesne; 
nesne.load("cascade.xml"); 
string filename = "a.avi"; 
VideoCapture capture(filename); 

Mat frame; 
Mat grires; 
namedWindow("algilanan", 1); 

int frame_width= capture.get(CV_CAP_PROP_FRAME_WIDTH); 
int frame_height= capture.get(CV_CAP_PROP_FRAME_HEIGHT); 
VideoWriter video("out.avi",CV_FOURCC('M','J','P','G'),10,Size(frame_width,frame_height),true); 

while(true) 
{ 
capture>>frame; 
cvtColor(frame, grires, CV_BGR2GRAY); //resmi gri renk uzayına çevirir. 
vector<Rect> nesvek; 
nesne.detectMultiScale(grires, nesvek, 1.1, 3, 0, Size(30,30)); 
for(int i = 0; i < nesvek.size(); i++) 
{ 
Point pt1(nesvek[i].x + nesvek[i].width, nesvek[i].y + nesvek[i].height); 
Point pt2(nesvek[i].x, nesvek[i].y); 
rectangle(frame, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0); 
} 
video.write(frame); 
imshow("algilanan", frame); 
waitKey(33); 

} 
return 0; 
} 
+0

ありがとう、私はこの詳細を見逃します –

+0

しかし、私はビデオファイルの時間を見ることができませんなぜですか? @shawshank –

+1

ループの終了後に 'VideoWriter'を解放してください。 –

関連する問題