Я делаю распознавание движения при ходьбе с использованием openCV и C++, и я хотел бы создать маску или скопированное изображение, чтобы добиться эффекта, наблюдаемого на изображении. . Ниже приведено объяснение изображений. Отображается полученная капля человеческой ходьбы. Затем создается изображение маски или скопированное изображение исходного кадра, теперь бинарная человеческая блоба замаскирована, а немаскированные пиксели теперь устанавливаются на ноль. Результатом является извлеченный человеческий организм с черным фоном. На приведенной ниже диаграмме показано, как человеческая капля извлекается, а затем замаскирована. Это должно быть сделано для каждого пятого кадра видеопоследовательности. Мой код до сих пор состоит в том, чтобы получить каждый пятый кадр, сделать его серой шкалой, найти области всех блоков, и применить пороговое значение для получения бинарного изображения, где более или менее, только человеческий капли белого цвета, а остальная часть изображения черный. Теперь я пытаюсь извлечь человеческое тело, но я не знаю, как действовать дальше. Пожалуйста, помогите мне.Маскировка блоба из двоичного изображения
#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 = 28;
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 = cvGetCentralMoment(&moments, 0,0);
cvShowImage("walking", gray_frame);
frameCount=0;
}
char c = cvWaitKey(33);
if(c == 27) break;
}
double m00 = (double)cvGetCentralMoment(&moments, 0,0);
cout << "Area - : " << m00 << endl;
//area of lady walking = 39696. Therefore, using new threshold area as 30 for this video
//area of walking man = 67929
cvReleaseImage(&color_frame);
cvReleaseImage(&gray_frame);
cvReleaseCapture(&capture);
cvDestroyWindow("walking");
return 0;
}
Я хотел бы, чтобы загрузить видео, которое я использую в коде, но я не знаю, как загрузить его здесь, так что если кто-нибудь может помочь мне с этим тоже. Я хочу предоставить как можно больше информации w.r.t. мой вопрос.
На боковой ноте перерыв никогда не должен использоваться таким образом! используйте do {} во время и сделайте свои чеки там. –
@MartinKristiansen Я новичок в openCV и C++, поэтому, как только код работал, я был доволен этим. что этот разрыв не приемлем для использования там? –
делает блок управления менее прозрачным, выясняя, когда выйдет цикл while, на самом деле непонятно и будет намного понятнее, если код будет расти. –