OpenCV 从网络摄像头流中分离出剪影

Posted

技术标签:

【中文标题】OpenCV 从网络摄像头流中分离出剪影【英文标题】:OpenCV Isolate silhouette from webcam stream 【发布时间】:2012-12-06 17:23:04 【问题描述】:

我正在尝试从未知视频流中分离出一个人的轮廓。 (用户网络摄像头),使用C++/Cinder/OpenCV。我已经识别和绘制轮廓,但我没有得到整个人的轮廓,只是元素(头发、眼睛等)

我正在使用: BackgroundSubtractorMOG2 删除背景。 模糊以消除噪音。 自适应阈值。 查找和绘制具有一定复杂性的轮廓。

代码:

Surface surface;
surface = mCapture.getSurface();

// To texture for display
textureCapture = Texture( surface );

    // Greyscale
    Mat matGrey( toOcv( surface ) );

    // Output
    Mat matForeground, matBackground;

    // Build foreground & background
    mog( matGrey, matForeground, -1 );
    mog.getBackgroundImage( matBackground );

// Build countours
Mat matContourTemp = matForeground.clone();

    // Blur to remove noise
    Mat matBlurred = matContourTemp.clone();
    cv::GaussianBlur( matContourTemp, matBlurred, cv::Size( 9, 9 ), 0 );

    textureBlurred = Texture( fromOcv( matBlurred ) );

    // Adaptive threshold
    Mat matThresh = matContourTemp.clone();
    adaptiveThreshold( matBlurred, matThresh, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 0 );

    textureThreshold = Texture( fromOcv( matThresh ) );

    // Contours
    vector<cv::Vec4i> hierarchy;

        // Find
        contours.clear();
        findContours( matThresh, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point( 0, 0 ) );

        // Draw contours
        Mat matContourImage( matForeground.size(), CV_8UC3, cv::Scalar( 0, 0, 0 ) );

        Scalar colors[ 3 ];
        colors[ 0 ] = Scalar( 255, 255, 255 );

        for( size_t idx = 0; idx < contours.size(); idx++)

            if( contours[ idx ].size() > 40 )

                cv::drawContours(
                        matContourImage, contours, idx,
                        colors[ 0 ], -3,
                        100,
                        hierarchy,
                        0,
                        cv::Point( 0, 0 ) );
                ;
    ;
    textureContour = Texture( fromOcv( matContourImage ) );

输出:(我在这里太初级,无法发布图像)

http://barnabysheeran.com/outgoing/***/ss_1.png http://barnabysheeran.com/outgoing/***/ss_2.png

我希望这是一个充满全身的剪影。

【问题讨论】:

我正在尝试类似的东西,我正在假设有某种方式可以创建一个边界轮廓,你可以填充所有 blob,目前只有 boundingRect() 方法.尽管此链接***.com/questions/8973017/… 可能会提供某种组合轮廓的方法。唯一的理论,还没试过。 【参考方案1】:

您可以在阈值处理后使用erode/dilate,这通常会去除噪声并拉伸白色区域,但我建议使用BGSlibrary,我过去将它与openFrameworks结合使用,它确实是不同算法的绝佳集合减去背景。

在分割之前进行一些图像处理可能会有所帮助,但这只是一个理论。

【讨论】:

以上是关于OpenCV 从网络摄像头流中分离出剪影的主要内容,如果未能解决你的问题,请参考以下文章

c++ opencv获取编码的网络摄像头流

Qt OpenCV 网络摄像头流打开和关闭

带有面部检测和形状预测的 Dlib 网络摄像头捕获速度很慢

OpenCV 显示和处理网络摄像头流

如何从网络摄像头获取原始 mjpg 流

网络摄像头流使用 OpenCV 3.0 + Visual Studio 2013 进行镜像