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); }
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); }