void MainWindow::openImage()
{
    // Showing the dialog to choose an image.
    QString imageFileToOpen = QFileDialog::getOpenFileName(this,                                // context
                                                           "Выберите изображение для проверки", // title
                                                           QDir::currentPath(),                 // opened dir
                                                           "Изображения (*.png *.jpg *.bmp)");  // formats filter

       // Doing nothing if user hasn't chosen anything.
       if (imageFileToOpen.isEmpty())
           return;

       // Clearing Mat.
       processingMat.release();

       // Saving opened image for further processings.
       processingMat = cv::imread(imageFileToOpen.toLocal8Bit().data());

       // Previewing loaded Mat.
       renderMat(processingMat);

       // Making image processing menu action visible.
       processImageAct->setEnabled(true);
}
Example #2
0
void WaterPlane::innerRender( SceneRenderState *state )
{
   GFXDEBUGEVENT_SCOPE( WaterPlane_innerRender, ColorI( 255, 0, 0 ) );

   const Point3F &camPosition = state->getCameraPosition();

   Point3F rvec, fvec, uvec, pos;

   const MatrixF &objMat = getTransform(); //getRenderTransform();
   const MatrixF &camMat = state->getCameraTransform();

   MatrixF renderMat( true );

   camMat.getColumn( 1, &fvec );
   uvec.set( 0, 0, 1 );
   rvec = mCross( fvec, uvec );
   rvec.normalize();   
   fvec = mCross( uvec, rvec );
   pos = camPosition;
   pos.z = objMat.getPosition().z;      

   renderMat.setColumn( 0, rvec );
   renderMat.setColumn( 1, fvec );
   renderMat.setColumn( 2, uvec );
   renderMat.setColumn( 3, pos );

   setRenderTransform( renderMat );

   // Setup SceneData
   SceneData sgData = setupSceneGraphInfo( state );   

   // set the material
   S32 matIdx = getMaterialIndex( camPosition );
   
   if ( !initMaterial( matIdx ) )
      return;

   BaseMatInstance *mat = mMatInstances[matIdx];
   WaterMatParams matParams = mMatParamHandles[matIdx];

   // render the geometry
   if ( mat )
   {      
      // setup proj/world transform
      mMatrixSet->restoreSceneViewProjection();
      mMatrixSet->setWorld(getRenderTransform());

      setShaderParams( state, mat, matParams );     

      while( mat->setupPass( state, sgData ) )
      {    
         mat->setSceneInfo(state, sgData);
         mat->setTransforms(*mMatrixSet, state, sgData);
         setCustomTextures( matIdx, mat->getCurPass(), matParams );

         // set vert/prim buffer
         GFX->setVertexBuffer( mVertBuff );
         GFX->setPrimitiveBuffer( mPrimBuff );
         GFX->drawIndexedPrimitive( GFXTriangleList, 0, 0, mVertCount, 0, mPrimCount );
      }
   }
}
void MainWindow::processImage()
{
    // Checking if we can process something at all.
    if (processingMat.empty())
        return;

    // 1. Localizing centers of holes.

    // Circle structuring element.
    int size = 44;
    cv::Mat circleElement = MatFiguresGenerator::ring(size);
    // For localizing centers result.
    cv::Mat centersResult;
    // Applying erosion with hole ring.
    cv::erode(processingMat, centersResult, circleElement);
    // Showing result of the operation.
    renderMat(centersResult);
    delaySeconds(1);

    // 2. Creating big octagons to fill holes.

    // Octagon structuring element.
    size = 39;
    cv::Mat octagonElement = MatFiguresGenerator::octagon(size);
    // To store result of the op.
    cv::Mat octagonsResult;
    // Making centers of holes bigger.
    cv::dilate(centersResult, octagonsResult, octagonElement);
    // Showing result.
    renderMat(octagonsResult);
    delaySeconds(1);

    // 3. Filling holes.

    // To store result.
    cv::Mat holesHideResult;
    // Adding holes' patches.
    cv::bitwise_or(processingMat, octagonsResult, holesHideResult);
    // Result.
    renderMat(holesHideResult);
    delaySeconds(1);

    // 4. Outer rings.

    // Setting radius of the structuring loop.
    size = 117;
    cv::Mat teethCircleResult;
    // Getting loop without teeth.
    cv::Mat gearBody = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(size, size), cv::Point(size / 2, size / 2));
    cv::morphologyEx(holesHideResult, teethCircleResult, cv::MORPH_OPEN, gearBody);

    // To store the biggest loop.
    cv::Mat teethOuterResult;
    // Enlarging previous loop to include teeth.
    cv::Mat samplingRingSpacer = MatFiguresGenerator::ring(5);
    cv::dilate(teethCircleResult, teethCircleResult, samplingRingSpacer);

    // Enlarging outer loop to include outer part of teeth.
    cv::Mat samplingRingWidth = MatFiguresGenerator::ring(5);
    cv::dilate(teethCircleResult, teethOuterResult, samplingRingSpacer);

    // Excluding smaller loop from the bigger one to get the circle containing teeth.
    cv::bitwise_xor(teethOuterResult, teethCircleResult, teethCircleResult);
    // Showing.
    renderMat(teethCircleResult);
    delaySeconds(1);

    // 5. Teeth position.

    // To store all teeth here.
    cv::Mat teethResult;
    // Getting an intersection of teeth and covering circle.
    cv::bitwise_and(processingMat, teethCircleResult, teethResult);
    renderMat(teethResult);
    delaySeconds(1);

    // 6. Faults detection.

    // For result.
    cv::Mat faultsResult;
    // Optimal detection structure.
    size = 6;
    cv::Mat tipSpacing = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(size, size), cv::Point(size / 2, size / 2));
    cv::dilate(teethResult, faultsResult, tipSpacing);
    // Showing.
    renderMat(faultsResult);
    delaySeconds(1);

    // 7. Faults highlighting.

    // For final result.
    cv::Mat faultsHighlightingResult;
    // First action - subtracting.
    cv::subtract(teethCircleResult, faultsResult, faultsHighlightingResult);
    // Highlighting struct. element.
    size = 15;
    cv::Mat defectCue = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(size, size), cv::Point(size / 2, size / 2));
    cv::dilate(faultsHighlightingResult, faultsHighlightingResult, defectCue);
    cv::bitwise_or(faultsHighlightingResult, faultsResult, faultsHighlightingResult);
    renderMat(faultsHighlightingResult);
}