使用cvMoments的对象区域

时间:2012-02-19 06:13:54

标签: c++ opencv area

我正在开展一个涉及openCV和C ++的步行动作识别项目。我已经到了算法的阶段,我需要找到人类斑点的区域。我已经加载了视频,将其转换为灰度并对其进行阈值处理以获得具有白色区域的二进制图像,该白色区域显示除了其他白色区域之外的人类行走。我需要找到每个白色区域的区域以确定人类斑点的面积,因为该区域的面积将大于其他白色区域的面积。请查看我的代码并向我解释输出,因为我的区域为40872,我不知道这意味着什么。这是我的代码。我想上传我用过的视频,但我不知道如何:/如果有人可以告诉我如何上传我用过的视频,请这样做,因为这是我能够获得这个特定视频的唯一方法。我真的希望有人可以帮助我。

#include "cv.h"
#include "highgui.h"
#include "iostream"

using namespace std;
int main( int argc, char* argv ) {

CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
    return -1;
}

IplImage* color_frame = NULL;
IplImage* gray_frame = NULL ;
int thresh_frame = 70;
CvMoments moments;

int frameCount=0;//Counts every 5 frames
cvNamedWindow( "walking", CV_WINDOW_AUTOSIZE );

while(1) {
    color_frame = cvQueryFrame( capture );//Grabs the frame from a file
    if( !color_frame ) break;
    gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height),      color_frame->depth, 1);
    if( !color_frame ) break;// If the frame does not exist, quit the loop

    frameCount++;
    if(frameCount==5)
    {
        cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
        cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY);
        cvErode(gray_frame, gray_frame, NULL, 1);
        cvDilate(gray_frame, gray_frame, NULL, 1);

        cvMoments(gray_frame, &moments, 1);
        double m00;
        m00 = cvGetSpatialMoment(&moments, 0,0);

        cvShowImage("walking", gray_frame);
        frameCount=0;
    }
    char c = cvWaitKey(33);
    if( c == 27 ) break;
}

double m00 = (double)cvGetSpatialMoment(&moments, 0,0);
cout << "Area - : " << m00 << endl;

cvReleaseImage(&color_frame);
cvReleaseImage(&gray_frame);
cvReleaseCapture( &capture );
cvDestroyWindow( "walking" );

return 0;
}

2 个答案:

答案 0 :(得分:0)

cout << "Area - : " << m00 << endl;

函数cvGetSpatialMoment检索空间矩,在图像时刻定义为:

Mji=sumx,y(I(x,y)•xj•yi)

其中I(x,y)是像素(x, y)的强度。

空间力矩m00就像物体的质量。它不包含x,y信息。所有我的平均x位置都是average(x) = sum(density(x)*x_i)I(x,y)就像密度函数,但这里是像素的强度。如果您不希望结果根据光照发生变化,您可能希望将矩阵设为二进制矩阵。像素是对象的一部分或不是。在物体的灰度图像中进食将基本上按照上面的公式将灰度转换为密度。

Area = average(x) * average(y)

所以你想要

Area = m01 * m10

m00基本上是对图像中所有像素的灰度级求和。没有空间意义。虽然如果你不将图像转换为二进制,你可能想要除以m00来“标准化”它。

答案 1 :(得分:0)

您可以使用MEI和MHI图像识别动作。使用50帧/ 1更新MHI图像并获得分段运动并通过cvMotions创建运动,之后您需要使用mathanan distinct与训练数据。我是越南人。而且英语非常糟糕。