diff --git a/modules/stereo/src/descriptor.hpp b/modules/stereo/src/descriptor.hpp index 7119cb8d5..67476bfbd 100644 --- a/modules/stereo/src/descriptor.hpp +++ b/modules/stereo/src/descriptor.hpp @@ -71,6 +71,7 @@ namespace cv } stop = num_images; } + void operator()(int rrWidth,int w2, int rWidth, int jj, int j, int c[num_images]) const { CV_UNUSED(w2); @@ -78,17 +79,18 @@ namespace cv { if (image[i][rrWidth + jj] > image[i][rWidth + j]) { - c[i] = c[i] + 1; + c[i] += 1; } - c[i] = c[i] << 1; + c[i] <<= 1; if (integralImage[i][rrWidth + jj] > image[i][rWidth + j]) { - c[i] = c[i] + 1; + c[i] += 1; } - c[i] = c[i] << 1; + c[i] <<= 1; } } }; + //!Compares pixels from a patch giving high weights to pixels in which //!the intensity is higher. The other pixels receive a lower weight template @@ -106,22 +108,21 @@ namespace cv imageStop = num_images; t = threshold; } + void operator()(int rrWidth,int w2, int rWidth, int jj, int j, int c[num_images]) const { CV_UNUSED(w2); for(int i = 0; i < imageStop; i++) { - if (image[i][rrWidth + jj] > image[i][rWidth + j] - t) + if (image[i][rrWidth + jj] > image[i][rWidth + j] + t) { - c[i] = c[i] << 1; - c[i] = c[i] + 1; - c[i] = c[i] << 1; - c[i] = c[i] + 1; + c[i] <<= 2; + c[i] |= 0x11; } - else if (image[i][rWidth + j] - t < image[i][rrWidth + jj] && image[i][rWidth + j] + t >= image[i][rrWidth + jj]) + else if (image[i][rrWidth + jj] > image[i][rWidth + j] - t) { - c[i] = c[i] << 2; - c[i] = c[i] + 1; + c[i] <<= 2; + c[i] |= 0x01; } else { @@ -130,6 +131,7 @@ namespace cv } } }; + //!A madified cs census that compares a pixel with the imediat neightbour starting //!from the center template @@ -146,6 +148,7 @@ namespace cv imageStop = num_images; n2 = ker; } + void operator()(int rrWidth,int w2, int rWidth, int jj, int j, int c[num_images]) const { CV_UNUSED(j); @@ -154,12 +157,13 @@ namespace cv { if (image[i][(rrWidth + jj)] > image[i][(w2 + (jj + n2))]) { - c[i] = c[i] + 1; + c[i] += 1; } - c[i] = c[i] * 2; + c[i] <<= 1; } } }; + //!A kernel in which a pixel is compared with the center of the window template struct CensusKernel @@ -173,6 +177,7 @@ namespace cv image[i] = images[i]; imageStop = num_images; } + void operator()(int rrWidth,int w2, int rWidth, int jj, int j, int c[num_images]) const { CV_UNUSED(w2); @@ -187,6 +192,7 @@ namespace cv } } }; + //template clas which efficiently combines the descriptors template class CombinedDescriptor:public ParallelLoopBody @@ -209,6 +215,7 @@ namespace cv kernel_ = kernel; n2_stop = k2Stop; } + void operator()(const cv::Range &r) const CV_OVERRIDE { for (int i = r.start; i < r.end ; i++) { @@ -245,6 +252,7 @@ namespace cv } } }; + //!implementation for the star kernel descriptor template class StarKernelCensus:public ParallelLoopBody @@ -267,6 +275,7 @@ namespace cv im_num = num_images; stride_ = (int)img[0].step; } + void operator()(const cv::Range &r) const CV_OVERRIDE { for (int i = r.start; i < r.end; i++) { @@ -342,6 +351,7 @@ namespace cv } } }; + //!paralel implementation of the center symetric census template class SymetricCensus:public ParallelLoopBody @@ -364,6 +374,7 @@ namespace cv im_num = num_images; stride_ = (int)img[0].step; } + void operator()(const cv::Range &r) const CV_OVERRIDE { for (int i = r.start; i < r.end ; i++) { diff --git a/modules/stereo/src/stereo_binary_bm.cpp b/modules/stereo/src/stereo_binary_bm.cpp index ba4cb007e..a4c31d472 100644 --- a/modules/stereo/src/stereo_binary_bm.cpp +++ b/modules/stereo/src/stereo_binary_bm.cpp @@ -393,7 +393,7 @@ namespace cv { starCensusTransform(left,right,params.kernelSize,censusImage[0],censusImage[1]); } - hammingDistanceBlockMatching(censusImage[0], censusImage[1], hammingDistance); + hammingDistanceBlockMatching(censusImage[0], censusImage[1], hammingDistance, params.kernelSize); costGathering(hammingDistance, partialSumsLR); blockAgregation(partialSumsLR, params.agregationWindowSize, agregatedHammingLRCost); dispartyMapFormation(agregatedHammingLRCost, disp0, 3); diff --git a/modules/stereo/src/stereo_binary_sgbm.cpp b/modules/stereo/src/stereo_binary_sgbm.cpp index 2b23cccf3..10f3cdb44 100644 --- a/modules/stereo/src/stereo_binary_sgbm.cpp +++ b/modules/stereo/src/stereo_binary_sgbm.cpp @@ -679,7 +679,7 @@ namespace cv starCensusTransform(left,right,params.kernelSize,censusImageLeft,censusImageRight); } - hammingDistanceBlockMatching(censusImageLeft, censusImageRight, hamDist); + hammingDistanceBlockMatching(censusImageLeft, censusImageRight, hamDist, params.kernelSize); computeDisparityBinarySGBM( left, right, disp, params, buffer,hamDist); @@ -725,7 +725,8 @@ namespace cv void setMinDisparity(int minDisparity) CV_OVERRIDE {CV_Assert(minDisparity >= 0); params.minDisparity = minDisparity; } int getNumDisparities() const CV_OVERRIDE { return params.numDisparities; } - void setNumDisparities(int numDisparities) CV_OVERRIDE { CV_Assert(numDisparities > 0); params.numDisparities = numDisparities; } + void setNumDisparities(int numDisparities) CV_OVERRIDE { CV_Assert(numDisparities > 0); params.numDisparities = numDisparities; + Matching::setMaxDisparity(numDisparities /*- params.minDisparity*/);} int getBlockSize() const CV_OVERRIDE { return params.kernelSize; } void setBlockSize(int blockSize) CV_OVERRIDE {CV_Assert(blockSize % 2 != 0); params.kernelSize = blockSize; }