C++ 用于运动检测的opencv代码中存在错误

C++ 用于运动检测的opencv代码中存在错误,c++,visual-studio-2010,opencv,machine-learning,computer-vision,C++,Visual Studio 2010,Opencv,Machine Learning,Computer Vision,我正在寻找人体运动跟踪的实现,还讨论了如何使用差分分析和lukas kanade光学方法从多个视频帧中提取in 我找到了科学论文,发现我们必须使用连接的组件进行连续的运动跟踪,但我不知道如何进行这个过程。我所需要的就是人类步态运动的轨迹和坐标 我在Opencv和C++工作,但OpenCV的对象检测文档不足以满足我的需要。我来自医学背景,需要这是一个儿科项目的一部分 我找到了这段代码并试图执行它(不知道它是否检测并跟踪运动)。但是,它会返回这些错误,我感到困惑,因为这些错误微不足道,其他注释提到它

我正在寻找人体运动跟踪的实现,还讨论了如何使用差分分析和lukas kanade光学方法从多个视频帧中提取in

我找到了科学论文,发现我们必须使用连接的组件进行连续的运动跟踪,但我不知道如何进行这个过程。我所需要的就是人类步态运动的轨迹和坐标

我在Opencv和C++工作,但OpenCV的对象检测文档不足以满足我的需要。我来自医学背景,需要这是一个儿科项目的一部分

我找到了这段代码并试图执行它(不知道它是否检测并跟踪运动)。但是,它会返回这些错误,我感到困惑,因为这些错误微不足道,其他注释提到它们能够运行此代码。但我无法减轻这些错误,也无法理解它们发生的原因。我使用的是OpenCv2.3,下面是错误

  • 无法打开surce文件stdafx.h
  • 警告C4996:“fopen”:此函数或变量可能不安全。考虑使用FOpenIs代替。要禁用弃用,请使用_CRT\u SECURE\u NO\u警告。有关详细信息,请参阅联机帮助
  • 错误C2086:“CvSize imgSize”:重新定义
  • 错误C2065:“临时”:未声明的标识符
  • 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int
    • 错误C2365:“cvReleaseImage”:重新定义;以前的定义是“功能” 1> c:\opencv2.3\opencv\build\include\opencv2\core\core\u c.h(87):参见“cvReleaseImage”的声明
  • 错误C2065:“差异”:未声明的标识符
  • 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI>
  • 错误C2365:“cvReleaseImage”:重新定义;以前的定义是“功能” 1> c:\opencv2.3\opencv\build\include\opencv2\core\core\u c.h(87):参见“cvReleaseImage”的声明
  • 错误C2065:“灰度图像”:未声明的标识符
  • 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI>
  • 错误C2365:“cvReleaseImage”:重新定义;以前的定义是“功能”
  • \opencv2.3\opencv\build\include\opencv2\core\core\u c.h(87):参见“cvReleaseImage”的声明 错误C2065:“移动平均值”:未声明的标识符 -错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int -错误C2365:“cvReleaseImage”:重新定义;以前的定义是“功能” -1> c:\opencv2.3\opencv\build\include\opencv2\core\core\u c.h(87):参见“cvReleaseImage”的声明 -错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int -错误C2365:“cvDestroyWindow”:重新定义;以前的定义是“功能”
  • c:\opencv2.3\opencv\build\include\opencv2\highgui\highgui\u c.h(136):请参见“CVWindow”的声明
  • 错误C2440:“正在初始化”:无法从“常量字符[10]”转换为“int” -1> 没有可以进行此转换的上下文 -错误C2065:“输入”:未声明的标识符 -错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI>
  • 错误C2365:“cvReleaseCapture”:重新定义;以前的定义是“功能” -1> c:\opencv2.3\opencv\build\include\opencv2\highgui\highgui\u c.h(311):参见“cvReleaseCapture”的声明 -错误C2065:“outputMovie”:未声明的标识符
  • 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认int -错误C2365:“cvReleaseVideoWriter”:重新定义;以前的定义是“功能” -1c:\opencv2.3\opencv\build\include\opencv2\highgui\highgui\u c.h(436):参见“cvReleaseVideoWriter”的声明 -错误C2059:语法错误:“return” ======生成:0成功,1失败,0最新,0跳过==========
  • 代码

    // MotionDetection.cpp : Defines the entry point for the console application.
    //
    
    
    // Contourold.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    
    #include "iostream"
    #include "stdlib.h"
    
    // OpenCV includes.
    #include "cv.h"
    #include "highgui.h"
    #pragma comment(lib,"cv.lib")
    #pragma comment(lib,"cxcore.lib")
    #pragma comment(lib,"highgui.lib")
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    //Create a new window.
    cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE);
    
    //Create a new movie capture object.
    CvCapture *input;
    
    //Assign the movie to capture.
    //inputMovie = cvCaptureFromAVI("vinoth.avi");
    
    char *fileName = "E:\\highway.avi";
    //char *fileName = "D:\\Profile\\AVI\\cardriving.wmv";
    input = cvCaptureFromFile(fileName);
    //if (!input)
    
    //cout << "Can't open file" << fileName < ;
    
    
    
    //Size of the image.
    CvSize imgSize;
    IplImage* frame = cvQueryFrame(input);
    CvSize imgSize = cvGetSize(frame);
    
    //Images to use in the program.
    IplImage* greyImage = cvCreateImage( imgSize, IPL_DEPTH_8U, 1);
    IplImage* colourImage;
    IplImage* movingAverage = cvCreateImage( imgSize, IPL_DEPTH_32F, 3);
    IplImage* difference;
    IplImage* temp;
    IplImage* motionHistory = cvCreateImage( imgSize, IPL_DEPTH_8U, 3);
    
    //Rectangle to use to put around the people.
    CvRect bndRect = cvRect(0,0,0,0);
    
    //Points for the edges of the rectangle.
    CvPoint pt1, pt2;
    
    //Create a font object.
    CvFont font;
    
    
    //Create video to output to.
    char* outFilename = argc==2 ? argv[1] : "E:\\outputMovie.avi";
    CvVideoWriter* outputMovie = cvCreateVideoWriter(outFilename,
    CV_FOURCC('F', 'L', 'V', 'I'), 29.97, cvSize(720, 576));
    
    //Capture the movie frame by frame.
    int prevX = 0;
    int numPeople = 0;
    
    //Buffer to save the number of people when converting the integer
    //to a string.
    char wow[65];
    
    //The midpoint X position of the rectangle surrounding the moving objects.
    int avgX = 0;
    
    //Indicates whether this is the first time in the loop of frames.
    bool first = true;
    
    //Indicates the contour which was closest to the left boundary before the object
    //entered the region between the buildings.
    int closestToLeft = 0;
    //Same as above, but for the right.
    int closestToRight = 320;
    
    //Keep processing frames...
    for(;;)
    {
    //Get a frame from the input video.
    colourImage = cvQueryFrame(input);
    
    //If there are no more frames, jump out of the for.
    if( !colourImage )
    {
    break;
    }
    
    //If this is the first time, initialize the images.
    if(first)
    {
    difference = cvCloneImage(colourImage);
    temp = cvCloneImage(colourImage);
    cvConvertScale(colourImage, movingAverage, 1.0, 0.0);
    first = false;
    }
    //else, make a running average of the motion.
    else
    {
    cvRunningAvg(colourImage, movingAverage, 0.020, NULL);
    }
    
    //Convert the scale of the moving average.
    cvConvertScale(movingAverage,temp, 1.0, 0.0);
    
    //Minus the current frame from the moving average.
    cvAbsDiff(colourImage,temp,difference);
    
    //Convert the image to grayscale.
    cvCvtColor(difference,greyImage,CV_RGB2GRAY);
    
    //Convert the image to black and white.
    cvThreshold(greyImage, greyImage, 70, 255, CV_THRESH_BINARY);
    
    //Dilate and erode to get people blobs
    cvDilate(greyImage, greyImage, 0, 18);
    cvErode(greyImage, greyImage, 0, 10);
    
    //Find the contours of the moving images in the frame.
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* contour = 0;
    cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
    
    //Process each moving contour in the current frame...
    for( ; contour != 0; contour = contour->h_next )
    {
    //Get a bounding rectangle around the moving object.
    bndRect = cvBoundingRect(contour, 0);
    
    pt1.x = bndRect.x;
    pt1.y = bndRect.y;
    pt2.x = bndRect.x + bndRect.width;
    pt2.y = bndRect.y + bndRect.height;
    
    //Get an average X position of the moving contour.
    avgX = (pt1.x + pt2.x) / 2;
    
    //If the contour is within the edges of the building...
    if(avgX > 90 && avgX < 250)
    {
    //If the the previous contour was within 2 of the left boundary...
    if(closestToLeft >= 88 && closestToLeft <= 90)
    {
    //If the current X position is greater than the previous...
    if(avgX > prevX)
    {
    //Increase the number of people.
    numPeople++;
    
    //Reset the closest object to the left indicator.
    closestToLeft = 0;
    }
    }
    //else if the previous contour was within 2 of the right boundary...
    else if(closestToRight >= 250 && closestToRight <= 252)
    {
    //If the current X position is less than the previous...
    if(avgX < prevX)
    {
    //Increase the number of people.
    numPeople++;
    
    //Reset the closest object to the right counter.
    closestToRight = 320;
    }
    }
    
    //Draw the bounding rectangle around the moving object.
    cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);
    }
    
    //If the current object is closer to the left boundary but still not across
    //it, then change the closest to the left counter to this value.
    if(avgX > closestToLeft && avgX <= 90)
    {
    closestToLeft = avgX;
    }
    
    //If the current object is closer to the right boundary but still not across
    //it, then change the closest to the right counter to this value.
    if(avgX < closestToRight && avgX >= 250)
    {
    closestToRight = avgX;
    }
    
    //Save the current X value to use as the previous in the next iteration.
    prevX = avgX;
    }
    //Save the current X value to use as the previous in the next iteration.
    prevX = avgX;
    }
    
    
    //Write the number of people counted at the top of the output frame.
    cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
    cvPutText(colourImage, _itoa(numPeople, wow, 10), cvPoint(60, 200), &font, cvScalar(0, 0, 300));
    
    //Show the frame.
    cvShowImage("My Window", colourImage);
    
    //Wait for the user to see it.
    cvWaitKey(10);
    
    //Write the frame to the output movie.
    cvWriteFrame(outputMovie, colourImage);
    }
    
    // Destroy the image, movies, and window.
    cvReleaseImage(&temp);
    cvReleaseImage(&difference);
    cvReleaseImage(&greyImage);
    cvReleaseImage(&movingAverage);
    cvDestroyWindow("My Window");
    
    cvReleaseCapture(&input);
    cvReleaseVideoWriter(&outputMovie);
    
    
    return 0;
    
    }
    
    //MotionDetection.cpp:定义控制台应用程序的入口点。
    //
    //Contourold.cpp:定义控制台应用程序的入口点。
    //
    #包括“stdafx.h”
    #包括“iostream”
    #包括“stdlib.h”
    //OpenCV包括。
    #包括“cv.h”
    #包括“highgui.h”
    #pragma注释(lib,“cv.lib”)
    #pragma注释(lib,“cxcore.lib”)
    #pragma注释(lib,“highgui.lib”)
    使用名称空间std;
    int main(int argc,char*argv[])
    {
    //创建一个新窗口。
    cvNamedWindow(“我的窗口”,CV_Window_AUTOSIZE);
    //创建新的电影捕获对象。
    捕获*输入;
    //指定要拍摄的电影。
    //inputMovie=cvCaptureFromAVI(“vinoth.avi”);
    char*fileName=“E:\\highway.avi”;
    //char*fileName=“D:\\Profile\\AVI\\cardriving.wmv”;
    输入=cvCaptureFromFile(文件名);
    //如果(!输入)
    //cout 90和&avgX<250)
    {
    //如果上一个轮廓在左边界的2范围内。。。
    if(closestToLeft>=88&&closestToLeft-prevX)
    {
    //增加人数。
    numPeople++;
    //将最近的对象重置到左侧指示器。
    closestToLeft=0;
    }
    }
    //否则,如果上一个轮廓在右边界的2范围内。。。
    否则如果(ClosesToRight>=250&&ClosesToRight ClosesToLeft&&avgX=250)
    {
    closestToRight=avgX;
    }
    //保存当前X值,以便在下一次迭代中用作上一个值。
    prevX=avgX;
    }
    //保存当前X值,以便在下一次迭代中用作上一个值。
    prevX=avgX;
    }
    //在输出框顶部写下统计的人数。
    cvInitFont(&font,CV_font_HERSHEY_SIMPLEX,0.8,0,2);
    cvPutText(彩色图像、伊藤忠(numPeople、wow、10)、cvPoint(60、200)、字体、cvScalar(0、0、300));
    //显示框架。
    cvShowImage(“我的窗口”,彩色图像);
    //等待用户看到它。
    cvWaitKey(10);
    //将帧写入输出影片。
    cvWriteFrame(输出电影、彩色图像);
    }
    //销毁图像、电影和窗口。
    cvReleaseImage(&temp);
    cvReleaseImage(&差异);
    cvReleaseImage(&greyImage);
    cvReleaseImage(&M)
    
    #include <opencv/core/core.hpp>
    #include <opencv/highgui/highgui.hpp>
    #include <opencv/imgproc/imgproc.hpp>
    
    #include <iostream>
    #include "stdlib.h"
    
    
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    #include "cv.h"
    #include "highgui.h"
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char* argv[])
    {
        cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE);
        CvCapture *input;
    
        //char *fileName = "E:\\highway.avi";
        input = cvCaptureFromCAM(0);
    
        //input = cvCaptureFromFile(fileName);
    
        CvSize imgSize;
        IplImage* frame = cvQueryFrame(input);
        imgSize = cvGetSize(frame);
    
        IplImage* greyImage = cvCreateImage( imgSize, IPL_DEPTH_8U, 1);
        IplImage* colourImage;
        IplImage* movingAverage = cvCreateImage( imgSize, IPL_DEPTH_32F, 3);
        IplImage* difference;
        IplImage* temp;
        IplImage* motionHistory = cvCreateImage( imgSize, IPL_DEPTH_8U, 3);
    
        CvRect bndRect = cvRect(0,0,0,0);
    
        CvPoint pt1, pt2;
    
        CvFont font;
    
    
        char* outFilename = argc==2 ? argv[1] : "E:\\outputMovie.avi";
        CvVideoWriter* outputMovie = cvCreateVideoWriter(outFilename,
        CV_FOURCC('F', 'L', 'V', 'I'), 29.97, cvSize(720, 576));
    
        int prevX = 0;
        int numPeople = 0;
    
        char wow[65];
    
        int avgX = 0;
    
        bool first = true;
    
        int closestToLeft = 0;
        int closestToRight = 320;
    
        for(;;)
            {
            colourImage = cvQueryFrame(input);
    
            if( !colourImage )
                {
                break;
                }
            if(first)
                {
                difference = cvCloneImage(colourImage);
                temp = cvCloneImage(colourImage);
                cvConvertScale(colourImage, movingAverage, 1.0, 0.0);
                first = false;
                }
            else
    
                {
                cvRunningAvg(colourImage, movingAverage, 0.020, NULL);
                }
    
            cvConvertScale(movingAverage,temp, 1.0, 0.0);
    
            cvAbsDiff(colourImage,temp,difference);
    
            cvCvtColor(difference,greyImage,CV_RGB2GRAY);
    
            cvThreshold(greyImage, greyImage, 70, 255, CV_THRESH_BINARY);
    
            cvDilate(greyImage, greyImage, 0, 18);
            cvErode(greyImage, greyImage, 0, 10);
    
            CvMemStorage* storage = cvCreateMemStorage(0);
            CvSeq* contour = 0;
    
            cvFindContours( greyImage, storage, &contour, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );
    
    
            for( ; contour != 0; contour = contour->h_next )
            {
                bndRect = cvBoundingRect(contour, 0);
                pt1.x = bndRect.x;
                pt1.y = bndRect.y;
                pt2.x = bndRect.x + bndRect.width;
                pt2.y = bndRect.y + bndRect.height;
    
                avgX = (pt1.x + pt2.x) / 2;
    
            if(avgX > 90 && avgX < 250)
            {
                if(closestToLeft >= 88 && closestToLeft <= 90)
                    {
                    if(avgX > prevX)
                        {
                        numPeople++;
                        closestToLeft = 0;
                        }
                    }
                else if(closestToRight >= 250 && closestToRight <= 252)
                    {
                    if(avgX < prevX)
                        {
                        numPeople++;
                        closestToRight = 320;
                        }
                    }
                cvRectangle(colourImage, pt1, pt2, CV_RGB(255,0,0), 1);
             }
    
            if(avgX > closestToLeft && avgX <= 90)
                {
                closestToLeft = avgX;
                }
    
            if(avgX < closestToRight && avgX >= 250)
                {
                closestToRight = avgX;
                }
    
            prevX = avgX;
            prevX = avgX;
    
            }
    
            cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 0.8, 0.8, 0, 2);
            cvPutText(colourImage, _itoa(numPeople, wow, 10), cvPoint(60, 200), &font, cvScalar(0, 0, 300));
            cvShowImage("My Window", colourImage);
    
            cvWaitKey(10);
            cvWriteFrame(outputMovie, colourImage);
    
        }
    
    
        cvReleaseImage(&temp);
        cvReleaseImage(&difference);
        cvReleaseImage(&greyImage);
        cvReleaseImage(&movingAverage);
        cvDestroyWindow("My Window");
    
        cvReleaseCapture(&input);
        cvReleaseVideoWriter(&outputMovie);
    
    
    return 0;
    
    }