naiveSnake.h
Go to the documentation of this file.00001
00015 #ifndef DLR_COMPUTERVISION_NAIVESNAKE_H
00016 #define DLR_COMPUTERVISION_NAIVESNAKE_H
00017
00018 #include <vector>
00019 #include <dlrComputerVision/image.h>
00020 #include <dlrNumeric/vector2D.h>
00021
00022 namespace dlr {
00023
00024 namespace computerVision {
00025
00026 enum SnakeStrategy {
00027 SNAKE_EUCLIDEAN_DISTANCE
00028 };
00029
00030
00031 class Snake {
00032 public:
00033
00034 Snake();
00035
00036
00037 ~Snake() {}
00038
00039
00040 void
00041 enableCornerAdditionAndDeletion(bool enableFlag=true);
00042
00043
00044 std::vector<double>
00045 getBetaVector() {return m_betaVector;}
00046
00047
00048 bool
00049 isConverged() {return m_isConverged;}
00050
00051
00052 std::vector<Vector2D>
00053 run();
00054
00055
00056 std::vector<Vector2D>
00057 runOneIteration();
00058
00059
00060 void
00061 setBendingConstant(double beta);
00062
00063
00064 void
00065 setCornerAdditionAngle(double theta);
00066
00067
00068 void
00069 setCornerDeletionAngle(double theta);
00070
00071
00072 void
00073 setClosedCurve(bool isClosed=true)
00074 {m_isClosed = isClosed; m_isConverged = false;}
00075
00076
00077 void
00078 setExternalForceConstant(double kappa)
00079 {m_kappa = kappa; m_isConverged = false;}
00080
00081
00082
00083
00084
00085
00086
00087 void
00088 setInterestImage(const Image<GRAY1>& interestImage);
00089
00090
00091 void
00092 setMaxIterations(size_t maxIterations) {m_maxIterations = maxIterations;}
00093
00094
00095 void
00096 setMaxSnakeSize(size_t maxSize) {m_maxSnakeSize = maxSize;}
00097
00098
00099 void
00100 setMaximumSpanLength(size_t spanLength)
00101 {m_maxSpanLength = spanLength; m_isConverged = false;}
00102
00103
00104 void
00105 setMinimumSpanLength(size_t spanLength)
00106 {m_minSpanLength = spanLength; m_isConverged = false;}
00107
00108
00109 void
00110 setSeedPoints(const std::vector<Vector2D>& seedPoints);
00111
00112
00113 void
00114 setSeedPoints(const std::vector<Vector2D>& seedPoints,
00115 const std::vector<bool> cornerFlags);
00116
00117
00118 void
00119 setStepsPerIteration(size_t numSteps) {m_contourIterations = numSteps;}
00120
00121
00122 void
00123 setStretchingConstant(double alpha)
00124 {m_alpha = alpha; m_isConverged = false;}
00125
00126
00127 void
00128 setViscosityConstant(double gamma)
00129 {m_gamma = gamma; m_isConverged = false;}
00130
00131
00132 private:
00133
00134 void
00135 addResampledSpan(std::vector<Vector2D>& snake,
00136 std::vector<double>& betaVector,
00137 const Vector2D& newPoint,
00138 double newBeta,
00139 bool isLast=false);
00140
00141
00142 void
00143 adjustBetas(const std::vector<Vector2D>& snake,
00144 std::vector<double>& betaVector);
00145
00146
00147 Array2D<double>
00148 buildForceBalanceMatrix(size_t numberOfSnakePoints);
00149
00150
00151 void
00152 buildForceBalanceRHS(const std::vector<Vector2D>& snake,
00153 Array1D<double>& xRHS,
00154 Array1D<double>& yRHS);
00155
00156
00157 bool
00158 isConverged(const std::vector<Vector2D>& snake,
00159 const std::vector<Vector2D>& oldSnake);
00160
00161
00162 std::pair< std::vector<Vector2D>, std::vector<double> >
00163 resampleSnake();
00164
00165 void
00166 updateSnakePosition(std::vector<Vector2D>& snake);
00167
00168
00169 double m_alpha;
00170 double m_beta;
00171 std::vector<double> m_betaVector;
00172 size_t m_contourIterations;
00173 double m_cornerAdditionThreshold;
00174 double m_cornerDeletionThreshold;
00175 Array2D<double> m_externalForceGradientX;
00176 Array2D<double> m_externalForceGradientY;
00177 Array2D<double> m_forceBalanceMatrix;
00178 double m_gamma;
00179 bool m_isClosed;
00180 bool m_isConverged;
00181 bool m_isFixed;
00182 double m_kappa;
00183 size_t m_maxIterations;
00184 size_t m_maxSnakeSize;
00185 double m_maxSpanLength;
00186 double m_minSpanLength;
00187 std::vector<Vector2D> m_snake;
00188 };
00189
00190 }
00191
00192 }
00193
00194
00195
00196
00197
00198 #include <cmath>
00199
00200 namespace dlr {
00201
00202 namespace computerVision {
00203
00204
00205 }
00206
00207 }
00208
00209 #endif