Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 如何写视频?_Visual Studio 2010_Opencv - Fatal编程技术网

Visual studio 2010 如何写视频?

Visual studio 2010 如何写视频?,visual-studio-2010,opencv,Visual Studio 2010,Opencv,我正在Windows 7中使用opencv和visual studio 2010以及32位操作系统。。。。在运行人员检测示例程序时,它显示在窗口中播放的输出视频。。。但我无法打开存储在特定位置的输出视频。。。请帮助我。。。谢谢你 #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include <o

我正在Windows 7中使用opencv和visual studio 2010以及32位操作系统。。。。在运行人员检测示例程序时,它显示在窗口中播放的输出视频。。。但我无法打开存储在特定位置的输出视频。。。请帮助我。。。谢谢你

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
using namespace cv; 
using namespace std; 
int main(int argc, char** argv) 
{ 
    Mat img; char _filename[1024];
    HOGDescriptor hog; 
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
    namedWindow("people detector", 1); 
    CvCapture *cap=cvCaptureFromFile("E:/Phase_I_output/2.walk.avi");
    img=cvQueryFrame(cap);
    for(;;)
    { 
    img=cvQueryFrame(cap); 
    if(img.empty())
    break;
    fflush(stdout); 
    vector<Rect> found, found_filtered; 
    double t = (double)getTickCount(); 
    int can = img.channels(); 
    hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2); 
    t = (double)getTickCount() - t; 
    printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency()); 
    size_t i, j; 
    for( i = 0; i < found.size(); i++ )
    { 
        Rect r = found[i]; 
        for( j = 0; j < found.size(); j++ )
            if( j != i && (r & found[j]) == r)
                break; 
        if( j == found.size() ) found_filtered.push_back(r); 
    } 
    for( i = 0; i < found_filtered.size(); i++ )
    {
        Rect r = found_filtered[i]; 
        r.x += cvRound(r.width*0.1);
        r.width = cvRound(r.width*0.8); 
        r.y += cvRound(r.height*0.07);
        r.height = cvRound(r.height*0.8); 
        rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 3); 
    } 
                Size size2 = Size(640,480);
                int codec = CV_FOURCC('M', 'J', 'P', 'G');
                VideoWriter writer2("E:/Phase_I_output/video_.avi",codec,50.0,size2,true);
                writer2.open("E:/Phase_I_output/video_.avi",codec,15.0,size2,true);
                writer2.write(img);
                imshow("people detector", img);
                if(waitKey(1) == 27)            
                break;
    } 
    std::cout <<  "Completed" << std::endl ;
    waitKey();
    return 0;
} 

你应该在无限循环之前初始化视频,在没有更多的帧抓取时,用C++ API和视频捕捉来释放不需要的视频服务器:

Size size2 = Size(640,480);
int codec = CV_FOURCC('M', 'J', 'P', 'G');
VideoWriter writer2("E:/Phase_I_output/video_.avi",codec,50.0,size2,true);
writer2.open("E:/Phase_I_output/video_.avi",codec,50.0,size2,true);

for(;;){
//do your stuff
//write the current frame
writer2.write(img);
}
cvReleaseVideoWriter( writer2 );
cvReleaseCapture( &cap );

你还应该使用OpenCV的C++ API。我相信每个以“cv”开头的函数都是C API的一部分,不再受支持。检查找到相应的C++函数。 例如:

img=cvQueryFrame(cap);
将成为:

cap >> img;
编辑 我修正了你的代码使用OpenCV的C++ API,它的工作很好,但是人们的检测似乎是假阳性。代码如下:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
using namespace cv; 
using namespace std;

int main(int argc, char** argv) 
{ 
Mat img;
string _filename;
_filename = "path/to/video.avi";
HOGDescriptor hog; 
hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
namedWindow("people detector", WND_PROP_AUTOSIZE);
VideoCapture cap = VideoCapture(_filename);
if(!cap.isOpened()){
    cout<<"error opening : "<<_filename<<endl;
    return 1;
}
Size size2 = Size(640,480);
int codec = static_cast<int>(cap.get(CV_CAP_PROP_FOURCC));
double fps = cap.get(CV_CAP_PROP_FPS);
VideoWriter writer2("../outputVideo_.avi",codec,fps,size2,true);


for(;;)
{ 
    cap >> img;
    if(img.empty()){
        cout<<"frame n° "<<cap.get(CV_CAP_PROP_FRAME_COUNT)<<endl;
        break;
    }
    fflush(stdout); 
    vector<Rect> found, found_filtered; 
    double t = (double)getTickCount(); 
    int can = img.channels(); 
    hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2); 
    t = (double)getTickCount() - t; 
    printf("tdetection time = %gms\n", t*1000./cv::getTickFrequency()); 
    size_t i, j; 
    for( i = 0; i < found.size(); i++ )
    { 
        Rect r = found[i]; 
        for( j = 0; j < found.size(); j++ )
            if( j != i && (r & found[j]) == r)
                break; 
        if( j == found.size() ) found_filtered.push_back(r); 
    } 
    for( i = 0; i < found_filtered.size(); i++ )
    {
        Rect r = found_filtered[i]; 
        r.x += cvRound(r.width*0.1);
        r.width = cvRound(r.width*0.8); 
        r.y += cvRound(r.height*0.07);
        r.height = cvRound(r.height*0.8); 
        rectangle(img, r.tl(), r.br(), Scalar(0,255,0), 3); 
    } 

    //writer2.write(img);
    writer2 << img;
    imshow("people detector", img);
    if(waitKey(1) == 27)
    {
        break;
    }
}
writer2.release();
cap.release();
cout <<  "Completed" << endl ;
waitKey();
destroyAllWindows();
return 0;
} 

在文件路径中使用\\谢谢。。。但现在仍然无法打开存储的视频…谢谢@Neimsz。。。但我将处理后的帧存储在名称“img”中。。。那么,如何让img进入“for”循环???对于{//do your stuff//编写当前帧writer2.writeimg;}还有一件事,我正在使用这个输出存储的视频作为另一个模块的输入。。。。它会写在同一个主功能内的同一个模块中吗???是否可能…??Mat img是在main中声明的,所以我看不出您的问题在哪里:for循环嵌套在main中,因此您可以从那里访问变量img。你问题的最后一部分模棱两可,你能发布你的代码吗?谢谢。。。对能够访问“for”循环中的“img”。。。但问题是。。。无法播放存储的视频。。。留下我上一个问题的最后一部分……writer2.openE:/Phase_I_output/video_.avi,codec,50.0,size2,true;参数必须与videowriter先前声明中的参数相同。谢谢@Neimsz。。。代码运行良好。。。它可以很好地播放生成的视频,但无法打开存储的视频。。。