Example #1
0
std::tuple<cv::Mat, cv::Mat> SimpleRayCaster::renderZMasks() {
    cv::Mat fgMask(_res_y, _res_x, CV_32F);
    cv::Mat bgMask(_res_y, _res_x, CV_32F);

    for (int y=0; y<_res_y; y++) {
        for (int x=0; x<_res_x; x++) {

            Eigen::Vector2f co((float)x/(float)_res_x,(float)y/(float)_res_y);
            auto zvalues = castRay(co);
            float fgPixel = 0.0f;
            float bgPixel = 0.0f;

            /* only valid masks if there were 2 intersections */
            if (zvalues.size() == 2) {
                if (zvalues[0] < zvalues[1]) {
                    fgPixel = zvalues[0];
                    bgPixel = zvalues[1];
                } else {
                    fgPixel = zvalues[1];
                    bgPixel = zvalues[0];
                }
            }

            fgMask.at<float>(y,x) = fgPixel;
            bgMask.at<float>(y,x) = bgPixel;
        }
    } 

    return std::make_tuple(fgMask, bgMask);
}
//! Processes a frame and returns output image
bool DrawingCanvasSample::processFrame(const cv::Mat& inputFrame, cv::Mat& outputFrame)
{
    cv::cvtColor(inputFrame,
                 m_grayImage,
                 cv::COLOR_BGRA2GRAY);
    
    cv::bilateralFilter(m_grayImage,
                        m_filtered,
                        m_bilateralD,
                        m_bilateralSigmaThreshold,
                        m_bilateralColorThreshold);
    
    cv::Mat grayImage3channes;
    cv::Mat a[] = { m_filtered, m_filtered, m_filtered };
    cv::merge(a, 3, grayImage3channes);
    
    cv::adaptiveThreshold(m_grayImage, bgMask, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C , cv::THRESH_BINARY, 1 + 2*m_thresholdBlockSize, m_thresholdC);
    
    cv::Mat fgMask(bgMask.size(), bgMask.type());
    fgMask = cv::Scalar(255);
    fgMask ^= bgMask;
    
    cv::Mat b[] = { bgMask, bgMask, bgMask };
    cv::merge(b, 3, bgMask3channels);
    
    cv::Mat c[] = { fgMask, fgMask, fgMask};
    cv::merge(c, 3, fgMask3channels);
    
    cv::Scalar backgroundColor = cv::Scalar(56, 138, 239);
    cv::Scalar foregroundColor = cv::Scalar(255,255,255);
    
    cv::multiply(grayImage3channes, backgroundColor, bgColor, 1.0f / 255.f);
    cv::multiply(grayImage3channes, foregroundColor, fgColor, 100.0f / 255.0f);
    
    if (m_currentView == kStageGrayscale)
    {
        cv::cvtColor(m_grayImage, outputFrame, cv::COLOR_GRAY2BGRA);        
    }
    else if (m_currentView == kStageBilateralFilter)
    {
        cv::cvtColor(m_filtered, outputFrame, cv::COLOR_GRAY2BGRA);        
    }
    else if (m_currentView == kStageThreshold)
    {
        cv::cvtColor(bgMask, outputFrame, cv::COLOR_GRAY2BGRA);
    }
    else
    {
        cv::Mat resul = (bgColor & bgMask3channels) + (fgColor & fgMask3channels);
        cv::cvtColor(resul, outputFrame, cv::COLOR_BGR2BGRA);
    }
    
    return true;
}