diff --git a/src/core/transformations/corner_harris.cpp b/src/core/transformations/corner_harris.cpp index f8979cf..8855029 100644 --- a/src/core/transformations/corner_harris.cpp +++ b/src/core/transformations/corner_harris.cpp @@ -26,7 +26,111 @@ PNM* CornerHarris::transform() PNM* newImage = new PNM(width, height, QImage::Format_Mono); - qDebug() << Q_FUNC_INFO << "Not implemented yet!"; + math::matrix matrix_xx(width, height); + math::matrix matrix_yy(width, height); + math::matrix matrix_xy(width, height); + math::matrix cornerCandidates(width, height); + math::matrix cornerNonmaxSuppress(width, height); + + for (int x = 0; x < width; x++) + for (int y = 0; y < height; y++) { + matrix_xx(x,y) = 0; + matrix_yy(x,y) = 0; + matrix_xy(x,y) = 0; + cornerCandidates(x,y) = 0; + cornerNonmaxSuppress(x,y) = 0; + } + + ConversionGrayscale conversionGrayscale(image); + image = conversionGrayscale.transform(); + + BlurGaussian blurGaussian(image); + blurGaussian.setParameter("size", 3); + blurGaussian.setParameter("sigma", 1.0); + image = blurGaussian.transform(); + + EdgeSobel edgeSobel(image); + math::matrix* Gx = edgeSobel.rawHorizontalDetection(); + math::matrix* Gy = edgeSobel.rawVerticalDetection(); + + for (int i = 0; i < width; i++){ + for (int j = 0; j < height; j++) { + matrix_xx(i,j) = (*Gx)(i,j) * (*Gx)(i,j); + matrix_yy(i,j) = (*Gy)(i,j) * (*Gy)(i,j); + matrix_xy(i,j) = (*Gx)(i,j) * (*Gy)(i,j); + } + } + + for (int i = 1; i < width - 1; i++){ + for (int j = 1; j < height - 1; j++) { + + float summa_xx = 0, summa_yy = 0, summa_xy = 0; + + for (int k = -1; k < 2; k++) + for (int l = -1; l < 2; l++) { + float gauss = BlurGaussian::getGauss(k,l,sigma); + summa_xx = summa_xx + matrix_xx(i+k, j+l)*gauss; + summa_yy = summa_yy + matrix_yy(i+k, j+l)*gauss; + summa_xy = summa_xy + matrix_xy(i+k, j+l)*gauss; + } + + summa_xx = summa_xx/sigma_weight; + summa_yy = summa_yy/sigma_weight; + summa_xy = summa_xy/sigma_weight; + + math::matrix H(2,2); + H(0,0) = summa_xx; + H(0,1) = H(1,0) = summa_xy; + H(1,1) = summa_yy; + + float detH = summa_xx*summa_yy - summa_xy*summa_xy; + float trH = summa_xx + summa_yy; + float r = detH - k_param * pow(trH, 2); + + if (r > threshold) + cornerCandidates(i,j) = r; + } + } + + bool search = true; + + while (search) { + search = false; + for (int i = 1; i < width - 1; i++) + for (int j = 1; j < height - 1; j++) { + + bool max = true; + + + + if ( + cornerCandidates(i-1, j-1) < cornerCandidates(i,j) && + cornerCandidates(i, j-1) < cornerCandidates(i,j) && + cornerCandidates(i+1, j-1) < cornerCandidates(i,j) && + cornerCandidates(i+1, j) < cornerCandidates(i,j) && + cornerCandidates(i+1, j+1) < cornerCandidates(i,j) && + cornerCandidates(i, j+1) < cornerCandidates(i,j) && + cornerCandidates(i-1, j+1) < cornerCandidates(i,j) && + cornerCandidates(i-1, j) < cornerCandidates(i,j) + ) + cornerNonmaxSuppress(i,j) = cornerCandidates(i,j); + else { + if (cornerCandidates(i,j) > 0) + search = true; + cornerNonmaxSuppress(i,j) = 0; + } + } + cornerCandidates = cornerNonmaxSuppress; + } + + + for (int i = 0; i < width; i++) + for (int j = 0; j < height; j++) { + if (cornerCandidates(i,j) == 0) + newImage->setPixel(i,j,Qt::color0); + else + newImage->setPixel(i,j,Qt::color1); + } return newImage; }