2012-02-19 2 views
-1

openCV 및 C++와 관련된 걷기 동작 인식 프로젝트를 진행 중입니다. 나는 인간 BLOB 영역을 찾는 데 필요한 알고리즘에서 무대에 도달했습니다. 비디오를로드하고 회색 음영으로 변환 한 후 다른 흰색 영역 이외에 인간의 보행을 나타내는 흰색 영역이있는 이진 이미지를 얻기 위해 임계 값을 설정했습니다. 이 영역은 다른 백색 영역보다 큰 영역을 가질 것이기 때문에 각 백색 영역의 영역을 찾아서 인간 블로 브의 영역을 결정해야합니다. 내 코드를 살펴보고 40872의 면적을 얻고 있기 때문에 출력이 나에게 무엇인지 알 수 없으므로 출력을 설명하십시오. 이것은 내 코드입니다. 내가 사용했던 비디오를 업로드하고 싶지만 어떻게해야할지 모르겠다./내가 사용했던 비디오를 업로드하는 법을 누군가에게 말해 줄 수 있다면,이 방법을 사용하면된다. 왜냐하면이 특정 비디오에 도움을 줄 수있는 유일한 방법이기 때문이다. . 누군가가 나를 도울 수 있기를 바랍니다.cvMoments를 사용하는 객체 영역

#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; 
} 

답변

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

함수 cvGetSpatialMoment 화상 순간의 경우에서와 같이 정의되는 공간 모멘트를 검색한다 I(x,y) 화소 (x, y)의 강도

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

.

공간 모멘트 m00은 물체의 질량과 같습니다. 여기에는 x, y 정보가 없습니다. 평균 x 위치는 모든 i에 대해 average(x) = sum(density(x)*x_i)입니다. I(x,y)은 밀도 함수와 비슷하지만 여기서는 픽셀의 강도입니다. 조명에 따라 결과를 변경하지 않으려면 행렬을 이진 행렬로 만들려는 것이 좋습니다. 픽셀은 객체의 일부이거나 아닙니다. 물체의 그레이 스케일 이미지를 급지하면 본질적으로 greylevel이 위 공식에 따라 밀도로 변환됩니다.

Area = average(x) * average(y) 

그래서 당신은

Area = m01 * m10 

M00은 기본적으로 이미지의 모든 픽셀을 통해 회색 레벨을 합산되고 싶다. 공간적 의미가 없습니다. 이미지를 바이너리로 변환하지 않더라도 m00으로 나누어 "표준화"할 수 있습니다.

0

MEI 및 MHI 이미지를 사용하여 동작을 인식 할 수 있습니다. 50 프레임/1의 updateMHI 이미지로 세그먼트 모션을 얻고 cvMotions로 모션을 생성합니다. 그런 다음 mathanan을 트레이닝 데이터와 함께 사용해야합니다. 나는 베트남 사람이에요. 그리고 영어는 나쁘다.

관련 문제