27 #include "../geometry/GTFactory.h"
28 #include "../common/PlatformUtils.h"
29 #include "../common/StringUtils.h"
30 #include "../raster/Band.h"
31 #include "../raster/Grid.h"
32 #include "../raster/BandProperty.h"
33 #include "../raster/RasterFactory.h"
34 #include "../datatype/Enums.h"
35 #include "../geometry/GTFilter.h"
37 #include <boost/scoped_array.hpp>
38 #include <boost/shared_array.hpp>
39 #include <boost/lexical_cast.hpp>
47 #include <boost/concept_check.hpp>
77 m_inMaskRaster1Ptr = 0;
78 m_inRaster1Bands.clear();
79 m_raster1TargetAreaLineStart = 0;
80 m_raster1TargetAreaColStart = 0;
81 m_raster1TargetAreaWidth = 0;
82 m_raster1TargetAreaHeight = 0;
84 m_inMaskRaster2Ptr = 0;
85 m_inRaster2Bands.clear();
86 m_raster2TargetAreaLineStart = 0;
87 m_raster2TargetAreaColStart = 0;
88 m_raster2TargetAreaWidth = 0;
89 m_raster2TargetAreaHeight = 0;
90 m_enableMultiThread =
true;
91 m_enableProgress =
false;
93 m_pixelSizeXRelation = 1;
94 m_pixelSizeYRelation = 1;
95 m_geomTransfName =
"Affine";
96 m_geomTransfMaxError = 2;
97 m_moravecCorrelationWindowWidth = 11;
98 m_moravecWindowWidth = 5;
99 m_maxR1ToR2Offset = 0;
100 m_enableGeometryFilter =
true;
101 m_geometryFilterAssurance = 0.1;
102 m_moravecGaussianFilterIterations = 1;
103 m_surfScalesNumber = 4;
104 m_surfOctavesNumber = 2;
105 m_rastersRescaleFactor = 1.0;
106 m_surfMaxNormEuclideanDist = 0.5;
107 m_moravecMinAbsCorrelation = 0.5;
180 m_transformationPtr.reset();
211 throw( te::rp::Exception )
222 double raster1XRescFact = 1.0;
223 double raster1YRescFact = 1.0;
224 double raster2XRescFact = 1.0;
225 double raster2YRescFact = 1.0;
266 std::auto_ptr< te::common::TaskProgress > progressPtr;
270 progressPtr->setTotalSteps( 1 );
271 progressPtr->setMessage(
"Locating tie points" );
272 progressPtr->pulse();
273 if( ! progressPtr->isActive() )
return false;
278 std::vector< double > tiePointsWeights;
347 "Invalid transformation" );
360 progressPtr->pulse();
361 if( ! progressPtr->isActive() )
return false;
368 const double raster1XRescFact,
369 const double raster1YRescFact,
370 const double raster2XRescFact,
371 const double raster2YRescFact,
374 std::vector< double >& tiePointsWeights )
375 throw( te::rp::Exception )
377 outParamsPtr->m_tiePoints.clear();
378 tiePointsWeights.clear();
385 double rescRaster1Area =
388 double rescRaster2Area =
392 if( rescRaster1Area > rescRaster2Area )
394 raster1MaxInterestPoints = (
unsigned int)(
398 else if( rescRaster1Area < rescRaster2Area )
400 raster2MaxInterestPoints = (
unsigned int)(
409 progressPtr->setTotalSteps( progressPtr->getTotalSteps() + 10 );
417 std::vector< boost::shared_ptr< FloatsMatrix > > raster1Data;
441 progressPtr->pulse();
442 if( ! progressPtr->isActive() )
return false;
449 boost::shared_ptr< FloatsMatrix > tempMatrix(
454 raster1Data[ 0 ]->getMaxTmpFileSize(),
455 raster1Data[ 0 ]->getMaxMemPercentUsage() ),
456 "Cannot allocate image matrix" );
464 raster1Data[ 0 ]->reset();
465 raster1Data[ 0 ] = tempMatrix;
472 progressPtr->pulse();
473 if( ! progressPtr->isActive() )
return false;
482 raster1MaxInterestPoints,
484 raster1InterestPoints ) )
491 progressPtr->pulse();
492 if( ! progressPtr->isActive() )
return false;
501 raster1InterestPoints,
506 "Error generating raster 1 features" );
508 raster1InterestPoints = auxInterestPoints;
514 progressPtr->pulse();
515 if( ! progressPtr->isActive() )
return false;
526 std::vector< boost::shared_ptr< FloatsMatrix > > raster2Data;
550 progressPtr->pulse();
551 if( ! progressPtr->isActive() )
return false;
558 boost::shared_ptr< FloatsMatrix > tempMatrix(
565 raster2Data[ 0 ]->getMaxTmpFileSize(),
566 raster2Data[ 0 ]->getMaxMemPercentUsage() ),
567 "Cannot allocate image matrix" );
575 raster2Data[ 0 ] = tempMatrix;
582 progressPtr->pulse();
583 if( ! progressPtr->isActive() )
return false;
592 raster2MaxInterestPoints,
594 raster2InterestPoints ) )
601 progressPtr->pulse();
602 if( ! progressPtr->isActive() )
return false;
611 raster2InterestPoints,
616 "Error generating raster 2 features" );
618 raster2InterestPoints = auxInterestPoints;
624 progressPtr->pulse();
625 if( ! progressPtr->isActive() )
return false;
636 raster1InterestPoints,
637 raster2InterestPoints,
642 "Error matching features" );
646 progressPtr->pulse();
647 if( ! progressPtr->isActive() )
return false;
652 raster1Features.
clear();
653 raster2Features.
clear();
654 raster1InterestPoints.clear();
655 raster2InterestPoints.clear();
661 MatchedInterestPointsSetT::const_iterator itB = matchedPoints.begin();
662 const MatchedInterestPointsSetT::const_iterator itE = matchedPoints.end();
664 float minFeatureValue1 = FLT_MAX;
665 float maxFeatureValue1 = (-1.0) * FLT_MAX;
666 float minFeatureValue2 = FLT_MAX;
667 float maxFeatureValue2 = (-1.0) * FLT_MAX;
668 float tiePointWeight = 0;
670 itB = matchedPoints.begin();
673 if( minFeatureValue1 > itB->m_point1.m_feature1 )
674 minFeatureValue1 = itB->m_point1.m_feature1;
675 if( maxFeatureValue1 < itB->m_point1.m_feature1 )
676 maxFeatureValue1 = itB->m_point1.m_feature1;
678 if( minFeatureValue2 > itB->m_point2.m_feature1 )
679 minFeatureValue2 = itB->m_point2.m_feature1;
680 if( maxFeatureValue2 < itB->m_point2.m_feature1 )
681 maxFeatureValue2 = itB->m_point2.m_feature1;
686 float featureValue1Range = maxFeatureValue1 - minFeatureValue1;
687 float featureValue2Range = maxFeatureValue2 - minFeatureValue2;
689 if( ( featureValue1Range == 0.0 ) || ( featureValue2Range == 0.0 ) )
691 tiePointsWeights.resize( matchedPoints.size(), 1.0 );
695 itB = matchedPoints.begin();
698 auxTP.first.x = ( itB->m_point1.m_x / raster1XRescFact ) +
700 auxTP.first.y = ( itB->m_point1.m_y / raster1YRescFact ) +
702 auxTP.second.x = ( itB->m_point2.m_x / raster2XRescFact ) +
704 auxTP.second.y = ( itB->m_point2.m_y / raster2YRescFact ) +
709 ( 2.0f * itB->m_feature )
713 ( itB->m_point1.m_feature1 - minFeatureValue1 )
719 ( itB->m_point1.m_feature2 - minFeatureValue2 )
726 tiePointsWeights.push_back( (
double)tiePointWeight );
728 outParamsPtr->m_tiePoints.push_back( auxTP );
737 progressPtr->pulse();
738 if( ! progressPtr->isActive() )
return false;
745 const double raster1XRescFact,
746 const double raster1YRescFact,
747 const double raster2XRescFact,
748 const double raster2YRescFact,
751 std::vector< double >& tiePointsWeights )
752 throw( te::rp::Exception )
754 outParamsPtr->m_tiePoints.clear();
755 tiePointsWeights.clear();
758 progressPtr->setTotalSteps( progressPtr->getTotalSteps() + 8 );
767 std::vector< boost::shared_ptr< FloatsMatrix > > rasterData;
794 progressPtr->pulse();
795 if( ! progressPtr->isActive() )
return false;
803 integralRaster ),
"Integral image creation error" );
809 progressPtr->pulse();
810 if( ! progressPtr->isActive() )
return false;
821 raster1InterestPoints ),
822 "Error locating raster 1 interest points" );
828 progressPtr->pulse();
829 if( ! progressPtr->isActive() )
return false;
836 integralRaster, validInterestPoints, raster1Features ),
837 "Error generating raster features" );
839 raster1InterestPoints = validInterestPoints;
843 progressPtr->pulse();
844 if( ! progressPtr->isActive() )
return false;
856 std::vector< boost::shared_ptr< FloatsMatrix > > rasterData;
883 progressPtr->pulse();
884 if( ! progressPtr->isActive() )
return false;
892 integralRaster ),
"Integral image creation error" );
896 progressPtr->pulse();
897 if( ! progressPtr->isActive() )
return false;
910 raster2InterestPoints ),
911 "Error locating raster interest points" );
917 progressPtr->pulse();
918 if( ! progressPtr->isActive() )
return false;
924 integralRaster, validInterestPoints, raster2Features ),
925 "Error generating raster features" );
927 raster2InterestPoints = validInterestPoints;
931 progressPtr->pulse();
932 if( ! progressPtr->isActive() )
return false;
946 raster1InterestPoints,
947 raster2InterestPoints,
952 "Error matching features" );
956 progressPtr->pulse();
957 if( ! progressPtr->isActive() )
return false;
964 MatchedInterestPointsSetT::iterator it1 = matchedPoints.begin();
965 MatchedInterestPointsSetT::iterator it2;
966 MatchedInterestPointsSetT::iterator eraseIt;
968 while( it1 != matchedPoints.end() )
972 eraseIt = matchedPoints.end();
974 while( it2 != matchedPoints.end() )
977 ( it1->m_point1.m_x == it2->m_point1.m_x )
979 ( it1->m_point1.m_y == it2->m_point1.m_y )
981 ( it1->m_point2.m_x == it2->m_point2.m_x )
983 ( it1->m_point2.m_y == it2->m_point2.m_y )
986 if( it1->m_feature < it2->m_feature )
990 else if( it1->m_feature > it2->m_feature )
1003 if( eraseIt == it1 )
1006 matchedPoints.erase( eraseIt );
1008 else if( eraseIt != matchedPoints.end() )
1010 matchedPoints.erase( eraseIt );
1024 matchedPoints.erase( matchedPoints.begin() );
1031 MatchedInterestPointsSetT::const_iterator itB = matchedPoints.begin();
1032 const MatchedInterestPointsSetT::const_iterator itE = matchedPoints.end();
1033 float minFeature1P1 = FLT_MAX;
1034 float maxFeature1P1 = (-1.0) * FLT_MAX;
1035 float minFeature1P2 = FLT_MAX;
1036 float maxFeature1P2 = (-1.0) * FLT_MAX;
1040 if( minFeature1P1 > itB->m_point1.m_feature1 )
1041 minFeature1P1 = itB->m_point1.m_feature1;
1042 if( maxFeature1P1 < itB->m_point1.m_feature1 )
1043 maxFeature1P1 = itB->m_point1.m_feature1;
1045 if( minFeature1P2 > itB->m_point2.m_feature1 )
1046 minFeature1P2 = itB->m_point2.m_feature1;
1047 if( maxFeature1P2 < itB->m_point2.m_feature1 )
1048 maxFeature1P2 = itB->m_point2.m_feature1;
1053 float feature1P1Range = maxFeature1P1 - minFeature1P1;
1054 float feature1P2Range = maxFeature1P2 - minFeature1P2;
1056 if( ( feature1P1Range == 0.0 ) || ( feature1P2Range == 0.0 ) )
1058 tiePointsWeights.resize( matchedPoints.size(), 1.0 );
1062 itB = matchedPoints.begin();
1066 auxTP.first.x = ( itB->m_point1.m_x / raster1XRescFact ) +
1068 auxTP.first.y = ( itB->m_point1.m_y / raster1YRescFact ) +
1070 auxTP.second.x = ( itB->m_point2.m_x / raster2XRescFact ) +
1072 auxTP.second.y = ( itB->m_point2.m_y / raster2YRescFact ) +
1075 tiePointsWeights.push_back( (
double)
1077 ( 2.0 * itB->m_feature )
1081 ( itB->m_point1.m_feature1 - minFeature1P1 + feature1P1Range )
1083 ( 2.0 * feature1P1Range )
1087 ( itB->m_point2.m_feature1 - minFeature1P2 + feature1P2Range )
1089 ( 2.0 * feature1P2Range )
1095 outParamsPtr->m_tiePoints.push_back( auxTP );
1113 throw( te::rp::Exception )
1128 "Invalid m_inRaster1Ptr" );
1131 "Invalid m_inRaster1Ptr" );
1139 "Invalid m_inMaskRaster1Ptr" );
1142 "Invalid m_inMaskRaster1Ptr" );
1146 "Invalid m_inMaskRaster1Ptr" );
1150 "Invalid m_inMaskRaster1Ptr" );
1157 "Invalid m_raster1TargetAreaLineStart" );
1161 "Invalid m_raster1TargetAreaColStart" );
1185 "Invalid m_raster1TargetAreaWidth" );
1187 "Invalid m_raster1TargetAreaHeight" );
1191 for(
unsigned int bandIdx = 0 ; bandIdx <
1197 "Invalid m_inRaster1Bands" );
1204 "Invalid m_inRaster2Ptr" );
1207 "Invalid m_inRaster2Ptr" );
1215 "Invalid m_inMaskRaster2Ptr" );
1218 "Invalid m_inMaskRaster2Ptr" );
1222 "Invalid m_inMaskRaster2Ptr" );
1226 "Invalid m_inMaskRaster2Ptr" );
1233 "Invalid m_raster2TargetAreaLineStart" );
1237 "Invalid m_raster2TargetAreaColStart" );
1261 "Invalid m_raster2TargetAreaWidth" );
1263 "Invalid m_raster2TargetAreaHeight" );
1268 for(
unsigned int bandIdx = 0 ; bandIdx <
1274 "Invalid m_inRaster2Bands" );
1285 == 1,
"Invalid number of raster 1 bands" );
1287 == 1,
"Invalid number of raster 2 bands" );
1293 const unsigned int maxRastersArea =
1301 const unsigned maxWindowSize = std::max(
1305 ( 4 * maxWindowSize * maxWindowSize );
1311 const double freeVMem = 0.4 * std::min( totalPhysMem, ( totalVMem - usedVMem ) );
1319 ( featSize * featSize )
1321 ( freeVMem / (
double)(
sizeof(
float ) ) )
1334 == 1,
"Invalid number of raster 1 bands" );
1336 == 1,
"Invalid number of raster 2 bands" );
1342 const unsigned int maxRastersArea =
1354 ( 4 * maxWindowSize * maxWindowSize );
1360 const double freeVMem = 0.4 * std::min( totalPhysMem, ( totalVMem - usedVMem ) );
1368 ( freeVMem / (
double)(
sizeof(
float ) ) )
1388 "Invalid m_maxTiePoints" )
1391 "Invalid m_pixelSizeXRelation" )
1394 "Invalid m_pixelSizeYRelation" )
1397 "Invalid m_geomTransfMaxError" )
1402 "Invalid m_moravecCorrelationWindowWidth" );
1407 "Invalid m_moravecWindowWidth" );
1411 "Invalid m_geomTransfName" );
1414 "Invalid m_surfScalesNumber" );
1417 "Invalid m_surfOctavesNumber" );
1420 "Invalid m_rastersRescaleFactor" );
1424 "Invalid m_surfMaxNormEuclideanDist" );
1428 "Invalid m_moravecMinAbsCorrelation" );
1432 "Invalid m_geometryFilterAssurance" );
1446 const std::vector< unsigned int >& rasterBands,
1448 const unsigned int maskRasterBand,
1449 const unsigned int rasterTargetAreaLineStart,
1450 const unsigned int rasterTargetAreaColStart,
1451 const unsigned int rasterTargetAreaWidth,
1452 const unsigned int rasterTargetAreaHeight,
1453 const double rescaleFactorX,
1454 const double rescaleFactorY,
1456 const unsigned char maxMemPercentUsage,
1457 std::vector< boost::shared_ptr< FloatsMatrix > >& loadedRasterData,
1462 const unsigned int rescaledNLines = (
unsigned int)(
1463 ((
double)rasterTargetAreaHeight) * rescaleFactorY );
1464 const unsigned int rescaledNCols = (
unsigned int)(
1465 ((
double)rasterTargetAreaWidth) * rescaleFactorX );
1468 unsigned char maxMemPercentUsagePerMatrix =
MAX( 1u, maxMemPercentUsage /
1470 ( maskRasterPtr ? 1 : 0 )
1472 ((
unsigned int)rasterBands.size()) )
1475 loadedRasterData.resize( rasterBands.size() );
1477 for(
unsigned int rasterBandsIdx = 0 ; rasterBandsIdx < rasterBands.size() ;
1480 loadedRasterData[ rasterBandsIdx ].reset(
new FloatsMatrix );
1483 maxMemPercentUsagePerMatrix ),
1484 "Cannot allocate image 1 matrix" );
1485 maxMemPercentUsagePerMatrix *= 2;
1491 rescaledNLines, rescaledNCols,
1493 "Cannot allocate image 1 mask matrix" );
1502 assert( inMaskRasterBand );
1504 unsigned char* outMaskLinePtr = 0;
1505 unsigned int outLine = 0;
1506 unsigned int outCol = 0;
1507 unsigned int inLine = 0;
1508 unsigned int inCol = 0;
1511 for( outLine = 0 ; outLine < rescaledNLines ; ++outLine )
1513 inLine = (
unsigned int)( ( ( (
double)outLine ) /
1514 rescaleFactorY ) + ( (double)rasterTargetAreaLineStart ) );
1516 outMaskLinePtr = loadedMaskRasterData[ outLine ];
1518 for( outCol = 0 ; outCol < rescaledNCols ; ++outCol )
1520 inCol = (
unsigned int)( ( ( (
double)outCol ) /
1521 rescaleFactorX ) + ( (double)rasterTargetAreaColStart ) );
1523 inMaskRasterBand->
getValue( inCol, inLine, value );
1526 outMaskLinePtr[ outCol ] = 0;
1528 outMaskLinePtr[ outCol ] = 255;
1535 const double rasterTargetAreaLineStartDouble = (double)
1536 rasterTargetAreaLineStart;
1537 const double rasterTargetAreaColStartDouble = (double)
1538 rasterTargetAreaColStart;
1540 float* floatLinePtr = 0;
1541 double* doubleLinePtr = 0;
1542 unsigned int outLine = 0;
1543 unsigned int outCol = 0;
1546 std::complex< double > interpolatedValue;
1547 unsigned int bandIdx = 0;
1555 "Cannot allocate auxiliar matrix" );
1557 for(
unsigned int rasterBandsIdx = 0 ; rasterBandsIdx < rasterBands.size() ;
1560 bandIdx= rasterBands[ rasterBandsIdx ];
1562 bandMax = -1.0 * DBL_MAX;
1564 for( outLine = 0 ; outLine < rescaledNLines ; ++outLine )
1566 inLine = ( ( (double)outLine ) / rescaleFactorY ) +
1567 rasterTargetAreaLineStartDouble;
1569 doubleLinePtr = auxBandData[ outLine ];
1571 for( outCol = 0 ; outCol < rescaledNCols ; ++outCol )
1573 inCol = ( ( (double)outCol ) / rescaleFactorX ) +
1574 rasterTargetAreaColStartDouble;
1576 interpInstance.
getValue( inCol, inLine, interpolatedValue,
1579 doubleLinePtr[ outCol ] = interpolatedValue.real();
1581 if( interpolatedValue.real() > bandMax ) bandMax = interpolatedValue.real();
1582 if( interpolatedValue.real() < bandMin ) bandMin = interpolatedValue.real();
1586 if( bandMin == bandMax )
1589 gain = ( 1.0 / ( bandMax - bandMin ) );
1591 for( outLine = 0 ; outLine < rescaledNLines ; ++outLine )
1593 doubleLinePtr = auxBandData[ outLine ];
1594 floatLinePtr = loadedRasterData[ rasterBandsIdx ]->operator[]( outLine );
1596 for( outCol = 0 ; outCol < rescaledNCols ; ++outCol )
1598 floatLinePtr[ outCol ] = (float)( ( doubleLinePtr[ outCol ] - bandMin ) * gain );
1610 const unsigned int moravecWindowWidth,
1611 const unsigned int maxInterestPoints,
1612 const unsigned int enableMultiThread,
1615 interestPoints.clear();
1617 const unsigned int minRasterWidthAndHeight = 2 * ( ( 2 *
1618 moravecWindowWidth ) - 1 );
1621 if( rasterData.
getLinesNumber() < minRasterWidthAndHeight )
return true;
1623 bool returnValue =
true;
1624 boost::mutex rastaDataAccessMutex;
1625 boost::mutex interestPointsAccessMutex;
1626 unsigned int nextRasterLinesBlockToProcess = 0;
1633 &nextRasterLinesBlockToProcess;
1639 if( enableMultiThread )
1644 minRasterWidthAndHeight, rasterData.
getLinesNumber() / procsNumber );
1646 const unsigned int rasterLinesBlocksNumber =
1651 maxInterestPoints / rasterLinesBlocksNumber;
1653 boost::thread_group threads;
1655 for(
unsigned int threadIdx = 0 ; threadIdx < procsNumber ;
1658 threads.add_thread(
new boost::thread(
1678 assert( paramsPtr );
1689 const unsigned int moravecWindowRadius = moravecWindowWidth / 2;
1697 const unsigned int bufferLines = moravecWindowWidth;
1698 const unsigned int lastBufferLineIdx = bufferLines - 1;
1700 const unsigned int rasterBufferLineSizeBytes =
sizeof(
1702 const unsigned int maskRasterBufferLineSizeBytes =
sizeof(
1709 if( ! rasterBufferDataHandler.
reset( bufferLines, bufferCols,
1718 boost::scoped_array< float* > rasterBufferHandler(
new float*[ bufferLines ] );
1719 for(
unsigned int rasterBufferDataHandlerLine = 0 ; rasterBufferDataHandlerLine <
1720 bufferLines ; ++rasterBufferDataHandlerLine )
1722 rasterBufferHandler[ rasterBufferDataHandlerLine ] = rasterBufferDataHandler[
1723 rasterBufferDataHandlerLine ];
1726 float** rasterBufferPtr = rasterBufferHandler.get();
1732 boost::scoped_array< unsigned char* > maskRasterBufferHandler(
new unsigned char*[ bufferLines ] );
1734 unsigned char** maskRasterBufferPtr = 0;
1738 if( ! maskRasterBufferDataHandler.
reset( bufferLines, bufferCols,
1747 for(
unsigned int maskRasterBufferDataHandlerLine = 0 ; maskRasterBufferDataHandlerLine <
1748 bufferLines ; ++maskRasterBufferDataHandlerLine )
1750 maskRasterBufferHandler[ maskRasterBufferDataHandlerLine ] = maskRasterBufferDataHandler[
1751 maskRasterBufferDataHandlerLine ];
1754 maskRasterBufferPtr = maskRasterBufferHandler.get();
1760 if( ! maximasBufferDataHandler.
reset( bufferLines, bufferCols,
1769 boost::scoped_array< float* > maximasBufferHandler(
new float*[ bufferLines ] );
1770 float** maximasBufferPtr = maximasBufferHandler.get();
1771 unsigned int bufferCol = 0;
1772 for(
unsigned int maximasBufferDataHandlerLine = 0 ; maximasBufferDataHandlerLine <
1773 bufferLines ; ++maximasBufferDataHandlerLine )
1775 maximasBufferHandler[ maximasBufferDataHandlerLine ] = maximasBufferDataHandler[
1776 maximasBufferDataHandlerLine ];
1777 for( bufferCol = 0 ; bufferCol < bufferCols ; ++bufferCol )
1779 maximasBufferPtr[ maximasBufferDataHandlerLine ][ bufferCol ] = 0;
1785 const unsigned int rasterLinesBlocksNumber =
1789 for(
unsigned int rasterLinesBlockIdx = 0; rasterLinesBlockIdx <
1790 rasterLinesBlocksNumber ; ++rasterLinesBlockIdx )
1804 const unsigned int rasterLinesStart = (
unsigned int)std::max( 0,
1806 (
int)( 2 * moravecWindowRadius ) );
1807 const unsigned int rasterLinesEndBound = std::min( 1 +
1810 ( 2 * moravecWindowRadius ), rasterLines );
1811 const unsigned int varianceCalcStartRasterLineStart = rasterLinesStart +
1812 moravecWindowWidth - 1;
1813 const unsigned int maximasLocationStartRasterLineStart =
1814 varianceCalcStartRasterLineStart + moravecWindowWidth - 1;
1815 unsigned int windowStartBufCol = 0;
1816 const unsigned int windowEndBufColsBound = bufferCols -
1818 unsigned int windowStartBufOffset = 0;
1819 unsigned int windowStartBufXOffset = 0;
1820 unsigned int windowStartBufYOffset = 0;
1825 float diffValue = 0;
1826 bool isLocalMaxima =
false;
1828 float neighborMaximaDif = 0;
1830 for(
unsigned int rasterLine = rasterLinesStart; rasterLine < rasterLinesEndBound ;
1837 memcpy( rasterBufferPtr[ lastBufferLineIdx ],
1839 rasterBufferLineSizeBytes );
1845 memcpy( maskRasterBufferPtr[ lastBufferLineIdx ],
1847 maskRasterBufferLineSizeBytes );
1854 if( rasterLine >= varianceCalcStartRasterLineStart )
1858 for( windowStartBufCol = 0 ; windowStartBufCol < windowEndBufColsBound ;
1859 ++windowStartBufCol )
1861 const float& windowCenterPixelValue = rasterBufferPtr[
1862 moravecWindowRadius ][ windowStartBufCol +
1863 moravecWindowRadius ];
1869 for( windowStartBufOffset = 0 ; windowStartBufOffset <
1870 moravecWindowWidth ; ++windowStartBufOffset )
1872 diffValue = windowCenterPixelValue - rasterBufferPtr[
1873 moravecWindowRadius ][ windowStartBufCol +
1874 windowStartBufOffset ];
1875 horVar += ( diffValue * diffValue );
1877 diffValue = windowCenterPixelValue - rasterBufferPtr[
1878 windowStartBufOffset ][ windowStartBufCol +
1879 moravecWindowRadius ];
1880 verVar += ( diffValue * diffValue );
1882 diffValue = windowCenterPixelValue - rasterBufferPtr[
1883 windowStartBufOffset ][ windowStartBufCol +
1884 windowStartBufOffset ];
1885 diagVar += ( diffValue * diffValue );
1887 diffValue = windowCenterPixelValue - rasterBufferPtr[
1888 moravecWindowWidth - 1 - windowStartBufOffset ][ windowStartBufCol +
1889 windowStartBufOffset ];
1890 adiagVar += ( diffValue * diffValue );
1893 maximasBufferPtr[ lastBufferLineIdx ][ windowStartBufCol +
1894 moravecWindowRadius ] = std::min( horVar, std::min(
1895 verVar, std::min( diagVar, adiagVar ) ) );
1901 if( rasterLine >= maximasLocationStartRasterLineStart )
1903 for( windowStartBufCol = 0 ; windowStartBufCol < windowEndBufColsBound ;
1904 ++windowStartBufCol )
1906 isLocalMaxima =
true;
1907 const float& windowCenterPixelValue = maximasBufferPtr[
1908 moravecWindowRadius ][ windowStartBufCol +
1909 moravecWindowRadius ];
1912 for( windowStartBufYOffset = 0 ; windowStartBufYOffset <
1913 moravecWindowWidth ; ++windowStartBufYOffset )
1915 for( windowStartBufXOffset = 0 ; windowStartBufXOffset <
1916 moravecWindowWidth ; ++windowStartBufXOffset )
1918 neighborMaximaDif = windowCenterPixelValue - maximasBufferPtr[
1919 windowStartBufYOffset ][ windowStartBufCol +
1920 windowStartBufXOffset ];
1922 if( neighborMaximaDif < 0.0 )
1924 isLocalMaxima =
false;
1925 windowStartBufYOffset = moravecWindowWidth;
1929 auxInterestPoint.
m_feature1 += std::abs( neighborMaximaDif );
1935 auxInterestPoint.
m_x = windowStartBufCol +
1936 moravecWindowRadius;
1937 auxInterestPoint.
m_y = rasterLine - moravecWindowWidth + 1;
1938 assert( auxInterestPoint.
m_x <
1940 assert( auxInterestPoint.
m_y <
1943 if( maskRasterBufferPtr )
1945 if( maskRasterBufferPtr[ 0 ][ auxInterestPoint.
m_x ] )
1947 blockMaximas.insert( auxInterestPoint);
1949 if( blockMaximas.size() >
1952 blockMaximas.erase( blockMaximas.begin() );
1958 blockMaximas.insert( auxInterestPoint );
1960 if( blockMaximas.size() >
1963 blockMaximas.erase( blockMaximas.begin() );
1975 unsigned int pointsToAdd = std::min(
1977 (
unsigned int)blockMaximas.size() );
1978 InterestPointsSetT::const_reverse_iterator blockMaximasIt =
1979 blockMaximas.rbegin();
1981 while( pointsToAdd )
2006 interestPoints.clear();
2010 bool returnValue =
true;
2011 boost::mutex rastaDataAccessMutex;
2012 boost::mutex interestPointsAccessMutex;
2013 unsigned int nextRasterLinesBlockToProcess = 0;
2020 &nextRasterLinesBlockToProcess;
2034 4 * maxGausFilterWidth, integralRasterData.
getLinesNumber() / procsNumber );
2039 const unsigned int rasterLinesBlocksNumber =
2046 boost::thread_group threads;
2048 for(
unsigned int threadIdx = 0 ; threadIdx < procsNumber ;
2051 threads.add_thread(
new boost::thread(
2073 assert( paramsPtr );
2088 const unsigned int maxGausFilterRadius = maxGausFilterWidth / 2;
2089 const unsigned int prevResponseBufferLineIdx = maxGausFilterRadius - 1;
2090 const unsigned int nextResponseBufferLineIdx = maxGausFilterRadius + 1;
2091 const unsigned int buffersLines = maxGausFilterWidth;
2092 const unsigned int lastBuffersLineIdx = buffersLines - 1;
2097 const unsigned int rasterBufferLineSizeBytes =
sizeof( float ) *
2103 const unsigned maxGausFilterCenterBufferColBound = buffersCols -
2104 maxGausFilterRadius;
2106 unsigned int scaleIdx = 0 ;
2107 unsigned int octaveIdx = 0 ;
2113 boost::scoped_array< float* > rasterBufferHandler(
new float*[ buffersLines ] );
2115 if( ! rasterBufferDataHandler.
reset( buffersLines, buffersCols,
2124 for(
unsigned int rasterBufferDataHandlerLine = 0 ; rasterBufferDataHandlerLine <
2125 buffersLines ; ++rasterBufferDataHandlerLine )
2127 rasterBufferHandler[ rasterBufferDataHandlerLine ] = rasterBufferDataHandler[
2128 rasterBufferDataHandlerLine ];
2131 float** rasterBufferPtr = rasterBufferHandler.get();
2137 boost::scoped_array< unsigned char* > maskRasterBufferHandler(
new unsigned char*[ buffersLines ] );
2139 unsigned char** maskRasterBufferPtr = 0;
2143 if( ! maskRasterBufferDataHandler.
reset( buffersLines, buffersCols,
2152 for(
unsigned int maskRasterBufferDataHandlerLine = 0 ; maskRasterBufferDataHandlerLine <
2153 buffersLines ; ++maskRasterBufferDataHandlerLine )
2155 maskRasterBufferHandler[ maskRasterBufferDataHandlerLine ] = maskRasterBufferDataHandler[
2156 maskRasterBufferDataHandlerLine ];
2159 maskRasterBufferPtr = maskRasterBufferHandler.get();
2165 std::vector< std::vector< boost::shared_array< float* > > >
2166 octavesBufferHandlers;
2168 const unsigned int octavesBufferDataHandlerLines =
2170 if( ! octavesBufferDataHandler.
reset( octavesBufferDataHandlerLines ,
2179 unsigned int octavesBufferDataHandlerLine = 0;
2180 unsigned int octavesBufferDataHandlerCol = 0;
2181 float* octavesBufferDataHandlerLinePtr = 0;
2182 for( octavesBufferDataHandlerLine = 0; octavesBufferDataHandlerLine <
2183 octavesBufferDataHandlerLines ; ++octavesBufferDataHandlerLine )
2185 octavesBufferDataHandlerLinePtr = octavesBufferDataHandler[
2186 octavesBufferDataHandlerLine ];
2188 for( octavesBufferDataHandlerCol = 0; octavesBufferDataHandlerCol <
2189 buffersCols ; ++octavesBufferDataHandlerCol )
2191 octavesBufferDataHandlerLinePtr[ octavesBufferDataHandlerCol ] = 0.0;
2195 octavesBufferDataHandlerLine = 0;
2196 for( octaveIdx = 0 ; octaveIdx < paramsPtr->
m_octavesNumber ; ++octaveIdx )
2198 octavesBufferHandlers.push_back( std::vector< boost::shared_array< float* > >() );
2199 std::vector< boost::shared_array< float* > >&
2200 currOctaveBuffersHandler = octavesBufferHandlers.back();
2202 for( scaleIdx = 0 ; scaleIdx < paramsPtr->
m_scalesNumber ; ++scaleIdx )
2204 currOctaveBuffersHandler.push_back( boost::shared_array< float* >(
2205 new float*[ buffersLines ] ) );
2206 boost::shared_array< float* >& currOctavesBuffer =
2207 currOctaveBuffersHandler.back();
2208 for(
unsigned int bufferLine = 0 ; bufferLine < buffersLines ;
2211 assert( octavesBufferDataHandlerLine <
2214 currOctavesBuffer[ bufferLine ] = octavesBufferDataHandler[
2215 octavesBufferDataHandlerLine ];
2217 ++octavesBufferDataHandlerLine;
2226 std::vector< std::vector< boost::shared_array< unsigned char* > > >
2227 laplacianSignBufferHandlers;
2229 const unsigned int laplacianSignBufferDataHandlerLines =
2231 if( ! laplacianSignBufferDataHandler.
reset( laplacianSignBufferDataHandlerLines ,
2240 unsigned int laplacianSignBufferDataHandlerLine = 0;
2241 unsigned int laplacianSignBufferDataHandlerCol = 0;
2242 unsigned char* laplacianSignBufferDataHandlerLinePtr = 0;
2243 for( laplacianSignBufferDataHandlerLine = 0; laplacianSignBufferDataHandlerLine <
2244 laplacianSignBufferDataHandlerLines ; ++laplacianSignBufferDataHandlerLine )
2246 laplacianSignBufferDataHandlerLinePtr = laplacianSignBufferDataHandler[
2247 laplacianSignBufferDataHandlerLine ];
2249 for( laplacianSignBufferDataHandlerCol = 0; laplacianSignBufferDataHandlerCol <
2250 buffersCols ; ++laplacianSignBufferDataHandlerCol )
2252 laplacianSignBufferDataHandlerLinePtr[ laplacianSignBufferDataHandlerCol ] =
2257 laplacianSignBufferDataHandlerLine = 0;
2258 for( octaveIdx = 0 ; octaveIdx < paramsPtr->
m_octavesNumber ; ++octaveIdx )
2260 laplacianSignBufferHandlers.push_back( std::vector< boost::shared_array< unsigned char* > >() );
2261 std::vector< boost::shared_array< unsigned char* > >&
2262 currlaplacianSignBuffersHandler = laplacianSignBufferHandlers.back();
2264 for( scaleIdx = 0 ; scaleIdx < paramsPtr->
m_scalesNumber ; ++scaleIdx )
2266 currlaplacianSignBuffersHandler.push_back( boost::shared_array< unsigned char* >(
2267 new unsigned char*[ buffersLines ] ) );
2268 boost::shared_array< unsigned char* >& currlaplacianSignBuffer =
2269 currlaplacianSignBuffersHandler.back();
2270 for(
unsigned int bufferLine = 0 ; bufferLine < buffersLines ;
2273 assert( laplacianSignBufferDataHandlerLine <
2276 currlaplacianSignBuffer[ bufferLine ] = laplacianSignBufferDataHandler[
2277 laplacianSignBufferDataHandlerLine ];
2279 ++laplacianSignBufferDataHandlerLine;
2287 const unsigned int rasterLinesBlocksNumber =
2291 for(
unsigned int rasterLinesBlockIdx = 0; rasterLinesBlockIdx <
2292 rasterLinesBlocksNumber ; ++rasterLinesBlockIdx )
2296 std::vector< InterestPointsSetT > blockMaximas( paramsPtr->
m_scalesNumber *
2309 const unsigned int rasterLinesStart = (
unsigned int)std::max( 0,
2311 (
int)( 2 * maxGausFilterRadius ) );
2312 const unsigned int rasterLinesEndBound = std::min( 1 +
2315 ( 2 * maxGausFilterRadius ), rasterLines );
2316 const unsigned int firstRasterLineToGenerateResponse =
2317 rasterLinesStart + maxGausFilterWidth - 1;
2318 const unsigned int firstRasterLineToLookForMaximas =
2319 firstRasterLineToGenerateResponse + maxGausFilterRadius + 1;
2322 unsigned int filterWidth = 0;
2323 unsigned int filterLobeWidth = 0;
2324 unsigned int filterLobeRadius = 0;
2325 unsigned int filterCenterBufCol = 0 ;
2331 float** currScaleBufferPtr = 0;
2332 unsigned char** currLaplacianSignBufferPtr = 0;
2333 unsigned int lastScaleIdx = 0;
2334 unsigned int nextScaleIdx = 0;
2335 unsigned int prevResponseBufferColIdx = 0;
2336 unsigned int nextResponseBufferColIdx = 0;
2338 float neighborMaximaDif_0_1 = 0.0;
2339 float neighborMaximaDif_0_2 = 0.0;
2340 float neighborMaximaDif_0_3 = 0.0;
2341 float neighborMaximaDif_0_4 = 0.0;
2342 float neighborMaximaDif_0_5 = 0.0;
2343 float neighborMaximaDif_0_6 = 0.0;
2344 float neighborMaximaDif_0_7 = 0.0;
2345 float neighborMaximaDif_0_8 = 0.0;
2346 float neighborMaximaDif_1_1 = 0.0;
2347 float neighborMaximaDif_1_2 = 0.0;
2348 float neighborMaximaDif_1_3 = 0.0;
2349 float neighborMaximaDif_1_4 = 0.0;
2350 float neighborMaximaDif_1_5 = 0.0;
2351 float neighborMaximaDif_1_6 = 0.0;
2352 float neighborMaximaDif_1_7 = 0.0;
2353 float neighborMaximaDif_1_8 = 0.0;
2354 float neighborMaximaDif_1_9 = 0.0;
2355 float neighborMaximaDif_2_1 = 0.0;
2356 float neighborMaximaDif_2_2 = 0.0;
2357 float neighborMaximaDif_2_3 = 0.0;
2358 float neighborMaximaDif_2_4 = 0.0;
2359 float neighborMaximaDif_2_5 = 0.0;
2360 float neighborMaximaDif_2_6 = 0.0;
2361 float neighborMaximaDif_2_7 = 0.0;
2362 float neighborMaximaDif_2_8 = 0.0;
2363 float neighborMaximaDif_2_9 = 0.0;
2367 for(
unsigned int rasterLine = rasterLinesStart; rasterLine < rasterLinesEndBound ;
2376 memcpy( rasterBufferPtr[ lastBuffersLineIdx ],
2378 rasterBufferLineSizeBytes );
2384 memcpy( maskRasterBufferPtr[ lastBuffersLineIdx ],
2386 maskRasterBufferLineSizeBytes );
2392 if( rasterLine >= firstRasterLineToGenerateResponse )
2394 for( octaveIdx = 0 ; octaveIdx < paramsPtr->
m_octavesNumber ; ++octaveIdx )
2399 assert( octavesBufferHandlers.size() > octaveIdx );
2400 assert( octavesBufferHandlers[ octaveIdx].size() > scaleIdx );
2401 currScaleBufferPtr = octavesBufferHandlers[ octaveIdx][ scaleIdx ].get();
2402 assert( currScaleBufferPtr );
2404 assert( laplacianSignBufferHandlers.size() > octaveIdx );
2405 assert( laplacianSignBufferHandlers[ octaveIdx].size() > scaleIdx );
2406 currLaplacianSignBufferPtr = laplacianSignBufferHandlers[ octaveIdx][ scaleIdx ].get();
2407 assert( currLaplacianSignBufferPtr );
2412 roolUpBuffer( currLaplacianSignBufferPtr, buffersLines );
2417 assert( filterWidth <= maxGausFilterWidth );
2419 filterLobeWidth = filterWidth / 3;
2420 filterLobeRadius = filterLobeWidth / 2;
2422 for( filterCenterBufCol = maxGausFilterRadius ;
2423 filterCenterBufCol < maxGausFilterCenterBufferColBound ;
2424 ++filterCenterBufCol )
2427 maxGausFilterRadius, filterLobeWidth, filterLobeRadius);
2428 dYY /= (float)( filterWidth * filterWidth );
2431 maxGausFilterRadius, filterLobeWidth, filterLobeRadius);
2432 dXX /= (float)( filterWidth * filterWidth );
2435 maxGausFilterRadius, filterLobeWidth );
2436 dXY /= (float)( filterWidth * filterWidth );
2438 currScaleBufferPtr[ lastBuffersLineIdx ][ filterCenterBufCol ] =
2439 ( dXX * dYY ) - ( 0.81f * dXY * dXY );
2440 currLaplacianSignBufferPtr[ lastBuffersLineIdx ][ filterCenterBufCol ] =
2441 ( ( dXX + dYY ) >= 0.0 ) ? 1 : 0;
2450 if( rasterLine >= firstRasterLineToLookForMaximas )
2457 for(
unsigned int windCenterCol = maxGausFilterRadius ;
2458 windCenterCol < maxGausFilterCenterBufferColBound ; ++windCenterCol )
2460 prevResponseBufferColIdx = windCenterCol - 1;
2461 nextResponseBufferColIdx = windCenterCol + 1;
2462 auxInterestPoint.
m_feature1 = (-1.0) * FLT_MAX;
2464 for( octaveIdx = 0 ; octaveIdx < paramsPtr->
m_octavesNumber ; ++octaveIdx )
2466 std::vector< boost::shared_array< float* > >&
2467 currOctaveBuffersHandler = octavesBufferHandlers[ octaveIdx ];
2469 for( scaleIdx = 1 ; scaleIdx < ( paramsPtr->
m_scalesNumber - 1 );
2472 const float& windowCenterPixelValue = currOctaveBuffersHandler[
2473 scaleIdx ][ maxGausFilterRadius ][ windCenterCol ];
2474 lastScaleIdx = scaleIdx - 1;
2475 nextScaleIdx = scaleIdx + 1;
2477 neighborMaximaDif_0_1 = windowCenterPixelValue - currOctaveBuffersHandler[
2478 scaleIdx ][ prevResponseBufferLineIdx ][ prevResponseBufferColIdx ];
2479 neighborMaximaDif_0_2 = windowCenterPixelValue - currOctaveBuffersHandler[
2480 scaleIdx ][ prevResponseBufferLineIdx ][ windCenterCol ];
2481 neighborMaximaDif_0_3 = windowCenterPixelValue - currOctaveBuffersHandler[
2482 scaleIdx ][ prevResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2483 neighborMaximaDif_0_4 = windowCenterPixelValue - currOctaveBuffersHandler[
2484 scaleIdx ][ maxGausFilterRadius ][ prevResponseBufferColIdx ];
2485 neighborMaximaDif_0_5 = windowCenterPixelValue - currOctaveBuffersHandler[
2486 scaleIdx ][ maxGausFilterRadius ][ nextResponseBufferColIdx ];
2487 neighborMaximaDif_0_6 = windowCenterPixelValue - currOctaveBuffersHandler[
2488 scaleIdx ][ nextResponseBufferLineIdx ][ prevResponseBufferColIdx];
2489 neighborMaximaDif_0_7 = windowCenterPixelValue - currOctaveBuffersHandler[
2490 scaleIdx ][ nextResponseBufferLineIdx ][ windCenterCol ];
2491 neighborMaximaDif_0_8 = windowCenterPixelValue - currOctaveBuffersHandler[
2492 scaleIdx ][ nextResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2495 ( windowCenterPixelValue > 0.0 )
2497 && ( neighborMaximaDif_0_1 > 0.0 )
2498 && ( neighborMaximaDif_0_2 > 0.0 )
2499 && ( neighborMaximaDif_0_3 > 0.0 )
2500 && ( neighborMaximaDif_0_4 > 0.0 )
2501 && ( neighborMaximaDif_0_5 > 0.0 )
2502 && ( neighborMaximaDif_0_6 > 0.0 )
2503 && ( neighborMaximaDif_0_7 > 0.0 )
2504 && ( neighborMaximaDif_0_8 > 0.0 )
2507 neighborMaximaDif_1_1 = windowCenterPixelValue - currOctaveBuffersHandler[
2508 lastScaleIdx ][ prevResponseBufferLineIdx ][ prevResponseBufferColIdx ];
2509 neighborMaximaDif_1_2 = windowCenterPixelValue - currOctaveBuffersHandler[
2510 lastScaleIdx ][ prevResponseBufferLineIdx ][ windCenterCol ];
2511 neighborMaximaDif_1_3 = windowCenterPixelValue - currOctaveBuffersHandler[
2512 lastScaleIdx ][ prevResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2513 neighborMaximaDif_1_4 = windowCenterPixelValue - currOctaveBuffersHandler[
2514 lastScaleIdx ][ maxGausFilterRadius ][ prevResponseBufferColIdx ];
2515 neighborMaximaDif_1_5 = windowCenterPixelValue - currOctaveBuffersHandler[
2516 lastScaleIdx ][ maxGausFilterRadius ][ windCenterCol ];
2517 neighborMaximaDif_1_6 = windowCenterPixelValue - currOctaveBuffersHandler[
2518 lastScaleIdx ][ maxGausFilterRadius ][ nextResponseBufferColIdx ];
2519 neighborMaximaDif_1_7 = windowCenterPixelValue - currOctaveBuffersHandler[
2520 lastScaleIdx ][ nextResponseBufferLineIdx ][ prevResponseBufferColIdx];
2521 neighborMaximaDif_1_8 = windowCenterPixelValue - currOctaveBuffersHandler[
2522 lastScaleIdx ][ nextResponseBufferLineIdx ][ windCenterCol ];
2523 neighborMaximaDif_1_9 = windowCenterPixelValue - currOctaveBuffersHandler[
2524 lastScaleIdx ][ nextResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2528 ( neighborMaximaDif_1_1 > 0.0 )
2529 && ( neighborMaximaDif_1_2 > 0.0 )
2530 && ( neighborMaximaDif_1_3 > 0.0 )
2531 && ( neighborMaximaDif_1_4 > 0.0 )
2532 && ( neighborMaximaDif_1_5 > 0.0 )
2533 && ( neighborMaximaDif_1_6 > 0.0 )
2534 && ( neighborMaximaDif_1_7 > 0.0 )
2535 && ( neighborMaximaDif_1_8 > 0.0 )
2536 && ( neighborMaximaDif_1_9 > 0.0 )
2539 neighborMaximaDif_2_1 = windowCenterPixelValue - currOctaveBuffersHandler[
2540 nextScaleIdx ][ prevResponseBufferLineIdx ][ prevResponseBufferColIdx ];
2541 neighborMaximaDif_2_2 = windowCenterPixelValue - currOctaveBuffersHandler[
2542 nextScaleIdx ][ prevResponseBufferLineIdx ][ windCenterCol ];
2543 neighborMaximaDif_2_3 = windowCenterPixelValue - currOctaveBuffersHandler[
2544 nextScaleIdx ][ prevResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2545 neighborMaximaDif_2_4 = windowCenterPixelValue - currOctaveBuffersHandler[
2546 nextScaleIdx ][ maxGausFilterRadius ][ prevResponseBufferColIdx ];
2547 neighborMaximaDif_2_5 = windowCenterPixelValue - currOctaveBuffersHandler[
2548 nextScaleIdx ][ maxGausFilterRadius ][ windCenterCol ];
2549 neighborMaximaDif_2_6 = windowCenterPixelValue - currOctaveBuffersHandler[
2550 nextScaleIdx ][ maxGausFilterRadius ][ nextResponseBufferColIdx ];
2551 neighborMaximaDif_2_7 = windowCenterPixelValue - currOctaveBuffersHandler[
2552 nextScaleIdx ][ nextResponseBufferLineIdx ][ prevResponseBufferColIdx];
2553 neighborMaximaDif_2_8 = windowCenterPixelValue - currOctaveBuffersHandler[
2554 nextScaleIdx ][ nextResponseBufferLineIdx ][ windCenterCol ];
2555 neighborMaximaDif_2_9 = windowCenterPixelValue - currOctaveBuffersHandler[
2556 nextScaleIdx ][ nextResponseBufferLineIdx ][ nextResponseBufferColIdx ];
2560 ( neighborMaximaDif_2_1 > 0.0 )
2561 && ( neighborMaximaDif_2_2 > 0.0 )
2562 && ( neighborMaximaDif_2_3 > 0.0 )
2563 && ( neighborMaximaDif_2_4 > 0.0 )
2564 && ( neighborMaximaDif_2_5 > 0.0 )
2565 && ( neighborMaximaDif_2_6 > 0.0 )
2566 && ( neighborMaximaDif_2_7 > 0.0 )
2567 && ( neighborMaximaDif_2_8 > 0.0 )
2568 && ( neighborMaximaDif_2_9 > 0.0 )
2572 ( maskRasterBufferPtr[ 0 ][ windCenterCol ] != 0 )
2579 neighborMaximaDif_0_1
2580 + neighborMaximaDif_0_2
2581 + neighborMaximaDif_0_3
2582 + neighborMaximaDif_0_4
2583 + neighborMaximaDif_0_5
2584 + neighborMaximaDif_0_6
2585 + neighborMaximaDif_0_7
2586 + neighborMaximaDif_0_8
2587 + neighborMaximaDif_1_1
2588 + neighborMaximaDif_1_2
2589 + neighborMaximaDif_1_3
2590 + neighborMaximaDif_1_4
2591 + neighborMaximaDif_1_5
2592 + neighborMaximaDif_1_6
2593 + neighborMaximaDif_1_7
2594 + neighborMaximaDif_1_8
2595 + neighborMaximaDif_1_9
2596 + neighborMaximaDif_2_1
2597 + neighborMaximaDif_2_2
2598 + neighborMaximaDif_2_3
2599 + neighborMaximaDif_2_4
2600 + neighborMaximaDif_2_5
2601 + neighborMaximaDif_2_6
2602 + neighborMaximaDif_2_7
2603 + neighborMaximaDif_2_8
2604 + neighborMaximaDif_2_9;
2606 octaveIdx, scaleIdx );
2608 laplacianSignBufferHandlers[ octaveIdx ][ scaleIdx ][
2609 maxGausFilterRadius ][ windCenterCol ] ;
2611 auxInterestPoint.
m_x = windCenterCol;
2612 auxInterestPoint.
m_y = rasterLine - ( 2 * maxGausFilterRadius) ;
2613 assert( auxInterestPoint.
m_x <
2615 assert( auxInterestPoint.
m_y <
2619 scaleIdx ) < blockMaximas.size() );
2623 currScalePointsSet.insert( auxInterestPoint);
2625 if( currScalePointsSet.size() >
2628 currScalePointsSet.erase( currScalePointsSet.begin() );
2648 for(
unsigned int blockMaximasIdx = 0 ; blockMaximasIdx <
2649 blockMaximas.size() ; ++blockMaximasIdx )
2652 blockMaximas[ blockMaximasIdx ].begin(),
2653 blockMaximas[ blockMaximasIdx ].end() );
2663 const std::string& tifFileName )
2665 std::map<std::string, std::string> rInfo;
2666 rInfo[
"URI"] = tifFileName +
".tif";
2668 std::vector<te::rst::BandProperty*> bandsProperties;
2671 bandsProperties[0]->m_noDataValue = 0;
2680 std::auto_ptr< te::rst::Raster > outputRasterPtr(
2684 unsigned int line = 0;
2685 unsigned int col = 0;
2688 double rasterDataMin = DBL_MAX;
2689 double rasterDataMax = (-1.0) * DBL_MAX;
2692 for( line = 0 ; line < nLines ; ++line )
2693 for( col = 0 ; col < nCols ; ++col )
2695 value = rasterData[ line ][ col ];
2697 if( rasterDataMin > value )
2698 rasterDataMin = value;
2699 if( rasterDataMax < value )
2700 rasterDataMax = value;
2703 if( rasterDataMax == rasterDataMin )
2705 rasterDataMin = 0.0;
2706 rasterDataMax = 1.0;
2709 for( line = 0 ; line < nLines ; ++line )
2710 for( col = 0 ; col < nCols ; ++col )
2712 value = rasterData[ line ][ col ];
2713 value = ( value - rasterDataMin ) / ( rasterDataMax - rasterDataMin );
2715 value = std::max( 0.0, value );
2716 value = std::min( 255.0, value );
2718 outputRasterPtr->setValue( col, line, value, 0 );
2719 outputRasterPtr->setValue( col, line, value, 1 );
2720 outputRasterPtr->setValue( col, line, value, 2 );
2723 InterestPointsSetT::const_iterator itB = interestPoints.begin();
2724 InterestPointsSetT::const_iterator itE = interestPoints.end();
2728 outputRasterPtr->setValue( itB->m_x, itB->m_y, 0, 0 );
2729 outputRasterPtr->setValue( itB->m_x, itB->m_y, 255, 1 );
2730 outputRasterPtr->setValue( itB->m_x, itB->m_y, 0, 2 );
2737 DoublesMatrix& outputData,
const unsigned int iterationsNumber )
2739 if( iterationsNumber == 0 )
return false;
2746 const unsigned int lastLineIndex = nLines - 1;
2747 const unsigned int lastColIndex = nCols - 1;
2748 unsigned int currLine = 0;
2749 unsigned int currCol = 0;
2755 if( iterationsNumber > 1 )
2759 "Cannot allocate image matrix" );
2764 for( currLine = 0 ; currLine < nLines ; ++currLine ) {
2765 outputData( currLine, 0 ) = 0.0;
2766 outputData( currLine, lastColIndex ) = 0.0;
2769 for( currCol = 0 ; currCol < nCols ; ++currCol ) {
2770 outputData( 0, currCol ) = 0.0;
2771 outputData( lastLineIndex, currCol ) = 0.0;
2780 for(
unsigned int iteration = 0 ; iteration < iterationsNumber ;
2783 if( iteration == 0 )
2785 inputPtr = &inputData;
2787 if( iterationsNumber > 1 )
2788 outputPtr = &tempMatrix;
2790 outputPtr = &outputData;
2792 else if( iteration == iterationsNumber - 1 )
2794 inputPtr = outputPtr;
2795 outputPtr = &outputData;
2800 inputPtr = outputPtr;
2804 for( currLine = 1 ; currLine < lastLineIndex ; ++currLine )
2806 for( currCol = 1 ; currCol < lastColIndex ; ++currCol )
2808 outputPtr->operator()( currLine, currCol ) =
2810 inputPtr->operator()( currLine - 1, currCol ) +
2811 ( 4.0 * inputData( currLine, currCol ) ) +
2812 inputPtr->operator()( currLine + 1, currCol ) +
2813 inputPtr->operator()( currLine, currCol - 1 ) +
2814 inputPtr->operator()( currLine, currCol + 1 )
2824 FloatsMatrix& outputData,
const unsigned int iterationsNumber )
2826 if( iterationsNumber == 0 )
2828 outputData = inputData;
2846 const unsigned int lastLineIndex = nLines - 1;
2847 const unsigned int lastColIndex = nCols - 1;
2848 unsigned int currLine = 0;
2849 unsigned int currCol = 0;
2855 if( iterationsNumber > 1 )
2859 "Cannot allocate image matrix" );
2864 for( currLine = 0 ; currLine < nLines ; ++currLine ) {
2865 outputData( currLine, 0 ) = 0.0;
2866 outputData( currLine, lastColIndex ) = 0.0;
2869 for( currCol = 0 ; currCol < nCols ; ++currCol ) {
2870 outputData( 0, currCol ) = 0.0;
2871 outputData( lastLineIndex, currCol ) = 0.0;
2879 float* outputLinePtr = 0;
2880 unsigned int prevLine = 0;
2881 unsigned int prevCol = 0;
2882 unsigned int nextLine = 0;
2883 unsigned int nextCol = 0;
2885 for(
unsigned int iteration = 0 ; iteration < iterationsNumber ;
2888 if( iteration == 0 )
2890 inputPtr = &inputData;
2892 if( iterationsNumber > 1 )
2893 outputPtr = &tempMatrix;
2895 outputPtr = &outputData;
2897 else if( iteration == iterationsNumber - 1 )
2899 inputPtr = outputPtr;
2900 outputPtr = &outputData;
2905 inputPtr = outputPtr;
2911 for( currLine = 1 ; currLine < lastLineIndex ; ++currLine )
2913 prevLine = currLine - 1;
2914 nextLine = currLine + 1;
2916 outputLinePtr = outputPtr->operator[]( currLine );
2918 for( currCol = 1 ; currCol < lastColIndex ; ++currCol )
2920 prevCol = currCol - 1;
2921 nextCol = currCol + 1;
2923 outputLinePtr[ currCol ] =
2925 internalInputMatrix( prevLine, prevCol )
2926 + internalInputMatrix( prevLine, currCol )
2927 + internalInputMatrix( prevLine, nextCol )
2928 + internalInputMatrix( currLine, prevCol )
2929 + internalInputMatrix( currLine, nextCol )
2930 + internalInputMatrix( nextLine, prevCol )
2931 + internalInputMatrix( nextLine, currCol )
2932 + internalInputMatrix( nextLine, nextCol )
2951 unsigned int outCol = 0;
2954 for(
unsigned int outLine = 0 ; outLine < nLines ; ++outLine )
2955 for( outCol = 0; outCol < nCols ; ++outCol )
2957 currSum = inputData[ outLine ][ outCol ];
2960 currSum += outputData[ outLine - 1 ][ outCol ];
2962 currSum += outputData[ outLine ][ outCol - 1 ];
2963 if( outLine && outCol )
2964 currSum -= outputData[ outLine - 1 ][ outCol - 1 ];
2966 outputData[ outLine ][ outCol ] = currSum;
2974 const unsigned int correlationWindowWidth,
2979 validInteresPoints.clear();
2984 const unsigned int rotated90CorralationWindowRadius = (
unsigned int)
2991 ( (
double)correlationWindowWidth )
2993 ( (
double)correlationWindowWidth )
3006 const unsigned int rasterDataLines = rasterData.
getLinesNumber();
3007 const unsigned int firstValidInterestPointX =
3008 rotated90CorralationWindowRadius + 1;
3009 const unsigned int lastValidInterestPointX = rasterDataCols
3010 - rotated90CorralationWindowRadius - 2;
3011 const unsigned int firstValidInterestPointY =
3012 rotated90CorralationWindowRadius + 1;
3013 const unsigned int lastValidInterestPointY = rasterDataLines
3014 - rotated90CorralationWindowRadius - 2;
3017 InterestPointsSetT::const_iterator iPointsIt = interestPoints.begin();
3018 const InterestPointsSetT::const_iterator iPointsItEnd = interestPoints.end();
3020 while( iPointsIt != iPointsItEnd )
3022 if( ( iPointsIt->m_x >= firstValidInterestPointX ) &&
3023 ( iPointsIt->m_x <= lastValidInterestPointX ) &&
3024 ( iPointsIt->m_y >= firstValidInterestPointY ) &&
3025 ( iPointsIt->m_y <= lastValidInterestPointY ) )
3027 validInteresPoints.insert( *iPointsIt );
3037 const unsigned int featureElemsNmb = correlationWindowWidth *
3038 correlationWindowWidth;
3039 const unsigned int featureSizeBytes =
sizeof( float ) *
3043 validInteresPoints.size(), featureElemsNmb ),
3044 "Cannot allocate features matrix" );
3048 boost::scoped_array< float > auxFeatureBufferHandler(
3049 new float[ featureElemsNmb ] );
3050 float* auxFeatureBufferPtr = auxFeatureBufferHandler.get();
3054 unsigned int curr_window_x_start = 0;
3055 unsigned int curr_window_y_start = 0;
3056 unsigned int curr_window_x_center = 0;
3057 unsigned int curr_window_y_center = 0;
3058 unsigned int curr_window_x_end = 0;
3059 unsigned int curr_window_y_end = 0;
3060 const unsigned int wind_radius = correlationWindowWidth / 2;
3061 const float wind_radius_double = (float)wind_radius;
3062 unsigned int curr_x = 0;
3063 unsigned int curr_y = 0;
3064 float curr_x_minus_radius = 0;
3065 float curr_y_minus_radius = 0;
3066 unsigned int curr_offset = 0;
3067 float int_x_dir = 0;
3068 float int_y_dir = 0;
3070 float rotated_curr_x = 0;
3071 float rotated_curr_y = 0;
3074 unsigned int rotated_curr_x_img = 0;
3075 unsigned int rotated_curr_y_img = 0;
3076 float featureElementsNormalizeFactor = 0.0;
3077 unsigned int featureElementIdx = 0;
3078 float* featurePtr = 0;
3079 float featureElementValue = 0.0;
3080 float featureElementMaxValue = 0.0;
3081 float featureElementMinValue = 0.0;
3083 InterestPointsSetT::const_iterator viPointsIt = validInteresPoints.begin();
3084 const InterestPointsSetT::const_iterator viPointsItEnd = validInteresPoints.end();
3085 unsigned int validInteresPointsIndex = 0 ;
3087 while( viPointsIt != viPointsItEnd )
3091 curr_window_x_center = viPointsIt->m_x;
3092 assert( curr_window_x_center >= rotated90CorralationWindowRadius );
3094 rotated90CorralationWindowRadius ) );
3095 curr_window_y_center = viPointsIt->m_y;
3096 assert( curr_window_y_center >= rotated90CorralationWindowRadius );
3097 assert( curr_window_y_center < ( rasterData.
getLinesNumber() - 1 -
3098 rotated90CorralationWindowRadius ) );
3100 curr_window_x_start = curr_window_x_center - wind_radius;
3101 curr_window_y_start = curr_window_y_center - wind_radius;
3102 curr_window_x_end = curr_window_x_start + correlationWindowWidth - 1;
3103 curr_window_y_end = curr_window_y_start + correlationWindowWidth - 1;
3109 for( curr_y = curr_window_y_start ; curr_y <= curr_window_y_end ;
3112 for( curr_offset = 0 ; curr_offset < wind_radius ;
3115 int_x_dir += rasterData( curr_y, curr_window_x_end - curr_offset ) -
3116 rasterData( curr_y, curr_window_x_start + curr_offset );
3124 for( curr_x = curr_window_x_start ; curr_x <= curr_window_x_end ;
3127 for( curr_offset = 0 ; curr_offset < wind_radius ; ++curr_offset )
3129 int_y_dir += rasterData( curr_window_y_start + curr_offset, curr_x ) -
3130 rasterData( curr_window_y_end - curr_offset, curr_x );
3136 int_norm = std::sqrt( ( int_x_dir * int_x_dir ) +
3137 ( int_y_dir * int_y_dir ) );
3139 if( int_norm != 0.0 ) {
3140 rot_cos = int_x_dir / int_norm;
3141 rot_sin = int_y_dir / int_norm;
3148 assert( ( rot_cos >= -1.0 ) && ( rot_cos <= 1.0 ) );
3149 assert( ( rot_sin >= -1.0 ) && ( rot_sin <= 1.0 ) );
3164 memset( auxFeatureBufferPtr, 0, featureSizeBytes );
3165 featureElementIdx = 0;
3166 featureElementMaxValue = -1.0 * FLT_MAX;
3167 featureElementMinValue = FLT_MAX;
3169 for( curr_y = 0 ; curr_y < correlationWindowWidth ; ++curr_y )
3171 for( curr_x = 0 ; curr_x < correlationWindowWidth ; ++curr_x )
3175 curr_x_minus_radius = ((float)curr_x) -
3177 curr_y_minus_radius = ((float)curr_y) -
3183 ( rot_cos * curr_x_minus_radius ) +
3184 ( rot_sin * curr_y_minus_radius );
3187 ( rot_cos * curr_y_minus_radius )
3188 - ( rot_sin * curr_x_minus_radius );
3193 rotated_curr_x += wind_radius_double;
3194 rotated_curr_y += wind_radius_double;
3198 rotated_curr_x_img = curr_window_x_start +
3199 (
unsigned int)
ROUND( rotated_curr_x );
3200 rotated_curr_y_img = curr_window_y_start +
3201 (
unsigned int)
ROUND( rotated_curr_y );
3203 featureElementValue = rasterData( rotated_curr_y_img,
3204 rotated_curr_x_img );
3206 auxFeatureBufferPtr[ featureElementIdx++ ] = featureElementValue;
3208 if( featureElementMaxValue < featureElementValue )
3209 featureElementMaxValue = featureElementValue;
3211 if( featureElementMinValue > featureElementValue )
3212 featureElementMinValue = featureElementValue;
3219 if( featureElementMaxValue == featureElementMinValue )
3220 featureElementsNormalizeFactor = 0.0;
3222 featureElementsNormalizeFactor = 1.0f / ( featureElementMaxValue -
3223 featureElementMinValue );
3225 featurePtr = features[ validInteresPointsIndex ];
3227 for( featureElementIdx = 0 ; featureElementIdx < featureElemsNmb ;
3228 ++featureElementIdx )
3230 featurePtr[ featureElementIdx ] = (
3231 ( auxFeatureBufferPtr[ featureElementIdx ] - featureElementMinValue )
3232 * featureElementsNormalizeFactor );
3233 assert( featurePtr[ featureElementIdx ] >= 0.0 );
3234 assert( featurePtr[ featureElementIdx ] <= 1.0 );
3237 ++validInteresPointsIndex;
3252 validInterestPoints.clear();
3255 InterestPointsSetT::const_iterator iPointsIt = interestPoints.begin();
3256 const InterestPointsSetT::const_iterator iPointsItEnd = interestPoints.end();
3258 while( iPointsIt != iPointsItEnd )
3262 const unsigned int& currIPointCenterX = iPointsIt->m_x;
3263 const unsigned int& currIPointCenterY = iPointsIt->m_y;
3264 const float currIPointScale = 1.2f * iPointsIt->m_feature2 / 9.0f;
3266 unsigned int featureWindowWidth = (
unsigned int)( 20.0 * currIPointScale );
3267 featureWindowWidth += ( ( featureWindowWidth % 2 ) ? 0 : 1 );
3269 const unsigned int feature90DegreeRotatedWindowRadius = (
unsigned int)
3276 ( (
double)featureWindowWidth )
3278 ( (double)featureWindowWidth )
3284 const unsigned int featureElementHaarWindowRadius =
3285 ((
unsigned int)( 2.0 * currIPointScale )) / 2;
3287 const unsigned int currIPointCenterXAllowedMin = featureElementHaarWindowRadius +
3288 feature90DegreeRotatedWindowRadius + 1;
3289 const unsigned int currIPointCenterXAllowedMax = integralRasterData.
getColumnsNumber() -
3290 currIPointCenterXAllowedMin - 1;
3291 const unsigned int currIPointCenterYAllowedMin = currIPointCenterXAllowedMin;
3292 const unsigned int currIPointCenterYAllowedMax = integralRasterData.
getLinesNumber() -
3293 currIPointCenterXAllowedMin - 1;
3295 if( ( currIPointCenterX > currIPointCenterXAllowedMin ) &&
3296 ( currIPointCenterX < currIPointCenterXAllowedMax ) &&
3297 ( currIPointCenterY > currIPointCenterYAllowedMin ) &&
3298 ( currIPointCenterY < currIPointCenterYAllowedMax ) )
3301 validInterestPoints.insert( *iPointsIt );
3309 "Cannot allocate features matrix" );
3313 float auxFeaturesBuffer[ 65 ];
3317 InterestPointsSetT::const_iterator iPointsIt = validInterestPoints.begin();
3318 const InterestPointsSetT::const_iterator iPointsItEnd = validInterestPoints.end();
3319 unsigned int interestPointIdx = 0;
3320 while( iPointsIt != iPointsItEnd )
3324 const unsigned int& currIPointCenterX = iPointsIt->m_x;
3325 const unsigned int& currIPointCenterY = iPointsIt->m_y;
3326 const float currIPointScale = 1.2f * iPointsIt->m_feature2 / 9.0f;
3328 unsigned int featureWindowWidth = (
unsigned int)( 20.0 * currIPointScale );
3329 featureWindowWidth += ( ( featureWindowWidth % 2 ) ? 0 : 1 );
3331 const unsigned int featureWindowRadius = featureWindowWidth / 2;
3332 const float featureWindowRadiusDouble = (float)featureWindowRadius;
3334 const unsigned int featureSubWindowWidth = featureWindowWidth / 4;
3336 const unsigned int featureElementHaarWindowRadius =
3337 ((
unsigned int)( 2.0 * currIPointScale )) / 2;
3339 const unsigned int featureWindowRasterXStart = currIPointCenterX -
3340 featureWindowRadius;
3341 const unsigned int featureWindowRasterYStart = currIPointCenterY -
3342 featureWindowRadius;
3346 unsigned int currentFeaturePtrStartIdx = 0;
3348 for( currentFeaturePtrStartIdx = 0; currentFeaturePtrStartIdx < 65 ;
3349 ++currentFeaturePtrStartIdx )
3350 auxFeaturesBuffer[ currentFeaturePtrStartIdx ] = 0.0;
3354 assert( ((
long int)currIPointCenterX) -
3355 ((
long int)featureWindowRadius) >= 0 );
3356 assert( ((
long int)currIPointCenterY) -
3357 ((
long int)featureWindowRadius) >= 0 );
3358 assert( currIPointCenterX +
3360 assert( currIPointCenterY +
3364 currIPointCenterY, featureWindowRadius );
3366 currIPointCenterY, featureWindowRadius );
3370 const float currIPointRotationNorm = std::sqrt( ( currIPointXIntensity * currIPointXIntensity ) +
3371 ( currIPointYIntensity * currIPointYIntensity ) );
3373 float currIPointRotationSin = 0;
3374 float currIPointRotationCos = 1.0;
3376 if( currIPointRotationNorm != 0.0 )
3378 currIPointRotationCos = currIPointXIntensity / currIPointRotationNorm;
3379 currIPointRotationSin = currIPointYIntensity / currIPointRotationNorm;
3382 assert( ( currIPointRotationCos >= -1.0 ) && ( currIPointRotationCos <= 1.0 ) );
3383 assert( ( currIPointRotationSin >= -1.0 ) && ( currIPointRotationSin <= 1.0 ) );
3401 unsigned int featureWindowYOffset = 0;
3402 unsigned int featureWindowXOffset = 0;
3403 float featureElementZeroCenteredOriginalXIdx = 0;
3404 float featureElementZeroCenteredOriginalYIdx = 0;
3405 float featureElementZeroCenteredRotatedXIdx = 0;
3406 float featureElementZeroCenteredRotatedYIdx = 0;
3407 float featureElementRotatedXIdx = 0;
3408 float featureElementRotatedYIdx = 0;
3409 unsigned int featureElementRasterRotatedXIdx = 0;
3410 unsigned int featureElementRasterRotatedYIdx = 0;
3411 float featureElementOriginalHaarXIntensity = 0;
3412 float featureElementOriginalHaarYIntensity = 0;
3413 float featureElementZeroCenteredOriginalHaarXIntensity = 0;
3414 float featureElementZeroCenteredOriginalHaarYIntensity = 0;
3415 float featureElementRotatedHaarXIntensity = 0;
3416 float featureElementRotatedHaarYIntensity = 0;
3417 float featureElementZeroCenteredRotatedHaarXIntensity = 0;
3418 float featureElementZeroCenteredRotatedHaarYIntensity = 0;
3419 unsigned int featureSubWindowYIdx = 0;
3420 unsigned int featureSubWindowXIdx = 0;
3422 for( featureWindowYOffset = 0 ; featureWindowYOffset < featureWindowWidth ;
3423 featureWindowYOffset += 5 )
3425 featureElementZeroCenteredOriginalYIdx = ((float)featureWindowYOffset)
3426 - featureWindowRadiusDouble;
3428 featureSubWindowYIdx = featureWindowYOffset / featureSubWindowWidth;
3430 for( featureWindowXOffset = 0 ; featureWindowXOffset < featureWindowWidth ;
3431 featureWindowXOffset += 5 )
3433 featureSubWindowXIdx = featureWindowXOffset / featureSubWindowWidth;
3435 currentFeaturePtrStartIdx = ( featureSubWindowYIdx * 4 ) +
3436 featureSubWindowXIdx;
3438 featureElementZeroCenteredOriginalXIdx = ((float)featureWindowXOffset)
3439 - featureWindowRadiusDouble;
3444 featureElementZeroCenteredRotatedXIdx =
3445 ( currIPointRotationCos * featureElementZeroCenteredOriginalXIdx ) +
3446 ( currIPointRotationSin * featureElementZeroCenteredOriginalYIdx );
3447 featureElementZeroCenteredRotatedYIdx =
3448 ( currIPointRotationCos * featureElementZeroCenteredOriginalYIdx )
3449 - ( currIPointRotationSin * featureElementZeroCenteredOriginalXIdx );
3451 featureElementRotatedXIdx = featureElementZeroCenteredRotatedXIdx +
3452 featureWindowRadiusDouble;
3453 featureElementRotatedYIdx = featureElementZeroCenteredRotatedYIdx +
3454 featureWindowRadiusDouble;
3456 featureElementRasterRotatedXIdx = featureWindowRasterXStart +
3457 (
unsigned int)
ROUND( featureElementRotatedXIdx );
3458 featureElementRasterRotatedYIdx = featureWindowRasterYStart +
3459 (
unsigned int)
ROUND( featureElementRotatedYIdx );
3461 assert( ((
long int)featureElementRasterRotatedXIdx) -
3462 ((
long int)featureElementHaarWindowRadius) >= 0 );
3463 assert( ((
long int)featureElementRasterRotatedYIdx) -
3464 ((
long int)featureElementHaarWindowRadius) >= 0 );
3465 assert( featureElementRasterRotatedXIdx +
3467 assert( featureElementRasterRotatedYIdx +
3468 featureElementHaarWindowRadius < integralRasterData.
getLinesNumber() );
3473 featureElementRasterRotatedXIdx, featureElementRasterRotatedYIdx,
3474 featureElementHaarWindowRadius );
3476 featureElementRasterRotatedXIdx, featureElementRasterRotatedYIdx,
3477 featureElementHaarWindowRadius );
3482 featureElementZeroCenteredOriginalHaarXIntensity = featureElementOriginalHaarXIntensity +
3483 featureElementZeroCenteredOriginalXIdx;
3484 featureElementZeroCenteredOriginalHaarYIntensity = featureElementOriginalHaarYIntensity +
3485 featureElementZeroCenteredOriginalYIdx;
3487 featureElementZeroCenteredRotatedHaarXIntensity =
3488 ( currIPointRotationCos * featureElementZeroCenteredOriginalHaarXIntensity ) +
3489 ( currIPointRotationSin * featureElementZeroCenteredOriginalHaarYIntensity );
3490 featureElementZeroCenteredRotatedHaarYIntensity =
3491 ( currIPointRotationCos * featureElementZeroCenteredOriginalHaarYIntensity )
3492 - ( currIPointRotationSin * featureElementZeroCenteredOriginalHaarXIntensity );
3494 featureElementRotatedHaarXIntensity = featureElementZeroCenteredRotatedHaarXIntensity
3495 - featureElementZeroCenteredRotatedXIdx;
3496 featureElementRotatedHaarYIntensity = featureElementZeroCenteredRotatedHaarYIntensity
3497 - featureElementZeroCenteredRotatedYIdx;
3501 assert( currentFeaturePtrStartIdx < 61 );
3503 auxFeaturesBuffer[ currentFeaturePtrStartIdx ] +=
3504 featureElementRotatedHaarXIntensity;
3505 auxFeaturesBuffer[ currentFeaturePtrStartIdx + 1 ] +=
3506 featureElementRotatedHaarYIntensity;
3507 auxFeaturesBuffer[ currentFeaturePtrStartIdx + 2 ] +=
3508 std::abs( featureElementRotatedHaarXIntensity );
3509 auxFeaturesBuffer[ currentFeaturePtrStartIdx + 3 ] +=
3510 std::abs( featureElementRotatedHaarYIntensity );
3516 float* currentFeaturePtr = features[ interestPointIdx ];
3518 float featureElementsNormalizeFactor = 0.0;
3520 for( currentFeaturePtrStartIdx = 0 ; currentFeaturePtrStartIdx < 64 ;
3521 ++currentFeaturePtrStartIdx )
3523 featureElementsNormalizeFactor += ( auxFeaturesBuffer[ currentFeaturePtrStartIdx ]
3524 * auxFeaturesBuffer[ currentFeaturePtrStartIdx ] );
3527 featureElementsNormalizeFactor = std::sqrt( featureElementsNormalizeFactor );
3529 if( featureElementsNormalizeFactor != 0.0 )
3531 featureElementsNormalizeFactor = 1.0f / featureElementsNormalizeFactor;
3534 for( currentFeaturePtrStartIdx = 0 ; currentFeaturePtrStartIdx < 64 ;
3535 ++currentFeaturePtrStartIdx )
3537 currentFeaturePtr[ currentFeaturePtrStartIdx ] = (
3538 auxFeaturesBuffer[ currentFeaturePtrStartIdx ] *
3539 featureElementsNormalizeFactor );
3541 currentFeaturePtr[ currentFeaturePtrStartIdx ] );
3543 currentFeaturePtr[ currentFeaturePtrStartIdx ] );
3550 currentFeaturePtr[ 64 ] = ( iPointsIt->m_feature3 * 64.0f );
3561 const std::string& fileNameBeginning )
3563 const unsigned int tifLinesNumber = (
unsigned int)std::sqrt( (
double)
3567 double const* featureLinePtr = 0;
3569 InterestPointsSetT::const_iterator iIt = interestPoints.begin();
3571 for(
unsigned int featuresIdx = 0 ; featuresIdx < features.
getLinesNumber() ;
3574 featureLinePtr = features[ featuresIdx ];
3576 std::vector<te::rst::BandProperty*> bandsProperties;
3579 bandsProperties[0]->m_noDataValue = 0;
3581 std::map<std::string, std::string> rInfo;
3582 rInfo[
"URI"] = fileNameBeginning +
"_" + boost::lexical_cast< std::string >( iIt->m_x )
3583 +
"_" + boost::lexical_cast< std::string >( iIt->m_y ) +
".tif";
3586 tifLinesNumber, 0, -1 );
3588 std::auto_ptr< te::rst::Raster > outputRasterPtr(
3592 unsigned int line = 0;
3593 unsigned int col = 0;
3599 for( col = 0 ; col < featuresColsNumber ; ++col )
3601 if( min > featureLinePtr[ col ] ) min = featureLinePtr[ col ];
3602 if( max < featureLinePtr[ col ] ) max = featureLinePtr[ col ];
3605 gain = 255.0 / ( max - min );
3607 for( line = 0 ; line < tifLinesNumber ; ++line )
3608 for( col = 0 ; col < tifLinesNumber ; ++col )
3610 value = featureLinePtr[ ( line * tifLinesNumber ) + col ];
3613 value =
MIN( 255.0, value );
3614 value =
MAX( 0.0, value );
3616 outputRasterPtr->setValue( col, line, value, 0 );
3628 const unsigned int maxPt1ToPt2Distance,
3629 const unsigned int enableMultiThread,
3630 const double minAllowedAbsCorrelation,
3633 matchedPoints.clear();
3635 const unsigned int interestPointsSet1Size = interestPointsSet1.size();
3636 if( interestPointsSet1Size == 0 )
return true;
3638 const unsigned int interestPointsSet2Size = interestPointsSet2.size();
3639 if( interestPointsSet2Size == 0 )
return true;
3642 assert( featuresSet1.
getLinesNumber() == interestPointsSet1Size );
3643 assert( featuresSet2.
getLinesNumber() == interestPointsSet2Size );
3647 InterestPointsSetT::const_iterator it1 = interestPointsSet1.begin();
3648 boost::scoped_array< InterestPointT > internalInterestPointsSet1(
3650 for(
unsigned int idx1 = 0 ; idx1 < interestPointsSet1Size ; ++idx1 )
3652 internalInterestPointsSet1[ idx1 ] = *it1;
3657 InterestPointsSetT::const_iterator it2 = interestPointsSet2.begin();
3658 boost::scoped_array< InterestPointT > internalInterestPointsSet2(
3660 for(
unsigned int idx2 = 0 ; idx2 < interestPointsSet2Size ; ++idx2 )
3662 internalInterestPointsSet2[ idx2 ] = *it2;
3672 "Error crearting the correlation matrix" );
3674 unsigned int col = 0;
3675 unsigned int line = 0;
3678 for( line = 0 ; line < interestPointsSet1Size ; ++line )
3680 linePtr = corrMatrix[ line ];
3682 for( col = 0 ; col < interestPointsSet2Size ; ++col )
3688 boost::mutex syncMutex;
3689 unsigned int nextFeatureIdx1ToProcess = 0;
3702 if( enableMultiThread )
3711 boost::thread_group threads;
3713 for(
unsigned int threadIdx = 0 ; threadIdx < procsNumber ;
3716 threads.add_thread(
new boost::thread(
3730 std::vector< float > eachLineMaxABSValues( interestPointsSet1Size,
3732 std::vector< unsigned int > eachLineMaxABSIndexes( interestPointsSet1Size,
3733 interestPointsSet2Size );
3734 std::vector< float > eachColMaxABSValues( interestPointsSet2Size,
3736 std::vector< unsigned int > eachColMaxABSIndexes( interestPointsSet2Size,
3737 interestPointsSet1Size );
3740 for( line = 0 ; line < interestPointsSet1Size ; ++line )
3742 linePtr = corrMatrix[ line ];
3744 for( col = 0 ; col < interestPointsSet2Size ; ++col )
3746 absValue = std::abs( linePtr[ col ] );
3748 if( absValue >= minAllowedAbsCorrelation )
3750 if( absValue > eachLineMaxABSValues[ line ] )
3752 eachLineMaxABSValues[ line ] = absValue;
3753 eachLineMaxABSIndexes[ line ] = col;
3756 if( absValue > eachColMaxABSValues[ col ] )
3758 eachColMaxABSValues[ col ] = absValue;
3759 eachColMaxABSIndexes[ col ] = line;
3769 for( line = 0 ; line < interestPointsSet1Size ; ++line )
3771 col = eachLineMaxABSIndexes[ line ];
3773 if( ( col < interestPointsSet2Size ) &&
3774 ( eachColMaxABSIndexes[ col ] == line ) )
3776 auxMatchedPoints.
m_point1 = internalInterestPointsSet1[ line ];
3777 auxMatchedPoints.
m_point2 = internalInterestPointsSet2[ col ];
3778 auxMatchedPoints.
m_feature = std::abs( corrMatrix( line, col ) );
3780 matchedPoints.insert( auxMatchedPoints );
3800 unsigned int feat2Idx = 0;
3801 float const* feat1Ptr = 0;
3802 float const* feat2Ptr = 0;
3803 float* corrMatrixLinePtr = 0;
3804 unsigned int featCol = 0;
3808 float ccorrelation = 0;
3813 const unsigned int featuresSet1Size =
3815 const unsigned int featuresSet2Size =
3820 std::vector< unsigned int > selectedFeaturesSet2Indexes;
3821 unsigned int selectedFeaturesSet2IndexesSize = 0;
3825 for(
unsigned int feat2Idx = 0 ; feat2Idx < featuresSet2Size ; ++feat2Idx )
3827 interestPointsSet2RTree.
insert(
3838 selectedFeaturesSet2Indexes.resize( featuresSet2Size );
3839 selectedFeaturesSet2IndexesSize = featuresSet2Size;
3840 for(
unsigned int feat2Idx = 0 ; feat2Idx < featuresSet2Size ; ++feat2Idx )
3842 selectedFeaturesSet2Indexes[ feat2Idx ] = feat2Idx;
3848 for(
unsigned int feat1Idx = 0 ; feat1Idx < featuresSet1Size ; ++feat1Idx )
3869 selectedFeaturesSet2Indexes.clear();
3870 interestPointsSet2RTree.
search( auxEnvelope,
3871 selectedFeaturesSet2Indexes );
3873 selectedFeaturesSet2IndexesSize = selectedFeaturesSet2Indexes.size();
3876 corrMatrixLinePtr = paramsPtr->
m_corrMatrixPtr->operator[]( feat1Idx );
3880 for(
unsigned int selectedFSIIdx = 0 ; selectedFSIIdx <
3881 selectedFeaturesSet2IndexesSize ; ++selectedFSIIdx )
3883 feat2Idx = selectedFeaturesSet2Indexes[ selectedFSIIdx ];
3889 for( featCol = 0 ; featCol < featureElementsNmb ; ++featCol )
3891 sumAA += feat1Ptr[ featCol ] * feat1Ptr[ featCol ];
3892 sumBB += feat2Ptr[ featCol ] * feat2Ptr[ featCol ];
3895 cc_norm = std::sqrt( sumAA * sumBB );
3897 if( cc_norm == 0.0 )
3899 corrMatrixLinePtr[ feat2Idx ] = 0;
3904 for( featCol = 0 ; featCol < featureElementsNmb ; ++featCol )
3906 ccorrelation += ( feat1Ptr[ featCol ] * feat2Ptr[ featCol ] ) /
3910 corrMatrixLinePtr[ feat2Idx ] = ccorrelation;
3926 const unsigned int maxPt1ToPt2PixelDistance,
3927 const double maxEuclideanDist,
3928 const unsigned int enableMultiThread,
3931 matchedPoints.clear();
3933 const unsigned int interestPointsSet1Size = interestPointsSet1.size();
3934 if( interestPointsSet1Size == 0 )
return true;
3936 const unsigned int interestPointsSet2Size = interestPointsSet2.size();
3937 if( interestPointsSet2Size == 0 )
return true;
3940 assert( featuresSet1.
getLinesNumber() == interestPointsSet1Size );
3941 assert( featuresSet2.
getLinesNumber() == interestPointsSet2Size );
3945 InterestPointsSetT::const_iterator it1 = interestPointsSet1.begin();
3946 boost::scoped_array< InterestPointT > internalInterestPointsSet1(
3948 for(
unsigned int idx1 = 0 ; idx1 < interestPointsSet1Size ; ++idx1 )
3950 internalInterestPointsSet1[ idx1 ] = *it1;
3954 InterestPointsSetT::const_iterator it2 = interestPointsSet2.begin();
3955 boost::scoped_array< InterestPointT > internalInterestPointsSet2(
3957 for(
unsigned int idx2 = 0 ; idx2 < interestPointsSet2Size ; ++idx2 )
3959 internalInterestPointsSet2[ idx2 ] = *it2;
3968 "Error crearting the correlation matrix" );
3970 unsigned int col = 0;
3971 unsigned int line = 0;
3974 for( line = 0 ; line < interestPointsSet1Size ; ++line )
3976 linePtr = distMatrix[ line ];
3978 for( col = 0 ; col < interestPointsSet2Size ; ++col )
3980 linePtr[ col ] = FLT_MAX;
3984 boost::mutex syncMutex;
3985 unsigned int nextFeatureIdx1ToProcess = 0;
3997 if( enableMultiThread )
4006 boost::thread_group threads;
4008 for(
unsigned int threadIdx = 0 ; threadIdx < procsNumber ;
4011 threads.add_thread(
new boost::thread(
4025 std::vector< float > eachLineMinValues( interestPointsSet1Size,
4027 std::vector< unsigned int > eachLineMinIndexes( interestPointsSet1Size,
4028 interestPointsSet2Size );
4029 std::vector< float > eachColMinValues( interestPointsSet2Size,
4031 std::vector< unsigned int > eachColMinIndexes( interestPointsSet2Size,
4032 interestPointsSet1Size );
4033 float maxDistValue = FLT_MAX * (-1.0);
4035 for( line = 0 ; line < interestPointsSet1Size ; ++line )
4037 linePtr = distMatrix[ line ];
4039 for( col = 0 ; col < interestPointsSet2Size ; ++col )
4041 const float& value = linePtr[ col ];
4043 if( value <= maxEuclideanDist )
4045 if( value < eachLineMinValues[ line ] )
4047 eachLineMinValues[ line ] = value;
4048 eachLineMinIndexes[ line ] = col;
4051 if( value < eachColMinValues[ col ] )
4053 eachColMinValues[ col ] = value;
4054 eachColMinIndexes[ col ] = line;
4057 if( value > maxDistValue ) maxDistValue = value;
4062 if( maxDistValue == 0.0 ) maxDistValue = 1.0;
4068 for( line = 0 ; line < interestPointsSet1Size ; ++line )
4070 col = eachLineMinIndexes[ line ];
4072 if( ( col < interestPointsSet2Size ) &&
4073 ( eachColMinIndexes[ col ] == line ) )
4075 const float& distValue = distMatrix( line, col );
4077 auxMatchedPoints.
m_point1 = internalInterestPointsSet1[ line ];
4078 auxMatchedPoints.
m_point2 = internalInterestPointsSet2[ col ],
4079 auxMatchedPoints.
m_feature = ( maxDistValue - distValue ) /
4082 matchedPoints.insert( auxMatchedPoints );
4104 unsigned int feat2Idx = 0;
4105 float const* feat1Ptr = 0;
4106 float const* feat2Ptr = 0;
4107 float* corrMatrixLinePtr = 0;
4108 unsigned int featCol = 0;
4111 float euclideanDist = 0;
4115 const unsigned int featuresSet1Size =
4117 const unsigned int featuresSet2Size =
4122 std::vector< unsigned int > selectedFeaturesSet2Indexes;
4123 unsigned int selectedFeaturesSet2IndexesSize = 0;
4127 for(
unsigned int feat2Idx = 0 ; feat2Idx < featuresSet2Size ; ++feat2Idx )
4129 interestPointsSet2RTree.
insert(
4140 selectedFeaturesSet2Indexes.resize( featuresSet2Size );
4141 selectedFeaturesSet2IndexesSize = featuresSet2Size;
4142 for(
unsigned int feat2Idx = 0 ; feat2Idx < featuresSet2Size ; ++feat2Idx )
4144 selectedFeaturesSet2Indexes[ feat2Idx ] = feat2Idx;
4150 for(
unsigned int feat1Idx = 0 ; feat1Idx < featuresSet1Size ; ++feat1Idx )
4171 selectedFeaturesSet2Indexes.clear();
4172 interestPointsSet2RTree.
search( auxEnvelope,
4173 selectedFeaturesSet2Indexes );
4175 selectedFeaturesSet2IndexesSize = selectedFeaturesSet2Indexes.size();
4178 corrMatrixLinePtr = paramsPtr->
m_distMatrixPtr->operator[]( feat1Idx );
4182 for(
unsigned int selectedFSIIdx = 0 ; selectedFSIIdx <
4183 selectedFeaturesSet2IndexesSize ; ++selectedFSIIdx )
4185 feat2Idx = selectedFeaturesSet2Indexes[ selectedFSIIdx ];
4189 euclideanDist = 0.0;
4191 for( featCol = 0 ; featCol < featureElementsNmb ; ++featCol )
4193 diff = feat1Ptr[ featCol ] - feat2Ptr[ featCol ];
4194 euclideanDist += ( diff * diff );
4197 euclideanDist = std::sqrt( euclideanDist );
4199 corrMatrixLinePtr[ feat2Idx ] = euclideanDist;
4210 const unsigned int nCols )
4212 std::cout << std::endl;
4214 for(
unsigned int line = 0 ; line < nLines ; ++line )
4216 std::cout << std::endl <<
"[";
4218 for(
unsigned int col = 0 ; col < nCols ; ++col )
4220 std::cout <<
" " << buffer[ line ][ col ];
4226 std::cout << std::endl;
void clear()
Clear all allocated resources and go back to the initial default parameters.
static float getSurfDxyDerivative(float **bufferPtr, const unsigned int ¢erX, const unsigned int ¢erY, const unsigned int &lobeWidth)
Return a SURF box filter Dxy derivative centered over the given position from the given integral imag...
The parameters passed to the matchCorrelationEuclideanThreadEntry method.
std::vector< te::gm::GTParameters::TiePoint > m_tiePoints
The generated tie-pionts (te::gm::GTParameters::TiePoint::first are raster 1 line/column indexes...
unsigned int m_x
Point X coord.
std::vector< TiePoint > m_tiePoints
Tie points.
boost::mutex * m_syncMutexPtr
float m_feature
Matched interest feature.
static void executeMatchingByEuclideanDistThreadEntry(ExecuteMatchingByEuclideanDistThreadEntryParams *paramsPtr)
Correlation/Euclidean match thread entry.
virtual void getValue(unsigned int c, unsigned int r, double &value) const =0
Returns the cell attribute value.
AbstractParameters * clone() const
Create a clone copy of this instance.
boost::mutex * m_rastaDataAccessMutexPtr
A pointer to a valid mutex to controle raster data access.
void reset()
Clear all internal allocated objects and reset the algorithm to its initial state.
unsigned int m_y
Point Y coord.
A raster band description.
A class that represents an R-tree.
bool executeMoravec(const double raster1XRescFact, const double raster1YRescFact, const double raster2XRescFact, const double raster2YRescFact, te::common::TaskProgress *progressPtr, TiePointsLocator::OutputParameters *outParamsPtr, std::vector< double > &tiePointsWeights)
Executes the Moravec algorithm using the supplied parameters.
std::multiset< InterestPointT > InterestPointsSetT
unsigned int getNumberOfColumns() const
Returns the raster number of columns.
virtual const Band * getBand(std::size_t i) const =0
Returns the raster i-th band.
unsigned int m_maxPt1ToPt2Distance
Zero (disabled) or the maximum distance between a point from set 1 to a point from set 1 (points beyo...
InterestPointT const * m_interestPointsSet1Ptr
It interpolates one pixel based on a selected algorithm. Methods currently available are Nearest Neig...
This class can be used to inform the progress of a task.
InterestPointT m_point2
Interest point 2.
Raster Processing algorithm output parameters base interface.
double m_urx
Upper right corner x-coordinate.
#define MIN(a, b)
Macro that returns min between two values.
boost::mutex * m_interestPointsAccessMutexPtr
A pointer to a valid mutex to control the output interest points container access.
void reset()
Clear all internal allocated resources and reset the parameters instance to its initial state...
Red channel color interpretation.
unsigned int m_maxRasterLinesBlockMaxSize
The maximum lines number of each raster block to process.
InterestPointT const * m_interestPointsSet2Ptr
unsigned int m_maxInterestPointsPerRasterLinesBlock
The maximum number of points to find for each raster lines block.
static bool generateCorrelationFeatures(const InterestPointsSetT &interestPoints, const unsigned int correlationWindowWidth, const FloatsMatrix &rasterData, FloatsMatrix &features, InterestPointsSetT &validInteresPoints)
Generate correlation features ( normalized - unit vector ) matrix for the given interes points...
unsigned int m_octavesNumber
The number of octaves to generate (minimum:1).
void getValue(const double &c, const double &r, std::complex< double > &v, const std::size_t &b)
Get the interpolated value at specific band.
unsigned int m_scalesNumber
Thread return value pointer.
bool execute(AlgorithmOutputParameters &outputParams)
Executes the algorithm using the supplied parameters.
#define MAX(a, b)
Macro that returns max between two values.
boost::mutex * m_rastaDataAccessMutexPtr
A pointer to a valid mutex to controle raster data access.
std::pair< Coord2D, Coord2D > TiePoint
Tie point type definition.
2D Geometric transformation tie-points filter (outliers remotion).
InterestPointT m_point1
Interest point 1.
MemoryPolicy getMemPolicy() const
Returns the current memory policy.
#define TERP_TRUE_OR_RETURN_FALSE(value, message)
Checks if value is true. For false values a warning message will be logged and a return of context wi...
static float getSurfDyyDerivative(float **bufferPtr, const unsigned int ¢erX, const unsigned int ¢erY, const unsigned int &lobeWidth, const unsigned int &lobeRadius)
Return a SURF box filter Dxx derivative centered over the given position from the given integral imag...
const Algorithm & operator=(const Algorithm &)
te::common::AccessPolicy getAccessPolicy() const
Returns the raster access policy.
static bool locateMoravecInterestPoints(const FloatsMatrix &rasterData, UCharsMatrix const *maskRasterDataPtr, const unsigned int moravecWindowWidth, const unsigned int maxInterestPoints, const unsigned int enableMultiThread, InterestPointsSetT &interestPoints)
Moravec interest points locator.
bool locateSurfInterestPoints(const FloatsMatrix &integralRasterData, UCharsMatrix const *maskRasterDataPtr, InterestPointsSetT &interestPoints) const
SURF interest points locator.
static bool generateSurfFeatures(const InterestPointsSetT &interestPoints, const FloatsMatrix &integralRasterData, InterestPointsSetT &validInterestPoints, FloatsMatrix &features)
Generate a Surf features matrix for the given interes points.
TECOMMONEXPORT unsigned int GetPhysProcNumber()
Returns the number of physical processors.
unsigned int * m_nextRasterLinesBlockToProcessValuePtr
A pointer to a valid counter to control the blocks processing sequence.
bool applyRansac(const std::string &transfName, const GTParameters &inputParams, const double maxDirectMapError, const double maxInverseMapError, const RansacItCounterT &maxIterations, const double &assurance, const bool enableMultiThread, const std::vector< double > &tiePointsWeights, std::vector< te::gm::GTParameters::TiePoint > &outTiePoints, std::auto_ptr< GeometricTransformation > &outTransf)
Apply a RANSAC based outliers remotion strategy.
double m_llx
Lower left corner x-coordinate.
static bool createIntegralImage(const FloatsMatrix &inputData, FloatsMatrix &outputData)
Create an integral image.
static void locateMoravecInterestPointsThreadEntry(MoravecLocatorThreadParams *paramsPtr)
Movavec locator thread entry.
TiePointsLocator::InputParameters m_inputParameters
TiePointsLocator input execution parameters.
static void executeMatchingByCorrelationThreadEntry(ExecuteMatchingByCorrelationThreadEntryParams *paramsPtr)
Correlation/Euclidean match thread entry.
InterestPointT const * m_interestPointsSet2Ptr
An Envelope defines a 2D rectangular region.
std::auto_ptr< te::gm::GeometricTransformation > m_transformationPtr
The generated geometric transformation with the base mininum required tie-points set ( depending on t...
TECOMMONEXPORT unsigned long int GetUsedVirtualMemory()
Returns the amount of used virtual memory (bytes) for the current process (physical + swapped)...
An abstract class for raster data strucutures.
unsigned int m_maxPt1ToPt2Distance
Zero (disabled) or the maximum distance between a point from set 1 to a point from set 1 (points beyo...
unsigned int getNumberOfRows() const
Returns the raster number of rows.
#define TERP_LOG_AND_THROW(message)
Logs a error message and throws.
std::multiset< MatchedInterestPointsT > MatchedInterestPointsSetT
unsigned int getColumnsNumber() const
The number of current matrix columns.
static unsigned int getSurfFilterSize(const unsigned int &octaveIndex, const unsigned int &scaleIndex)
Return the surf octave filter size (width).
static void features2Tiff(const DoublesMatrix &features, const InterestPointsSetT &interestPoints, const std::string &fileNameBeginning)
Save the generated features to tif files.
virtual std::size_t getNumberOfBands() const =0
Returns the number of bands (dimension of cells attribute values) in the raster.
unsigned int * m_nextRasterLinesBlockToProcessValuePtr
A pointer to a valid counter to control the blocks processing sequence.
The parameters passed to the executeMatchingByEuclideanDistThreadEntry method.
InterestPointsSetT * m_interestPointsPtr
A pointer to a valid interest points container.
bool executeSurf(const double raster1XRescFact, const double raster1YRescFact, const double raster2XRescFact, const double raster2YRescFact, te::common::TaskProgress *progressPtr, TiePointsLocator::OutputParameters *outParamsPtr, std::vector< double > &tiePointsWeights)
Executes the SURF algorithm using the supplied parameters.
static bool executeMatchingByCorrelation(const FloatsMatrix &featuresSet1, const FloatsMatrix &featuresSet2, const InterestPointsSetT &interestPointsSet1, const InterestPointsSetT &interestPointsSet2, const unsigned int maxPt1ToPt2PixelDistance, const unsigned int enableMultiThread, const double minAllowedAbsCorrelation, MatchedInterestPointsSetT &matchedPoints)
Match each feature using correlation.
FloatsMatrix const * m_featuresSet1Ptr
static bool applyMeanFilter(const FloatsMatrix &inputData, FloatsMatrix &outputData, const unsigned int iterationsNumber)
Mean Filter.
A raster band description.
unsigned int m_maxInterestPointsPerRasterLinesBlock
The maximum number of points to find for each raster lines block for each scale.
int search(const te::gm::Envelope &mbr, std::vector< DATATYPE > &report) const
Range search query.
unsigned int * m_nextFeatureIdx1ToProcessPtr
static void locateSurfInterestPointsThreadEntry(SurfLocatorThreadParams *paramsPtr)
Surf locator thread entry.
static GeometricTransformation * make(const std::string &factoryKey)
It creates an object with the appropriated factory.
TiePointsLocator output parameters.
void reset()
Reset (clear) the active instance data.
boost::mutex * m_syncMutexPtr
double m_lly
Lower left corner y-coordinate.
float m_feature3
Interest point feature 3 value.
static void createTifFromMatrix(const DoublesMatrix &rasterData, const InterestPointsSetT &interestPoints, const std::string &tifFileName)
Moravec interest points locator.
boost::mutex * m_interestPointsAccessMutexPtr
A pointer to a valid mutex to control the output interest points container access.
bool m_isInitialized
Tells if this instance is initialized.
float m_feature2
Interest point feature 2 value.
Abstract parameters base interface.
Method
Allowed interpolation methods.
const OutputParameters & operator=(const OutputParameters ¶ms)
#define TERP_LOG_AND_RETURN_FALSE(message)
Logs a warning message will and return false.
InterestPointsSetT * m_interestPointsPtr
A pointer to a valid interest points container.
UCharsMatrix const * m_maskRasterDataPtr
The loaded mask raster data pointer (or zero if no mask is avaliable).
void insert(const te::gm::Envelope &mbr, const DATATYPE &data)
It inserts an item into the tree.
static bool executeMatchingByEuclideanDist(const FloatsMatrix &featuresSet1, const FloatsMatrix &featuresSet2, const InterestPointsSetT &interestPointsSet1, const InterestPointsSetT &interestPointsSet2, const unsigned int maxPt1ToPt2PixelDistance, const double maxEuclideanDist, const unsigned int enableMultiThread, MatchedInterestPointsSetT &matchedPoints)
Match each feature using eucliean distance.
double m_ury
Upper right corner y-coordinate.
float m_feature1
Interest point feature 1 value.
static const factory_type * find(const std::string &factoryKey)
A generic template matrix.
static Raster * make()
It creates and returns an empty raster with default raster driver.
static bool loadRasterData(te::rst::Raster const *rasterPtr, const std::vector< unsigned int > &rasterBands, te::rst::Raster const *maskRasterPtr, const unsigned int maskRasterBand, const unsigned int rasterTargetAreaLineStart, const unsigned int rasterTargetAreaColStart, const unsigned int rasterTargetAreaWidth, const unsigned int rasterTargetAreaHeight, const double rescaleFactorX, const double rescaleFactorY, const te::rst::Interpolator::Method rasterInterpMethod, const unsigned char maxMemPercentUsage, std::vector< boost::shared_ptr< FloatsMatrix > > &loadedRasterData, UCharsMatrix &loadedMaskRasterData)
Load rasters data (normalized between 0 and 1).
unsigned int m_moravecWindowWidth
Thread return value pointer.
TemplateElementType ElementTypeT
Public matrix element type definition.
FloatsMatrix * m_corrMatrixPtr
FloatsMatrix const * m_featuresSet2Ptr
TiePointsLocator locator.
2D Geometric transformation parameters.
#define ROUND(x)
Minimum of two values.
FloatsMatrix const * m_rasterDataPtr
The loaded raster data.
TECOMMONEXPORT unsigned long int GetTotalPhysicalMemory()
Returns the amount of total physical memory (bytes).
Near neighborhood interpolation method.
UCharsMatrix const * m_maskRasterDataPtr
The loaded mask raster data pointer (or zero if no mask is avaliable).
#define TERP_DEBUG_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
Blue channel color interpretation.
unsigned int m_maxRasterLinesBlockMaxSize
The maximum lines number of each raster block to process.
A rectified grid is the spatial support for raster data.
bool isInitialized() const
Returns true if the algorithm instance is initialized and ready for execution.
Green channel color interpretation.
FloatsMatrix const * m_featuresSet2Ptr
static void roolUpBuffer(BufferElementT **bufferPtr, const unsigned int &bufferLinesNumber)
RoolUp a buffer of lines.
FloatsMatrix * m_distMatrixPtr
static bool applyGaussianFilter(const DoublesMatrix &inputData, DoublesMatrix &outputData, const unsigned int iterationsNumber)
Gaussian Filter.
InterestPointT const * m_interestPointsSet1Ptr
unsigned int getLinesNumber() const
The number of current matrix lines.
FloatsMatrix const * m_featuresSet1Ptr
static float getSurfDxxDerivative(float **bufferPtr, const unsigned int ¢erX, const unsigned int ¢erY, const unsigned int &lobeWidth, const unsigned int &lobeRadius)
Return a SURF box filter Dyy derivative centered over the given position from the given integral imag...
FloatsMatrix const * m_integralRasterDataPtr
The integral image raster data.
static float getHaarXVectorIntensity(BufferType &buffer, const unsigned int ¢erX, const unsigned int ¢erY, const unsigned int &radius)
Return a Haar X intesity vector for the window centered at the given point.
The parameters passed to the surfLocatorThreadEntry method.
static float getHaarYVectorIntensity(BufferType &buffer, const unsigned int ¢erX, const unsigned int ¢erY, const unsigned int &radius)
Return a Haar Y intesity vector for the window centered at the given point.
#define TERP_TRUE_OR_THROW(value, message)
Checks if value is true and throws an exception if not.
unsigned int * m_nextFeatureIdx1ToProcessPtr
bool initialize(const AlgorithmInputParameters &inputParams)
Initialize the algorithm instance making it ready for execution.
static void printBuffer(double **buffer, const unsigned int nLines, const unsigned int nCols)
Print the given buffer to std::out.
TECOMMONEXPORT unsigned long int GetTotalVirtualMemory()
Returns the amount of total virtual memory (bytes) that can be claimed by the current process (physic...
The parameters passed to the moravecLocatorThreadEntry method.