Set stricter warning rules for gcc
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -81,6 +81,7 @@ private:
|
||||
{
|
||||
public:
|
||||
virtual ImageIterator* iterator() const = 0;
|
||||
virtual ~ImageRange() {}
|
||||
};
|
||||
|
||||
// Sliding window
|
||||
|
@@ -59,8 +59,8 @@ static Mat sortMatrixRowsByIndices(InputArray src, InputArray indices)
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
Mat argsort(InputArray _src, bool ascending=true)
|
||||
|
||||
static Mat argsort(InputArray _src, bool ascending=true)
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
if (src.rows != 1 && src.cols != 1)
|
||||
@@ -70,14 +70,14 @@ Mat argsort(InputArray _src, bool ascending=true)
|
||||
sortIdx(src.reshape(1,1),sorted_indices,flags);
|
||||
return sorted_indices;
|
||||
}
|
||||
|
||||
|
||||
template <typename _Tp> static
|
||||
Mat interp1_(const Mat& X_, const Mat& Y_, const Mat& XI)
|
||||
{
|
||||
int n = XI.rows;
|
||||
// sort input table
|
||||
vector<int> sort_indices = argsort(X_);
|
||||
|
||||
|
||||
Mat X = sortMatrixRowsByIndices(X_,sort_indices);
|
||||
Mat Y = sortMatrixRowsByIndices(Y_,sort_indices);
|
||||
// interpolated values
|
||||
@@ -131,7 +131,7 @@ static Mat interp1(InputArray _x, InputArray _Y, InputArray _xi)
|
||||
}
|
||||
return Mat();
|
||||
}
|
||||
|
||||
|
||||
namespace colormap
|
||||
{
|
||||
|
||||
@@ -531,7 +531,7 @@ namespace colormap
|
||||
n); // number of sample points
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
void ColorMap::operator()(InputArray _src, OutputArray _dst) const
|
||||
{
|
||||
if(_lut.total() != 256)
|
||||
@@ -550,7 +550,7 @@ namespace colormap
|
||||
// Apply the ColorMap.
|
||||
LUT(src, _lut, _dst);
|
||||
}
|
||||
|
||||
|
||||
Mat ColorMap::linear_colormap(InputArray X,
|
||||
InputArray r, InputArray g, InputArray b,
|
||||
InputArray xi) {
|
||||
@@ -581,12 +581,12 @@ namespace colormap
|
||||
colormap == COLORMAP_HOT ? (colormap::ColorMap*)(new colormap::Hot) :
|
||||
colormap == COLORMAP_MKPJ1 ? (colormap::ColorMap*)(new colormap::MKPJ1) :
|
||||
colormap == COLORMAP_MKPJ2 ? (colormap::ColorMap*)(new colormap::MKPJ2) : 0;
|
||||
|
||||
|
||||
if( !cm )
|
||||
CV_Error( CV_StsBadArg, "Unknown colormap id; use one of COLORMAP_*");
|
||||
|
||||
|
||||
(*cm)(src, dst);
|
||||
|
||||
|
||||
delete cm;
|
||||
}
|
||||
}
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
#define DEBUGLOGS 1
|
||||
|
||||
#if ANDROID
|
||||
#ifdef ANDROID
|
||||
#include <android/log.h>
|
||||
#define LOG_TAG "OBJECT_DETECTOR"
|
||||
#define LOGD0(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
|
||||
@@ -25,7 +25,7 @@
|
||||
#define LOGI(_str, ...) LOGI0(_str , ## __VA_ARGS__)
|
||||
#define LOGW(_str, ...) LOGW0(_str , ## __VA_ARGS__)
|
||||
#define LOGE(_str, ...) LOGE0(_str , ## __VA_ARGS__)
|
||||
#else
|
||||
#else
|
||||
#define LOGD(...) do{} while(0)
|
||||
#define LOGI(...) do{} while(0)
|
||||
#define LOGW(...) do{} while(0)
|
||||
@@ -193,7 +193,7 @@ do {
|
||||
} catch(...) { \
|
||||
LOGE0("\n ERROR: UNKNOWN Exception caught\n\n"); \
|
||||
} \
|
||||
} while(0)
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
void* workcycleObjectDetectorFunction(void* p)
|
||||
@@ -214,7 +214,7 @@ void DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector()
|
||||
vector<Rect> objects;
|
||||
|
||||
CV_Assert(stateThread==STATE_THREAD_WORKING_SLEEPING);
|
||||
pthread_mutex_lock(&mutex);
|
||||
pthread_mutex_lock(&mutex);
|
||||
{
|
||||
pthread_cond_signal(&objectDetectorThreadStartStop);
|
||||
|
||||
@@ -268,7 +268,7 @@ void DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector()
|
||||
LOGD("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() --- imageSeparateDetecting is empty, continue");
|
||||
continue;
|
||||
}
|
||||
LOGD("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() --- start handling imageSeparateDetecting, img.size=%dx%d, img.data=0x%p",
|
||||
LOGD("DetectionBasedTracker::SeparateDetectionWork::workcycleObjectDetector() --- start handling imageSeparateDetecting, img.size=%dx%d, img.data=0x%p",
|
||||
imageSeparateDetecting.size().width, imageSeparateDetecting.size().height, (void*)imageSeparateDetecting.data);
|
||||
|
||||
|
||||
@@ -368,7 +368,7 @@ void DetectionBasedTracker::SeparateDetectionWork::resetTracking()
|
||||
|
||||
|
||||
pthread_mutex_unlock(&mutex);
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread(const Mat& imageGray, vector<Rect>& rectsWhereRegions)
|
||||
@@ -398,7 +398,7 @@ bool DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThrea
|
||||
if (timeWhenDetectingThreadStartedWork > 0) {
|
||||
double time_from_previous_launch_in_ms=1000.0 * (((double)(getTickCount() - timeWhenDetectingThreadStartedWork )) / freq); //the same formula as for lastBigDetectionDuration
|
||||
shouldSendNewDataToWorkThread = (time_from_previous_launch_in_ms >= detectionBasedTracker.parameters.minDetectionPeriod);
|
||||
LOGD("DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread: shouldSendNewDataToWorkThread was 1, now it is %d, since time_from_previous_launch_in_ms=%.2f, minDetectionPeriod=%d",
|
||||
LOGD("DetectionBasedTracker::SeparateDetectionWork::communicateWithDetectingThread: shouldSendNewDataToWorkThread was 1, now it is %d, since time_from_previous_launch_in_ms=%.2f, minDetectionPeriod=%d",
|
||||
(shouldSendNewDataToWorkThread?1:0), time_from_previous_launch_in_ms, detectionBasedTracker.parameters.minDetectionPeriod);
|
||||
}
|
||||
|
||||
@@ -454,7 +454,7 @@ DetectionBasedTracker::DetectionBasedTracker(const std::string& cascadeFilename,
|
||||
&& (params.scaleFactor > 1.0)
|
||||
&& (params.maxTrackLifetime >= 0) );
|
||||
|
||||
if (!cascadeForTracking.load(cascadeFilename)) {
|
||||
if (!cascadeForTracking.load(cascadeFilename)) {
|
||||
CV_Error(CV_StsBadArg, "DetectionBasedTracker::DetectionBasedTracker: Cannot load a cascade from the file '"+cascadeFilename+"'");
|
||||
}
|
||||
|
||||
@@ -495,7 +495,7 @@ void DetectionBasedTracker::process(const Mat& imageGray)
|
||||
Mat imageDetect=imageGray;
|
||||
|
||||
int D=parameters.minObjectSize;
|
||||
if (D < 1)
|
||||
if (D < 1)
|
||||
D=1;
|
||||
|
||||
vector<Rect> rectsWhereRegions;
|
||||
@@ -633,7 +633,7 @@ void DetectionBasedTracker::updateTrackedObjects(const vector<Rect>& detectedObj
|
||||
LOGD("DetectionBasedTracker::updateTrackedObjects: j=%d is rejected, because it is intersected with another rectangle", j);
|
||||
continue;
|
||||
}
|
||||
LOGD("DetectionBasedTracker::updateTrackedObjects: detectedObjects[%d]={%d, %d, %d x %d}",
|
||||
LOGD("DetectionBasedTracker::updateTrackedObjects: detectedObjects[%d]={%d, %d, %d x %d}",
|
||||
j, detectedObjects[j].x, detectedObjects[j].y, detectedObjects[j].width, detectedObjects[j].height);
|
||||
|
||||
Rect r=prevRect & detectedObjects[j];
|
||||
@@ -691,9 +691,9 @@ void DetectionBasedTracker::updateTrackedObjects(const vector<Rect>& detectedObj
|
||||
|
||||
std::vector<TrackedObject>::iterator it=trackedObjects.begin();
|
||||
while( it != trackedObjects.end() ) {
|
||||
if ( (it->numFramesNotDetected > parameters.maxTrackLifetime)
|
||||
if ( (it->numFramesNotDetected > parameters.maxTrackLifetime)
|
||||
||
|
||||
(
|
||||
(
|
||||
(it->numDetectedFrames <= innerParameters.numStepsToWaitBeforeFirstShow)
|
||||
&&
|
||||
(it->numFramesNotDetected > innerParameters.numStepsToTrackWithoutDetectingIfObjectHasNotBeenShown)
|
||||
@@ -718,7 +718,7 @@ Rect DetectionBasedTracker::calcTrackedObjectPositionToShow(int i) const
|
||||
return Rect();
|
||||
}
|
||||
if (trackedObjects[i].numDetectedFrames <= innerParameters.numStepsToWaitBeforeFirstShow){
|
||||
LOGI("DetectionBasedTracker::calcTrackedObjectPositionToShow: trackedObjects[%d].numDetectedFrames=%d <= numStepsToWaitBeforeFirstShow=%d --- return empty Rect()",
|
||||
LOGI("DetectionBasedTracker::calcTrackedObjectPositionToShow: trackedObjects[%d].numDetectedFrames=%d <= numStepsToWaitBeforeFirstShow=%d --- return empty Rect()",
|
||||
i, trackedObjects[i].numDetectedFrames, innerParameters.numStepsToWaitBeforeFirstShow);
|
||||
return Rect();
|
||||
}
|
||||
|
@@ -46,7 +46,7 @@
|
||||
|
||||
using namespace cv;
|
||||
|
||||
void downsamplePoints( const Mat& src, Mat& dst, size_t count )
|
||||
static void downsamplePoints( const Mat& src, Mat& dst, size_t count )
|
||||
{
|
||||
CV_Assert( count >= 2 );
|
||||
CV_Assert( src.cols == 1 || src.rows == 1 );
|
||||
|
@@ -28,7 +28,7 @@ using std::map;
|
||||
using std::set;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
|
||||
// Removes duplicate elements in a given vector.
|
||||
template<typename _Tp>
|
||||
inline vector<_Tp> remove_dups(const vector<_Tp>& src) {
|
||||
@@ -42,7 +42,7 @@ inline vector<_Tp> remove_dups(const vector<_Tp>& src) {
|
||||
elems.push_back(*it);
|
||||
return elems;
|
||||
}
|
||||
|
||||
|
||||
static Mat argsort(InputArray _src, bool ascending=true)
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
@@ -72,8 +72,8 @@ static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void sortMatrixColumnsByIndices(InputArray _src, InputArray _indices, OutputArray _dst) {
|
||||
|
||||
static void sortMatrixColumnsByIndices(InputArray _src, InputArray _indices, OutputArray _dst) {
|
||||
if(_indices.getMat().type() != CV_32SC1)
|
||||
CV_Error(CV_StsUnsupportedFormat, "cv::sortColumnsByIndices only works on integer indices!");
|
||||
Mat src = _src.getMat();
|
||||
@@ -87,13 +87,13 @@ void sortMatrixColumnsByIndices(InputArray _src, InputArray _indices, OutputArra
|
||||
}
|
||||
}
|
||||
|
||||
Mat sortMatrixColumnsByIndices(InputArray src, InputArray indices) {
|
||||
static Mat sortMatrixColumnsByIndices(InputArray src, InputArray indices) {
|
||||
Mat dst;
|
||||
sortMatrixColumnsByIndices(src, indices, dst);
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
template<typename _Tp> static bool
|
||||
isSymmetric_(InputArray src) {
|
||||
Mat _src = src.getMat();
|
||||
@@ -151,7 +151,7 @@ static bool isSymmetric(InputArray src, double eps=1e-16)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// subspace::project
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -198,32 +198,32 @@ Mat subspaceReconstruct(InputArray _W, InputArray _mean, InputArray _src)
|
||||
return X;
|
||||
}
|
||||
|
||||
|
||||
|
||||
class EigenvalueDecomposition {
|
||||
private:
|
||||
|
||||
|
||||
// Holds the data dimension.
|
||||
int n;
|
||||
|
||||
|
||||
// Stores real/imag part of a complex division.
|
||||
double cdivr, cdivi;
|
||||
|
||||
|
||||
// Pointer to internal memory.
|
||||
double *d, *e, *ort;
|
||||
double **V, **H;
|
||||
|
||||
|
||||
// Holds the computed eigenvalues.
|
||||
Mat _eigenvalues;
|
||||
|
||||
|
||||
// Holds the computed eigenvectors.
|
||||
Mat _eigenvectors;
|
||||
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp *alloc_1d(int m) {
|
||||
return new _Tp[m];
|
||||
}
|
||||
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp *alloc_1d(int m, _Tp val) {
|
||||
@@ -232,7 +232,7 @@ private:
|
||||
arr[i] = val;
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp **alloc_2d(int m, int n) {
|
||||
@@ -241,7 +241,7 @@ private:
|
||||
arr[i] = new _Tp[n];
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp **alloc_2d(int m, int n, _Tp val) {
|
||||
@@ -253,7 +253,7 @@ private:
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
|
||||
void cdiv(double xr, double xi, double yr, double yi) {
|
||||
double r, d;
|
||||
if (std::abs(yr) > std::abs(yi)) {
|
||||
@@ -268,16 +268,16 @@ private:
|
||||
cdivi = (r * xi - xr) / d;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Nonsymmetric reduction from Hessenberg to real Schur form.
|
||||
|
||||
|
||||
void hqr2() {
|
||||
|
||||
|
||||
// This is derived from the Algol procedure hqr2,
|
||||
// by Martin and Wilkinson, Handbook for Auto. Comp.,
|
||||
// Vol.ii-Linear Algebra, and the corresponding
|
||||
// Fortran subroutine in EISPACK.
|
||||
|
||||
|
||||
// Initialize
|
||||
int nn = this->n;
|
||||
int n = nn - 1;
|
||||
@@ -286,9 +286,9 @@ private:
|
||||
double eps = pow(2.0, -52.0);
|
||||
double exshift = 0.0;
|
||||
double p = 0, q = 0, r = 0, s = 0, z = 0, t, w, x, y;
|
||||
|
||||
|
||||
// Store roots isolated by balanc and compute matrix norm
|
||||
|
||||
|
||||
double norm = 0.0;
|
||||
for (int i = 0; i < nn; i++) {
|
||||
if (i < low || i > high) {
|
||||
@@ -299,11 +299,11 @@ private:
|
||||
norm = norm + std::abs(H[i][j]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Outer loop over eigenvalue index
|
||||
int iter = 0;
|
||||
while (n >= low) {
|
||||
|
||||
|
||||
// Look for single small sub-diagonal element
|
||||
int l = n;
|
||||
while (l > low) {
|
||||
@@ -316,19 +316,19 @@ private:
|
||||
}
|
||||
l--;
|
||||
}
|
||||
|
||||
|
||||
// Check for convergence
|
||||
// One root found
|
||||
|
||||
|
||||
if (l == n) {
|
||||
H[n][n] = H[n][n] + exshift;
|
||||
d[n] = H[n][n];
|
||||
e[n] = 0.0;
|
||||
n--;
|
||||
iter = 0;
|
||||
|
||||
|
||||
// Two roots found
|
||||
|
||||
|
||||
} else if (l == n - 1) {
|
||||
w = H[n][n - 1] * H[n - 1][n];
|
||||
p = (H[n - 1][n - 1] - H[n][n]) / 2.0;
|
||||
@@ -337,9 +337,9 @@ private:
|
||||
H[n][n] = H[n][n] + exshift;
|
||||
H[n - 1][n - 1] = H[n - 1][n - 1] + exshift;
|
||||
x = H[n][n];
|
||||
|
||||
|
||||
// Real pair
|
||||
|
||||
|
||||
if (q >= 0) {
|
||||
if (p >= 0) {
|
||||
z = p + z;
|
||||
@@ -360,33 +360,33 @@ private:
|
||||
r = sqrt(p * p + q * q);
|
||||
p = p / r;
|
||||
q = q / r;
|
||||
|
||||
|
||||
// Row modification
|
||||
|
||||
|
||||
for (int j = n - 1; j < nn; j++) {
|
||||
z = H[n - 1][j];
|
||||
H[n - 1][j] = q * z + p * H[n][j];
|
||||
H[n][j] = q * H[n][j] - p * z;
|
||||
}
|
||||
|
||||
|
||||
// Column modification
|
||||
|
||||
|
||||
for (int i = 0; i <= n; i++) {
|
||||
z = H[i][n - 1];
|
||||
H[i][n - 1] = q * z + p * H[i][n];
|
||||
H[i][n] = q * H[i][n] - p * z;
|
||||
}
|
||||
|
||||
|
||||
// Accumulate transformations
|
||||
|
||||
|
||||
for (int i = low; i <= high; i++) {
|
||||
z = V[i][n - 1];
|
||||
V[i][n - 1] = q * z + p * V[i][n];
|
||||
V[i][n] = q * V[i][n] - p * z;
|
||||
}
|
||||
|
||||
|
||||
// Complex pair
|
||||
|
||||
|
||||
} else {
|
||||
d[n - 1] = x + p;
|
||||
d[n] = x + p;
|
||||
@@ -395,13 +395,13 @@ private:
|
||||
}
|
||||
n = n - 2;
|
||||
iter = 0;
|
||||
|
||||
|
||||
// No convergence yet
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
|
||||
// Form shift
|
||||
|
||||
|
||||
x = H[n][n];
|
||||
y = 0.0;
|
||||
w = 0.0;
|
||||
@@ -409,9 +409,9 @@ private:
|
||||
y = H[n - 1][n - 1];
|
||||
w = H[n][n - 1] * H[n - 1][n];
|
||||
}
|
||||
|
||||
|
||||
// Wilkinson's original ad hoc shift
|
||||
|
||||
|
||||
if (iter == 10) {
|
||||
exshift += x;
|
||||
for (int i = low; i <= n; i++) {
|
||||
@@ -421,9 +421,9 @@ private:
|
||||
x = y = 0.75 * s;
|
||||
w = -0.4375 * s * s;
|
||||
}
|
||||
|
||||
|
||||
// MATLAB's new ad hoc shift
|
||||
|
||||
|
||||
if (iter == 30) {
|
||||
s = (y - x) / 2.0;
|
||||
s = s * s + w;
|
||||
@@ -440,9 +440,9 @@ private:
|
||||
x = y = w = 0.964;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
iter = iter + 1; // (Could check iteration count here.)
|
||||
|
||||
|
||||
// Look for two consecutive small sub-diagonal elements
|
||||
int m = n - 2;
|
||||
while (m >= l) {
|
||||
@@ -466,16 +466,16 @@ private:
|
||||
}
|
||||
m--;
|
||||
}
|
||||
|
||||
|
||||
for (int i = m + 2; i <= n; i++) {
|
||||
H[i][i - 2] = 0.0;
|
||||
if (i > m + 2) {
|
||||
H[i][i - 3] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Double QR step involving rows l:n and columns m:n
|
||||
|
||||
|
||||
for (int k = m; k <= n - 1; k++) {
|
||||
bool notlast = (k != n - 1);
|
||||
if (k != m) {
|
||||
@@ -508,9 +508,9 @@ private:
|
||||
z = r / s;
|
||||
q = q / p;
|
||||
r = r / p;
|
||||
|
||||
|
||||
// Row modification
|
||||
|
||||
|
||||
for (int j = k; j < nn; j++) {
|
||||
p = H[k][j] + q * H[k + 1][j];
|
||||
if (notlast) {
|
||||
@@ -520,9 +520,9 @@ private:
|
||||
H[k][j] = H[k][j] - p * x;
|
||||
H[k + 1][j] = H[k + 1][j] - p * y;
|
||||
}
|
||||
|
||||
|
||||
// Column modification
|
||||
|
||||
|
||||
for (int i = 0; i <= min(n, k + 3); i++) {
|
||||
p = x * H[i][k] + y * H[i][k + 1];
|
||||
if (notlast) {
|
||||
@@ -532,9 +532,9 @@ private:
|
||||
H[i][k] = H[i][k] - p;
|
||||
H[i][k + 1] = H[i][k + 1] - p * q;
|
||||
}
|
||||
|
||||
|
||||
// Accumulate transformations
|
||||
|
||||
|
||||
for (int i = low; i <= high; i++) {
|
||||
p = x * V[i][k] + y * V[i][k + 1];
|
||||
if (notlast) {
|
||||
@@ -548,19 +548,19 @@ private:
|
||||
} // k loop
|
||||
} // check convergence
|
||||
} // while (n >= low)
|
||||
|
||||
|
||||
// Backsubstitute to find vectors of upper triangular form
|
||||
|
||||
|
||||
if (norm == 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for (n = nn - 1; n >= 0; n--) {
|
||||
p = d[n];
|
||||
q = e[n];
|
||||
|
||||
|
||||
// Real vector
|
||||
|
||||
|
||||
if (q == 0) {
|
||||
int l = n;
|
||||
H[n][n] = 1.0;
|
||||
@@ -581,9 +581,9 @@ private:
|
||||
} else {
|
||||
H[i][n] = -r / (eps * norm);
|
||||
}
|
||||
|
||||
|
||||
// Solve real equations
|
||||
|
||||
|
||||
} else {
|
||||
x = H[i][i + 1];
|
||||
y = H[i + 1][i];
|
||||
@@ -596,9 +596,9 @@ private:
|
||||
H[i + 1][n] = (-s - y * t) / z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Overflow control
|
||||
|
||||
|
||||
t = std::abs(H[i][n]);
|
||||
if ((eps * t) * t > 1) {
|
||||
for (int j = i; j <= n; j++) {
|
||||
@@ -607,14 +607,14 @@ private:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Complex vector
|
||||
|
||||
|
||||
} else if (q < 0) {
|
||||
int l = n - 1;
|
||||
|
||||
|
||||
// Last vector component imaginary so matrix is triangular
|
||||
|
||||
|
||||
if (std::abs(H[n][n - 1]) > std::abs(H[n - 1][n])) {
|
||||
H[n - 1][n - 1] = q / H[n][n - 1];
|
||||
H[n - 1][n] = -(H[n][n] - p) / H[n][n - 1];
|
||||
@@ -634,7 +634,7 @@ private:
|
||||
sa = sa + H[i][j] * H[j][n];
|
||||
}
|
||||
w = H[i][i] - p;
|
||||
|
||||
|
||||
if (e[i] < 0.0) {
|
||||
z = w;
|
||||
r = ra;
|
||||
@@ -646,9 +646,9 @@ private:
|
||||
H[i][n - 1] = cdivr;
|
||||
H[i][n] = cdivi;
|
||||
} else {
|
||||
|
||||
|
||||
// Solve complex equations
|
||||
|
||||
|
||||
x = H[i][i + 1];
|
||||
y = H[i + 1][i];
|
||||
vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
|
||||
@@ -673,9 +673,9 @@ private:
|
||||
H[i + 1][n] = cdivi;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Overflow control
|
||||
|
||||
|
||||
t = max(std::abs(H[i][n - 1]), std::abs(H[i][n]));
|
||||
if ((eps * t) * t > 1) {
|
||||
for (int j = i; j <= n; j++) {
|
||||
@@ -687,9 +687,9 @@ private:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Vectors of isolated roots
|
||||
|
||||
|
||||
for (int i = 0; i < nn; i++) {
|
||||
if (i < low || i > high) {
|
||||
for (int j = i; j < nn; j++) {
|
||||
@@ -697,9 +697,9 @@ private:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Back transformation to get eigenvectors of original matrix
|
||||
|
||||
|
||||
for (int j = nn - 1; j >= low; j--) {
|
||||
for (int i = low; i <= high; i++) {
|
||||
z = 0.0;
|
||||
@@ -710,7 +710,7 @@ private:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Nonsymmetric reduction to Hessenberg form.
|
||||
void orthes() {
|
||||
// This is derived from the Algol procedures orthes and ortran,
|
||||
@@ -719,19 +719,19 @@ private:
|
||||
// Fortran subroutines in EISPACK.
|
||||
int low = 0;
|
||||
int high = n - 1;
|
||||
|
||||
|
||||
for (int m = low + 1; m <= high - 1; m++) {
|
||||
|
||||
|
||||
// Scale column.
|
||||
|
||||
|
||||
double scale = 0.0;
|
||||
for (int i = m; i <= high; i++) {
|
||||
scale = scale + std::abs(H[i][m - 1]);
|
||||
}
|
||||
if (scale != 0.0) {
|
||||
|
||||
|
||||
// Compute Householder transformation.
|
||||
|
||||
|
||||
double h = 0.0;
|
||||
for (int i = high; i >= m; i--) {
|
||||
ort[i] = H[i][m - 1] / scale;
|
||||
@@ -743,10 +743,10 @@ private:
|
||||
}
|
||||
h = h - ort[m] * g;
|
||||
ort[m] = ort[m] - g;
|
||||
|
||||
|
||||
// Apply Householder similarity transformation
|
||||
// H = (I-u*u'/h)*H*(I-u*u')/h)
|
||||
|
||||
|
||||
for (int j = m; j < n; j++) {
|
||||
double f = 0.0;
|
||||
for (int i = high; i >= m; i--) {
|
||||
@@ -757,7 +757,7 @@ private:
|
||||
H[i][j] -= f * ort[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i <= high; i++) {
|
||||
double f = 0.0;
|
||||
for (int j = high; j >= m; j--) {
|
||||
@@ -772,15 +772,15 @@ private:
|
||||
H[m][m - 1] = scale * g;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Accumulate transformations (Algol's ortran).
|
||||
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
V[i][j] = (i == j ? 1.0 : 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int m = high - 1; m >= low + 1; m--) {
|
||||
if (H[m][m - 1] != 0.0) {
|
||||
for (int i = m + 1; i <= high; i++) {
|
||||
@@ -800,7 +800,7 @@ private:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Releases all internal working memory.
|
||||
void release() {
|
||||
// releases the working data
|
||||
@@ -814,7 +814,7 @@ private:
|
||||
delete[] H;
|
||||
delete[] V;
|
||||
}
|
||||
|
||||
|
||||
// Computes the Eigenvalue Decomposition for a matrix given in H.
|
||||
void compute() {
|
||||
// Allocate memory for the working data.
|
||||
@@ -839,11 +839,11 @@ private:
|
||||
// Deallocate the memory by releasing all internal working data.
|
||||
release();
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
EigenvalueDecomposition()
|
||||
: n(0) { }
|
||||
|
||||
|
||||
// Initializes & computes the Eigenvalue Decomposition for a general matrix
|
||||
// given in src. This function is a port of the EigenvalueSolver in JAMA,
|
||||
// which has been released to public domain by The MathWorks and the
|
||||
@@ -851,7 +851,7 @@ public:
|
||||
EigenvalueDecomposition(InputArray src) {
|
||||
compute(src);
|
||||
}
|
||||
|
||||
|
||||
// This function computes the Eigenvalue Decomposition for a general matrix
|
||||
// given in src. This function is a port of the EigenvalueSolver in JAMA,
|
||||
// which has been released to public domain by The MathWorks and the
|
||||
@@ -883,9 +883,9 @@ public:
|
||||
compute();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
~EigenvalueDecomposition() {}
|
||||
|
||||
|
||||
// Returns the eigenvalues of the Eigenvalue Decomposition.
|
||||
Mat eigenvalues() { return _eigenvalues; }
|
||||
// Returns the eigenvectors of the Eigenvalue Decomposition.
|
||||
@@ -1045,6 +1045,6 @@ Mat LDA::project(InputArray src) {
|
||||
Mat LDA::reconstruct(InputArray src) {
|
||||
return subspaceReconstruct(_eigenvectors, Mat(), _dataAsRow ? src : src.getMat().t());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@@ -43,98 +43,99 @@
|
||||
#include "precomp.hpp"
|
||||
#include <limits>
|
||||
|
||||
namespace cv
|
||||
namespace
|
||||
{
|
||||
using namespace cv;
|
||||
const size_t MAX_STACK_SIZE = 255;
|
||||
const size_t MAX_LEAFS = 8;
|
||||
|
||||
|
||||
bool checkIfNodeOutsideSphere(const Octree::Node& node, const Point3f& c, float r)
|
||||
{
|
||||
if (node.x_max < (c.x - r) || node.y_max < (c.y - r) || node.z_max < (c.z - r))
|
||||
return true;
|
||||
|
||||
|
||||
if ((c.x + r) < node.x_min || (c.y + r) < node.y_min || (c.z + r) < node.z_min)
|
||||
return true;
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool checkIfNodeInsideSphere(const Octree::Node& node, const Point3f& c, float r)
|
||||
{
|
||||
r *= r;
|
||||
|
||||
|
||||
float d2_xmin = (node.x_min - c.x) * (node.x_min - c.x);
|
||||
float d2_ymin = (node.y_min - c.y) * (node.y_min - c.y);
|
||||
float d2_zmin = (node.z_min - c.z) * (node.z_min - c.z);
|
||||
|
||||
|
||||
if (d2_xmin + d2_ymin + d2_zmin > r)
|
||||
return false;
|
||||
|
||||
|
||||
float d2_zmax = (node.z_max - c.z) * (node.z_max - c.z);
|
||||
|
||||
|
||||
if (d2_xmin + d2_ymin + d2_zmax > r)
|
||||
return false;
|
||||
|
||||
|
||||
float d2_ymax = (node.y_max - c.y) * (node.y_max - c.y);
|
||||
|
||||
|
||||
if (d2_xmin + d2_ymax + d2_zmin > r)
|
||||
return false;
|
||||
|
||||
|
||||
if (d2_xmin + d2_ymax + d2_zmax > r)
|
||||
return false;
|
||||
|
||||
|
||||
float d2_xmax = (node.x_max - c.x) * (node.x_max - c.x);
|
||||
|
||||
|
||||
if (d2_xmax + d2_ymin + d2_zmin > r)
|
||||
return false;
|
||||
|
||||
|
||||
if (d2_xmax + d2_ymin + d2_zmax > r)
|
||||
return false;
|
||||
|
||||
|
||||
if (d2_xmax + d2_ymax + d2_zmin > r)
|
||||
return false;
|
||||
|
||||
|
||||
if (d2_xmax + d2_ymax + d2_zmax > r)
|
||||
return false;
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void fillMinMax(const vector<Point3f>& points, Octree::Node& node)
|
||||
{
|
||||
node.x_max = node.y_max = node.z_max = std::numeric_limits<float>::min();
|
||||
node.x_min = node.y_min = node.z_min = std::numeric_limits<float>::max();
|
||||
|
||||
|
||||
for (size_t i = 0; i < points.size(); ++i)
|
||||
{
|
||||
const Point3f& point = points[i];
|
||||
|
||||
|
||||
if (node.x_max < point.x)
|
||||
node.x_max = point.x;
|
||||
|
||||
|
||||
if (node.y_max < point.y)
|
||||
node.y_max = point.y;
|
||||
|
||||
|
||||
if (node.z_max < point.z)
|
||||
node.z_max = point.z;
|
||||
|
||||
|
||||
if (node.x_min > point.x)
|
||||
node.x_min = point.x;
|
||||
|
||||
|
||||
if (node.y_min > point.y)
|
||||
node.y_min = point.y;
|
||||
|
||||
|
||||
if (node.z_min > point.z)
|
||||
node.z_min = point.z;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
size_t findSubboxForPoint(const Point3f& point, const Octree::Node& node)
|
||||
{
|
||||
size_t ind_x = point.x < (node.x_max + node.x_min) / 2 ? 0 : 1;
|
||||
size_t ind_y = point.y < (node.y_max + node.y_min) / 2 ? 0 : 1;
|
||||
size_t ind_z = point.z < (node.z_max + node.z_min) / 2 ? 0 : 1;
|
||||
|
||||
|
||||
return (ind_x << 2) + (ind_y << 1) + (ind_z << 0);
|
||||
}
|
||||
void initChildBox(const Octree::Node& parent, size_t boxIndex, Octree::Node& child)
|
||||
@@ -142,58 +143,61 @@ namespace cv
|
||||
child.x_min = child.x_max = (parent.x_max + parent.x_min) / 2;
|
||||
child.y_min = child.y_max = (parent.y_max + parent.y_min) / 2;
|
||||
child.z_min = child.z_max = (parent.z_max + parent.z_min) / 2;
|
||||
|
||||
|
||||
if ((boxIndex >> 0) & 1)
|
||||
child.z_max = parent.z_max;
|
||||
else
|
||||
child.z_min = parent.z_min;
|
||||
|
||||
|
||||
if ((boxIndex >> 1) & 1)
|
||||
child.y_max = parent.y_max;
|
||||
else
|
||||
child.y_min = parent.y_min;
|
||||
|
||||
|
||||
if ((boxIndex >> 2) & 1)
|
||||
child.x_max = parent.x_max;
|
||||
else
|
||||
child.x_min = parent.x_min;
|
||||
}
|
||||
|
||||
|
||||
}//namespace
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////// Octree //////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
namespace cv
|
||||
{
|
||||
Octree::Octree()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Octree::Octree(const vector<Point3f>& points3d, int maxLevels, int minPoints)
|
||||
{
|
||||
buildTree(points3d, maxLevels, minPoints);
|
||||
}
|
||||
|
||||
|
||||
Octree::~Octree()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Octree::getPointsWithinSphere(const Point3f& center, float radius, vector<Point3f>& out) const
|
||||
{
|
||||
out.clear();
|
||||
|
||||
|
||||
if (nodes.empty())
|
||||
return;
|
||||
|
||||
|
||||
int stack[MAX_STACK_SIZE];
|
||||
int pos = 0;
|
||||
stack[pos] = 0;
|
||||
|
||||
|
||||
while (pos >= 0)
|
||||
{
|
||||
const Node& cur = nodes[stack[pos--]];
|
||||
|
||||
|
||||
if (checkIfNodeOutsideSphere(cur, center, radius))
|
||||
continue;
|
||||
|
||||
|
||||
if (checkIfNodeInsideSphere(cur, center, radius))
|
||||
{
|
||||
size_t sz = out.size();
|
||||
@@ -202,133 +206,133 @@ namespace cv
|
||||
out[sz++] = points[i];
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (cur.isLeaf)
|
||||
{
|
||||
double r2 = radius * radius;
|
||||
size_t sz = out.size();
|
||||
out.resize(sz + (cur.end - cur.begin));
|
||||
|
||||
|
||||
for (int i = cur.begin; i < cur.end; ++i)
|
||||
{
|
||||
const Point3f& point = points[i];
|
||||
|
||||
|
||||
double dx = (point.x - center.x);
|
||||
double dy = (point.y - center.y);
|
||||
double dz = (point.z - center.z);
|
||||
|
||||
|
||||
double dist2 = dx * dx + dy * dy + dz * dz;
|
||||
|
||||
|
||||
if (dist2 < r2)
|
||||
out[sz++] = point;
|
||||
};
|
||||
out.resize(sz);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (cur.children[0])
|
||||
stack[++pos] = cur.children[0];
|
||||
|
||||
|
||||
if (cur.children[1])
|
||||
stack[++pos] = cur.children[1];
|
||||
|
||||
|
||||
if (cur.children[2])
|
||||
stack[++pos] = cur.children[2];
|
||||
|
||||
|
||||
if (cur.children[3])
|
||||
stack[++pos] = cur.children[3];
|
||||
|
||||
|
||||
if (cur.children[4])
|
||||
stack[++pos] = cur.children[4];
|
||||
|
||||
|
||||
if (cur.children[5])
|
||||
stack[++pos] = cur.children[5];
|
||||
|
||||
|
||||
if (cur.children[6])
|
||||
stack[++pos] = cur.children[6];
|
||||
|
||||
|
||||
if (cur.children[7])
|
||||
stack[++pos] = cur.children[7];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Octree::buildTree(const vector<Point3f>& points3d, int maxLevels, int minPoints)
|
||||
{
|
||||
assert((size_t)maxLevels * 8 < MAX_STACK_SIZE);
|
||||
points.resize(points3d.size());
|
||||
std::copy(points3d.begin(), points3d.end(), points.begin());
|
||||
this->minPoints = minPoints;
|
||||
|
||||
|
||||
nodes.clear();
|
||||
nodes.push_back(Node());
|
||||
Node& root = nodes[0];
|
||||
fillMinMax(points, root);
|
||||
|
||||
|
||||
root.isLeaf = true;
|
||||
root.maxLevels = maxLevels;
|
||||
root.begin = 0;
|
||||
root.end = (int)points.size();
|
||||
for (size_t i = 0; i < MAX_LEAFS; i++)
|
||||
root.children[i] = 0;
|
||||
|
||||
|
||||
if (maxLevels != 1 && (root.end - root.begin) > minPoints)
|
||||
{
|
||||
root.isLeaf = false;
|
||||
buildNext(0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Octree::buildNext(size_t nodeInd)
|
||||
{
|
||||
size_t size = nodes[nodeInd].end - nodes[nodeInd].begin;
|
||||
|
||||
|
||||
vector<size_t> boxBorders(MAX_LEAFS+1, 0);
|
||||
vector<size_t> boxIndices(size);
|
||||
vector<Point3f> tempPoints(size);
|
||||
|
||||
|
||||
for (int i = nodes[nodeInd].begin, j = 0; i < nodes[nodeInd].end; ++i, ++j)
|
||||
{
|
||||
const Point3f& p = points[i];
|
||||
|
||||
|
||||
size_t subboxInd = findSubboxForPoint(p, nodes[nodeInd]);
|
||||
|
||||
|
||||
boxBorders[subboxInd+1]++;
|
||||
boxIndices[j] = subboxInd;
|
||||
tempPoints[j] = p;
|
||||
}
|
||||
|
||||
|
||||
for (size_t i = 1; i < boxBorders.size(); ++i)
|
||||
boxBorders[i] += boxBorders[i-1];
|
||||
|
||||
|
||||
vector<size_t> writeInds(boxBorders.begin(), boxBorders.end());
|
||||
|
||||
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
{
|
||||
size_t boxIndex = boxIndices[i];
|
||||
Point3f& curPoint = tempPoints[i];
|
||||
|
||||
|
||||
size_t copyTo = nodes[nodeInd].begin + writeInds[boxIndex]++;
|
||||
points[copyTo] = curPoint;
|
||||
}
|
||||
|
||||
|
||||
for (size_t i = 0; i < MAX_LEAFS; ++i)
|
||||
{
|
||||
if (boxBorders[i] == boxBorders[i+1])
|
||||
continue;
|
||||
|
||||
|
||||
nodes.push_back(Node());
|
||||
Node& child = nodes.back();
|
||||
initChildBox(nodes[nodeInd], i, child);
|
||||
|
||||
|
||||
child.isLeaf = true;
|
||||
child.maxLevels = nodes[nodeInd].maxLevels - 1;
|
||||
child.begin = nodes[nodeInd].begin + (int)boxBorders[i+0];
|
||||
child.end = nodes[nodeInd].begin + (int)boxBorders[i+1];
|
||||
for (size_t k = 0; k < MAX_LEAFS; k++)
|
||||
child.children[k] = 0;
|
||||
|
||||
|
||||
nodes[nodeInd].children[i] = (int)(nodes.size() - 1);
|
||||
|
||||
|
||||
if (child.maxLevels != 1 && (child.end - child.begin) > minPoints)
|
||||
{
|
||||
child.isLeaf = false;
|
||||
@@ -336,5 +340,5 @@ namespace cv
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@@ -43,11 +43,11 @@
|
||||
#ifndef __OPENCV_PRECOMP_H__
|
||||
#define __OPENCV_PRECOMP_H__
|
||||
|
||||
#if _MSC_VER >= 1200
|
||||
#if defined _MSC_VER && _MSC_VER >= 1200
|
||||
#pragma warning( disable: 4251 4710 4711 4514 4996 )
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_CVCONFIG_H
|
||||
#ifdef HAVE_CVCONFIG_H
|
||||
#include "cvconfig.h"
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user