WebcamTracker::WebcamTracker()
    : _vidCap(0)
{
    _kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size2i(3, 3), cv::Point2i(1, 1));
    assert(_vidCap.isOpened());

    _threshold = true;
    _morphTransform = true;
    _greyscale = true;

    // Load initial frames
    _vidCap >> _curFrame;
    prepareNextFrame();
}
QSGNode *QQuickCustomParticle::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
    QQuickShaderEffectNode *rootNode = static_cast<QQuickShaderEffectNode *>(oldNode);
    if (m_pleaseReset){
        delete rootNode;//Automatically deletes children
        rootNode = 0;
        m_nodes.clear();
        m_pleaseReset = false;
        m_dirtyProgram = true;
    }

    if (m_system && m_system->isRunning() && !m_system->isPaused()){
        rootNode = prepareNextFrame(rootNode);
        if (rootNode) {
            foreach (QSGGeometryNode* node, m_nodes)
                node->markDirty(QSGNode::DirtyGeometry);
            update();
        }
    }

    return rootNode;
}