c++ - 从二值图像中屏蔽一个 Blob

标签 c++ opencv computer-vision extraction motion

我正在使用 openCV 和 C++ 进行步行运动识别,我想创建一个蒙版或复制图像以实现所提供图片中看到的效果。 extracted human .以下是对图片的解释 可以看到人类行走的结果 Blob 。然后,创建原始帧的蒙版图像或复制图像,二进制人类 Blob 现在被蒙版,非蒙版像素现在设置为零。结果是提取出来的黑色背景的人体。下图显示了人类 Blob 是如何被提取然后被掩盖的。 这是针对视频序列的每第 5 帧完成的。到目前为止,我的代码包括每 5 帧获取一次,对其进行灰度化,找到所有 Blob 的面积,并应用阈值来获得二值图像,其中或多或少只有人类 Blob 是白色的,图像的其余部分是黑色的。现在,我正在尝试提取人体,但我不知道如何进行。请帮助我。

#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.我的问题。

最佳答案

最简单的方法是寻找图像中最大的 Blob (cvfind contours 可以是您需要的函数),然后设置为 blac 所有其他 Blob (扫描所有轮廓并使用 cvfloadfill)。 最后你扫描整个二值图像如果考虑的像素是白色你什么都不做,如果像素是黑色你将第 5 帧的相应像素设置为黑色

关于c++ - 从二值图像中屏蔽一个 Blob ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9372687/

相关文章:

algorithm - 哪种机器学习算法适合投篮?

c++ - 如何强制 pow(float, int) 返回 float

c++ - 已删除的构造函数必须是私有(private)的吗?

c++ - 如何在Qt中实现倒计时锁存器?

c++ - Microsoft Visual Studio 中的 QWT 直方图和立即关闭的 Qt 插件

c# - 桶形失真 - 在已知预期/接收到的控制点时校正图像

python - 在另一个图像上匹配轮廓或绘制 (png) 轮廓

c++ - 如何在 Linux C++ 中捕获系统级异常?

opencv - 使用 CUDA7.5 和 Ubuntu 16.04 安装 OpenCV3.1 出现奇怪错误

android - 如何使用OpenCV处理自定义相机拍摄的照片