Области объектов, использующих cvMoments - PullRequest
0 голосов
/ 19 февраля 2012

Я работаю над проектом по распознаванию движений с участием 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 голосов
/ 25 ноября 2014

Вы можете использовать изображения MEI и MHI для распознавания движения.с 50frame / 1 вы обновляете изображение MHI, получаете движение сегмента и создаете движение с помощью cvMotions, после чего вам нужно использовать отличительный mathanan с данными тренировки.Я вьетнамец.И по-английски я очень плохой.

0 голосов
/ 08 июля 2012
cout << "Area - : " << m00 << endl;

Функция cvGetSpatialMoment извлекает пространственный момент, который в случае моментов изображения определяется как:

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

, где I(x,y) - интенсивность пикселя (x, y).

Пространственный момент m00 подобен массе объекта.Он не содержит х, у информации.Среднее положение х average(x) = sum(density(x)*x_i) по всем я.I(x,y) похоже на функцию плотности, но здесь это интенсивность пикселя.Если вы не хотите, чтобы ваш результат изменялся в зависимости от освещения, вы, вероятно, хотите сделать матрицу двоичной матрицей.Пиксель является либо частью объекта, либо нет.Подача изображения объекта в градациях серого по существу преобразует уровень серого в плотность в соответствии с формулой выше.

Area = average(x) * average(y)

, поэтому вы хотите, чтобы

Area = m01 * m10

m00 в основном суммировал уровень серогопо всем пикселям в изображении.Нет пространственного значения.Хотя, если вы не конвертируете свое изображение в двоичное, вы можете разделить его на m00, чтобы «нормализовать» его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...