Warning fixes continued
This commit is contained in:
parent
f6b451c607
commit
f2d3b9b4a1
@ -75,7 +75,7 @@ if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
#add_extra_compiler_option(-Wcast-align)
|
||||
#add_extra_compiler_option(-Wstrict-aliasing=2)
|
||||
#add_extra_compiler_option(-Wshadow)
|
||||
add_extra_compiler_option(-Wno-unnamed-type-template-args)
|
||||
#add_extra_compiler_option(-Wno-unnamed-type-template-args)
|
||||
|
||||
# The -Wno-long-long is required in 64bit systems when including sytem headers.
|
||||
if(X86_64)
|
||||
|
@ -10,7 +10,7 @@ elseif(UNIX AND NOT APPLE)
|
||||
if(TBB_FOUND)
|
||||
set(HAVE_TBB 1)
|
||||
if(NOT ${TBB_INCLUDE_DIRS} STREQUAL "")
|
||||
include_directories(SYSTEM ${TBB_INCLUDE_DIRS})
|
||||
ocv_include_directories(${TBB_INCLUDE_DIRS})
|
||||
endif()
|
||||
link_directories(${TBB_LIBRARY_DIRS})
|
||||
set(OPENCV_LINKER_LIBS ${OPENCV_LINKER_LIBS} ${TBB_LIBRARIES})
|
||||
@ -63,7 +63,7 @@ if(NOT HAVE_TBB)
|
||||
|
||||
set(HAVE_TBB 1)
|
||||
if(NOT "${TBB_INCLUDE_DIRS}" STREQUAL "")
|
||||
include_directories(SYSTEM "${TBB_INCLUDE_DIRS}")
|
||||
ocv_include_directories("${TBB_INCLUDE_DIRS}")
|
||||
endif()
|
||||
endif(TBB_INCLUDE_DIRS)
|
||||
endif(NOT HAVE_TBB)
|
||||
|
@ -19,7 +19,7 @@ function(ocv_include_directories)
|
||||
if("${__abs_dir}" MATCHES "^${OpenCV_SOURCE_DIR}" OR "${__abs_dir}" MATCHES "^${OpenCV_BINARY_DIR}")
|
||||
list(APPEND __add_before "${dir}")
|
||||
else()
|
||||
include_directories(AFTER "${dir}")
|
||||
include_directories(AFTER SYSTEM "${dir}")
|
||||
endif()
|
||||
endforeach()
|
||||
include_directories(BEFORE ${__add_before})
|
||||
|
@ -230,7 +230,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
int found = 0;
|
||||
CvCBQuad *quads = 0, **quad_group = 0;
|
||||
CvCBCorner *corners = 0, **corner_group = 0;
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
int k = 0;
|
||||
@ -252,11 +252,11 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
|
||||
if( out_corner_count )
|
||||
*out_corner_count = 0;
|
||||
|
||||
|
||||
IplImage _img;
|
||||
int check_chessboard_result;
|
||||
int quad_count = 0, group_idx = 0, i = 0, dilations = 0;
|
||||
|
||||
int quad_count = 0, group_idx = 0, dilations = 0;
|
||||
|
||||
img = cvGetMat( img, &stub );
|
||||
//debug_img = img;
|
||||
|
||||
@ -316,8 +316,8 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
for( dilations = min_dilations; dilations <= max_dilations; dilations++ )
|
||||
{
|
||||
if (found)
|
||||
break; // already found it
|
||||
|
||||
break; // already found it
|
||||
|
||||
cvFree(&quads);
|
||||
cvFree(&corners);
|
||||
|
||||
@ -378,7 +378,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
cvCopy(dbg_img, dbg1_img);
|
||||
cvNamedWindow("all_quads", 1);
|
||||
// copy corners to temp array
|
||||
for( i = 0; i < quad_count; i++ )
|
||||
for(int i = 0; i < quad_count; i++ )
|
||||
{
|
||||
for (int k=0; k<4; k++)
|
||||
{
|
||||
@ -432,7 +432,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
cvCopy(dbg_img,dbg2_img);
|
||||
cvNamedWindow("connected_group", 1);
|
||||
// copy corners to temp array
|
||||
for( i = 0; i < quad_count; i++ )
|
||||
for(int i = 0; i < quad_count; i++ )
|
||||
{
|
||||
if (quads[i].group_idx == group_idx)
|
||||
for (int k=0; k<4; k++)
|
||||
@ -455,7 +455,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
#endif
|
||||
|
||||
if (count == 0)
|
||||
continue; // haven't found inner quads
|
||||
continue; // haven't found inner quads
|
||||
|
||||
|
||||
// If count is more than it should be, this will remove those quads
|
||||
@ -472,7 +472,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
float sum_dist = 0;
|
||||
int total = 0;
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
for(int i = 0; i < n; i++ )
|
||||
{
|
||||
int ni = 0;
|
||||
float avgi = corner_group[i]->meanDist(&ni);
|
||||
@ -484,7 +484,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
if( count > 0 || (out_corner_count && -count > *out_corner_count) )
|
||||
{
|
||||
// copy corners to output array
|
||||
for( i = 0; i < n; i++ )
|
||||
for(int i = 0; i < n; i++ )
|
||||
out_corners[i] = corner_group[i]->pt;
|
||||
|
||||
if( out_corner_count )
|
||||
@ -505,19 +505,19 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
if( found )
|
||||
found = icvCheckBoardMonotony( out_corners, pattern_size );
|
||||
|
||||
// check that none of the found corners is too close to the image boundary
|
||||
// check that none of the found corners is too close to the image boundary
|
||||
if( found )
|
||||
{
|
||||
const int BORDER = 8;
|
||||
for( k = 0; k < pattern_size.width*pattern_size.height; k++ )
|
||||
{
|
||||
if( out_corners[k].x <= BORDER || out_corners[k].x > img->cols - BORDER ||
|
||||
out_corners[k].y <= BORDER || out_corners[k].y > img->rows - BORDER )
|
||||
break;
|
||||
}
|
||||
|
||||
found = k == pattern_size.width*pattern_size.height;
|
||||
}
|
||||
{
|
||||
const int BORDER = 8;
|
||||
for( k = 0; k < pattern_size.width*pattern_size.height; k++ )
|
||||
{
|
||||
if( out_corners[k].x <= BORDER || out_corners[k].x > img->cols - BORDER ||
|
||||
out_corners[k].y <= BORDER || out_corners[k].y > img->rows - BORDER )
|
||||
break;
|
||||
}
|
||||
|
||||
found = k == pattern_size.width*pattern_size.height;
|
||||
}
|
||||
|
||||
if( found && pattern_size.height % 2 == 0 && pattern_size.width % 2 == 0 )
|
||||
{
|
||||
@ -525,8 +525,8 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
double dy0 = out_corners[last_row].y - out_corners[0].y;
|
||||
if( dy0 < 0 )
|
||||
{
|
||||
int i, n = pattern_size.width*pattern_size.height;
|
||||
for( i = 0; i < n/2; i++ )
|
||||
int n = pattern_size.width*pattern_size.height;
|
||||
for(int i = 0; i < n/2; i++ )
|
||||
{
|
||||
CvPoint2D32f temp;
|
||||
CV_SWAP(out_corners[i], out_corners[n-i-1], temp);
|
||||
@ -559,7 +559,7 @@ int cvFindChessboardCorners( const void* arr, CvSize pattern_size,
|
||||
cvFree(&corner_group);
|
||||
throw;
|
||||
}
|
||||
|
||||
|
||||
cvFree(&quads);
|
||||
cvFree(&corners);
|
||||
cvFree(&quad_group);
|
||||
@ -582,7 +582,7 @@ static int
|
||||
icvCheckBoardMonotony( CvPoint2D32f* corners, CvSize pattern_size )
|
||||
{
|
||||
int i, j, k;
|
||||
|
||||
|
||||
for( k = 0; k < 2; k++ )
|
||||
{
|
||||
for( i = 0; i < (k == 0 ? pattern_size.height : pattern_size.width); i++ )
|
||||
@ -627,11 +627,10 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
{
|
||||
cv::Ptr<CvMemStorage> temp_storage = cvCreateChildMemStorage( storage );
|
||||
CvSeq* stack = cvCreateSeq( 0, sizeof(*stack), sizeof(void*), temp_storage );
|
||||
int i;
|
||||
|
||||
// first find an interior quad
|
||||
CvCBQuad *start = NULL;
|
||||
for (i=0; i<quad_count; i++)
|
||||
for (int i=0; i<quad_count; i++)
|
||||
{
|
||||
if (quads[i]->count == 4)
|
||||
{
|
||||
@ -682,7 +681,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
case 1:
|
||||
col += 2; break;
|
||||
case 2:
|
||||
row += 2; break;
|
||||
row += 2; break;
|
||||
case 3:
|
||||
col -= 2; break;
|
||||
}
|
||||
@ -700,7 +699,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
}
|
||||
}
|
||||
|
||||
for (i=col_min; i<=col_max; i++)
|
||||
for (int i=col_min; i<=col_max; i++)
|
||||
PRINTF("HIST[%d] = %d\n", i, col_hist[i]);
|
||||
|
||||
// analyze inner quad structure
|
||||
@ -763,7 +762,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
// if there is an outer quad missing, fill it in
|
||||
// first order all inner quads
|
||||
int found = 0;
|
||||
for (i=0; i<quad_count; i++)
|
||||
for (int i=0; i<quad_count; i++)
|
||||
{
|
||||
if (quads[i]->count == 4)
|
||||
{ // ok, look at neighbors
|
||||
@ -778,7 +777,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
case 1:
|
||||
col += 2; break;
|
||||
case 2:
|
||||
row += 2; break;
|
||||
row += 2; break;
|
||||
case 3:
|
||||
col -= 2; break;
|
||||
}
|
||||
@ -817,7 +816,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
|
||||
|
||||
// final trimming of outer quads
|
||||
if (dcol == w && drow == h) // found correct inner quads
|
||||
if (dcol == w && drow == h) // found correct inner quads
|
||||
{
|
||||
PRINTF("Inner bounds ok, check outer quads\n");
|
||||
int rcount = quad_count;
|
||||
@ -832,7 +831,7 @@ icvOrderFoundConnectedQuads( int quad_count, CvCBQuad **quads,
|
||||
if (quads[i]->neighbors[j] && quads[i]->neighbors[j]->ordered)
|
||||
outer = true;
|
||||
}
|
||||
if (!outer) // not an outer quad, eliminate
|
||||
if (!outer) // not an outer quad, eliminate
|
||||
{
|
||||
PRINTF("Removing quad %d\n", i);
|
||||
icvRemoveQuadFromGroup(quads,rcount,quads[i]);
|
||||
@ -876,7 +875,7 @@ icvAddOuterQuad( CvCBQuad *quad, CvCBQuad **quads, int quad_count,
|
||||
quad->count += 1;
|
||||
q->neighbors[j] = quad;
|
||||
q->group_idx = quad->group_idx;
|
||||
q->count = 1; // number of neighbors
|
||||
q->count = 1; // number of neighbors
|
||||
q->ordered = false;
|
||||
q->edge_len = quad->edge_len;
|
||||
|
||||
@ -1262,7 +1261,7 @@ icvCheckQuadGroup( CvCBQuad **quad_group, int quad_count,
|
||||
int width = 0, height = 0;
|
||||
int hist[5] = {0,0,0,0,0};
|
||||
CvCBCorner* first = 0, *first2 = 0, *right, *cur, *below, *c;
|
||||
|
||||
|
||||
// build dual graph, which vertices are internal quad corners
|
||||
// and two vertices are connected iff they lie on the same quad edge
|
||||
for( i = 0; i < quad_count; i++ )
|
||||
@ -1485,7 +1484,7 @@ icvCheckQuadGroup( CvCBQuad **quad_group, int quad_count,
|
||||
result = corner_count;
|
||||
|
||||
finalize:
|
||||
|
||||
|
||||
if( result <= 0 )
|
||||
{
|
||||
corner_count = MIN( corner_count, pattern_size.width*pattern_size.height );
|
||||
@ -1697,7 +1696,7 @@ icvGenerateQuads( CvCBQuad **out_quads, CvCBCorner **out_corners,
|
||||
CV_POLY_APPROX_DP, (float)approx_level );
|
||||
if( dst_contour->total == 4 )
|
||||
break;
|
||||
|
||||
|
||||
// we call this again on its own output, because sometimes
|
||||
// cvApproxPoly() does not simplify as much as it should.
|
||||
dst_contour = cvApproxPoly( dst_contour, sizeof(CvContour), temp_storage,
|
||||
@ -2006,17 +2005,17 @@ bool cv::findCirclesGrid( InputArray _image, Size patternSize,
|
||||
#endif
|
||||
if (isFound)
|
||||
{
|
||||
switch(parameters.gridType)
|
||||
{
|
||||
switch(parameters.gridType)
|
||||
{
|
||||
case CirclesGridFinderParameters::SYMMETRIC_GRID:
|
||||
boxFinder.getHoles(centers);
|
||||
break;
|
||||
case CirclesGridFinderParameters::ASYMMETRIC_GRID:
|
||||
boxFinder.getAsymmetricHoles(centers);
|
||||
break;
|
||||
boxFinder.getAsymmetricHoles(centers);
|
||||
break;
|
||||
default:
|
||||
CV_Error(CV_StsBadArg, "Unkown pattern type");
|
||||
}
|
||||
}
|
||||
|
||||
if (i != 0)
|
||||
{
|
||||
@ -2027,7 +2026,7 @@ bool cv::findCirclesGrid( InputArray _image, Size patternSize,
|
||||
Mat(centers).copyTo(_centers);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
boxFinder.getHoles(centers);
|
||||
if (i != attempts - 1)
|
||||
{
|
||||
|
@ -1153,7 +1153,7 @@ CV_IMPL void cvFindExtrinsicCameraParams2( const CvMat* objectPoints,
|
||||
int useExtrinsicGuess )
|
||||
{
|
||||
const int max_iter = 20;
|
||||
Ptr<CvMat> matM, _Mxy, _m, _mn, matL, matJ;
|
||||
Ptr<CvMat> matM, _Mxy, _m, _mn, matL;
|
||||
|
||||
int i, count;
|
||||
double a[9], ar[9]={1,0,0,0,1,0,0,0,1}, R[9];
|
||||
|
@ -65,14 +65,14 @@ void drawPoints(const vector<Point2f> &points, Mat &outImage, int radius = 2, S
|
||||
}
|
||||
#endif
|
||||
|
||||
void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> points, const Size &patternSize, vector<Point2f> &patternPoints)
|
||||
void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> points, const Size &patternSz, vector<Point2f> &patternPoints)
|
||||
{
|
||||
#ifdef HAVE_TEGRA_OPTIMIZATION
|
||||
if(tegra::hierarchicalClustering(points, patternSize, patternPoints))
|
||||
if(tegra::hierarchicalClustering(points, patternSz, patternPoints))
|
||||
return;
|
||||
#endif
|
||||
int i, j, n = (int)points.size();
|
||||
size_t pn = static_cast<size_t>(patternSize.area());
|
||||
int j, n = (int)points.size();
|
||||
size_t pn = static_cast<size_t>(patternSz.area());
|
||||
|
||||
patternPoints.clear();
|
||||
if (pn >= points.size())
|
||||
@ -84,7 +84,7 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin
|
||||
|
||||
Mat dists(n, n, CV_32FC1, Scalar(0));
|
||||
Mat distsMask(dists.size(), CV_8UC1, Scalar(0));
|
||||
for(i = 0; i < n; i++)
|
||||
for(int i = 0; i < n; i++)
|
||||
{
|
||||
for(j = i+1; j < n; j++)
|
||||
{
|
||||
@ -122,7 +122,7 @@ void CirclesGridClusterFinder::hierarchicalClustering(const vector<Point2f> poin
|
||||
}
|
||||
|
||||
//the largest cluster can have more than pn points -- we need to filter out such situations
|
||||
if(clusters[patternClusterIdx].size() != static_cast<size_t>(patternSize.area()))
|
||||
if(clusters[patternClusterIdx].size() != static_cast<size_t>(patternSz.area()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@ -505,11 +505,11 @@ void Graph::floydWarshall(cv::Mat &distanceMatrix, int infinity) const
|
||||
{
|
||||
for (Vertices::const_iterator it3 = vertices.begin(); it3 != vertices.end(); it3++)
|
||||
{
|
||||
int i1 = (int)it1->first, i2 = (int)it2->first, i3 = (int)it3->first;
|
||||
int i1 = (int)it1->first, i2 = (int)it2->first, i3 = (int)it3->first;
|
||||
int val1 = distanceMatrix.at<int> (i2, i3);
|
||||
int val2;
|
||||
if (distanceMatrix.at<int> (i2, i1) == infinity ||
|
||||
distanceMatrix.at<int> (i1, i3) == infinity)
|
||||
distanceMatrix.at<int> (i1, i3) == infinity)
|
||||
val2 = val1;
|
||||
else
|
||||
{
|
||||
|
@ -8,26 +8,26 @@ epnp::epnp(const cv::Mat& cameraMatrix, const cv::Mat& opoints, const cv::Mat& i
|
||||
if (cameraMatrix.depth() == CV_32F)
|
||||
init_camera_parameters<float>(cameraMatrix);
|
||||
else
|
||||
init_camera_parameters<double>(cameraMatrix);
|
||||
init_camera_parameters<double>(cameraMatrix);
|
||||
|
||||
number_of_correspondences = std::max(opoints.checkVector(3, CV_32F), opoints.checkVector(3, CV_64F));
|
||||
|
||||
pws.resize(3 * number_of_correspondences);
|
||||
us.resize(2 * number_of_correspondences);
|
||||
|
||||
us.resize(2 * number_of_correspondences);
|
||||
|
||||
if (opoints.depth() == ipoints.depth())
|
||||
{
|
||||
if (opoints.depth() == CV_32F)
|
||||
init_points<cv::Point3f,cv::Point2f>(opoints, ipoints);
|
||||
else
|
||||
init_points<cv::Point3d,cv::Point2d>(opoints, ipoints);
|
||||
if (opoints.depth() == CV_32F)
|
||||
init_points<cv::Point3f,cv::Point2f>(opoints, ipoints);
|
||||
else
|
||||
init_points<cv::Point3d,cv::Point2d>(opoints, ipoints);
|
||||
}
|
||||
else if (opoints.depth() == CV_32F)
|
||||
init_points<cv::Point3f,cv::Point2d>(opoints, ipoints);
|
||||
init_points<cv::Point3f,cv::Point2d>(opoints, ipoints);
|
||||
else
|
||||
init_points<cv::Point3d,cv::Point2f>(opoints, ipoints);
|
||||
init_points<cv::Point3d,cv::Point2f>(opoints, ipoints);
|
||||
|
||||
alphas.resize(4 * number_of_correspondences);
|
||||
alphas.resize(4 * number_of_correspondences);
|
||||
pcs.resize(3 * number_of_correspondences);
|
||||
|
||||
max_nr = 0;
|
||||
@ -97,15 +97,15 @@ void epnp::compute_barycentric_coordinates(void)
|
||||
|
||||
for(int j = 0; j < 3; j++)
|
||||
a[1 + j] =
|
||||
ci[3 * j ] * (pi[0] - cws[0][0]) +
|
||||
ci[3 * j + 1] * (pi[1] - cws[0][1]) +
|
||||
ci[3 * j + 2] * (pi[2] - cws[0][2]);
|
||||
ci[3 * j ] * (pi[0] - cws[0][0]) +
|
||||
ci[3 * j + 1] * (pi[1] - cws[0][1]) +
|
||||
ci[3 * j + 2] * (pi[2] - cws[0][2]);
|
||||
a[0] = 1.0f - a[1] - a[2] - a[3];
|
||||
}
|
||||
}
|
||||
|
||||
void epnp::fill_M(CvMat * M,
|
||||
const int row, const double * as, const double u, const double v)
|
||||
const int row, const double * as, const double u, const double v)
|
||||
{
|
||||
double * M1 = M->data.db + row * 12;
|
||||
double * M2 = M1 + 12;
|
||||
@ -130,7 +130,7 @@ void epnp::compute_ccs(const double * betas, const double * ut)
|
||||
const double * v = ut + 12 * (11 - i);
|
||||
for(int j = 0; j < 4; j++)
|
||||
for(int k = 0; k < 3; k++)
|
||||
ccs[j][k] += betas[i] * v[3 * j + k];
|
||||
ccs[j][k] += betas[i] * v[3 * j + k];
|
||||
}
|
||||
}
|
||||
|
||||
@ -195,7 +195,7 @@ void epnp::compute_pose(cv::Mat& R, cv::Mat& t)
|
||||
}
|
||||
|
||||
void epnp::copy_R_and_t(const double R_src[3][3], const double t_src[3],
|
||||
double R_dst[3][3], double t_dst[3])
|
||||
double R_dst[3][3], double t_dst[3])
|
||||
{
|
||||
for(int i = 0; i < 3; i++) {
|
||||
for(int j = 0; j < 3; j++)
|
||||
@ -282,7 +282,7 @@ void epnp::solve_for_sign(void)
|
||||
if (pcs[2] < 0.0) {
|
||||
for(int i = 0; i < 4; i++)
|
||||
for(int j = 0; j < 3; j++)
|
||||
ccs[i][j] = -ccs[i][j];
|
||||
ccs[i][j] = -ccs[i][j];
|
||||
|
||||
for(int i = 0; i < number_of_correspondences; i++) {
|
||||
pcs[3 * i ] = -pcs[3 * i];
|
||||
@ -293,7 +293,7 @@ void epnp::solve_for_sign(void)
|
||||
}
|
||||
|
||||
double epnp::compute_R_and_t(const double * ut, const double * betas,
|
||||
double R[3][3], double t[3])
|
||||
double R[3][3], double t[3])
|
||||
{
|
||||
compute_ccs(betas, ut);
|
||||
compute_pcs();
|
||||
@ -322,13 +322,13 @@ double epnp::reprojection_error(const double R[3][3], const double t[3])
|
||||
}
|
||||
|
||||
return sum2 / number_of_correspondences;
|
||||
}
|
||||
}
|
||||
|
||||
// betas10 = [B11 B12 B22 B13 B23 B33 B14 B24 B34 B44]
|
||||
// betas_approx_1 = [B11 B12 B13 B14]
|
||||
|
||||
void epnp::find_betas_approx_1(const CvMat * L_6x10, const CvMat * Rho,
|
||||
double * betas)
|
||||
double * betas)
|
||||
{
|
||||
double l_6x4[6 * 4], b4[4];
|
||||
CvMat L_6x4 = cvMat(6, 4, CV_64F, l_6x4);
|
||||
@ -360,7 +360,7 @@ void epnp::find_betas_approx_1(const CvMat * L_6x10, const CvMat * Rho,
|
||||
// betas_approx_2 = [B11 B12 B22 ]
|
||||
|
||||
void epnp::find_betas_approx_2(const CvMat * L_6x10, const CvMat * Rho,
|
||||
double * betas)
|
||||
double * betas)
|
||||
{
|
||||
double l_6x3[6 * 3], b3[3];
|
||||
CvMat L_6x3 = cvMat(6, 3, CV_64F, l_6x3);
|
||||
@ -392,7 +392,7 @@ void epnp::find_betas_approx_2(const CvMat * L_6x10, const CvMat * Rho,
|
||||
// betas_approx_3 = [B11 B12 B22 B13 B23 ]
|
||||
|
||||
void epnp::find_betas_approx_3(const CvMat * L_6x10, const CvMat * Rho,
|
||||
double * betas)
|
||||
double * betas)
|
||||
{
|
||||
double l_6x5[6 * 5], b5[5];
|
||||
CvMat L_6x5 = cvMat(6, 5, CV_64F, l_6x5);
|
||||
@ -440,8 +440,8 @@ void epnp::compute_L_6x10(const double * ut, double * l_6x10)
|
||||
|
||||
b++;
|
||||
if (b > 3) {
|
||||
a++;
|
||||
b = a + 1;
|
||||
a++;
|
||||
b = a + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -473,7 +473,7 @@ void epnp::compute_rho(double * rho)
|
||||
}
|
||||
|
||||
void epnp::compute_A_and_b_gauss_newton(const double * l_6x10, const double * rho,
|
||||
const double betas[4], CvMat * A, CvMat * b)
|
||||
const double betas[4], CvMat * A, CvMat * b)
|
||||
{
|
||||
for(int i = 0; i < 6; i++) {
|
||||
const double * rowL = l_6x10 + i * 10;
|
||||
@ -485,23 +485,22 @@ void epnp::compute_A_and_b_gauss_newton(const double * l_6x10, const double * rh
|
||||
rowA[3] = rowL[6] * betas[0] + rowL[7] * betas[1] + rowL[8] * betas[2] + 2 * rowL[9] * betas[3];
|
||||
|
||||
cvmSet(b, i, 0, rho[i] -
|
||||
(
|
||||
rowL[0] * betas[0] * betas[0] +
|
||||
rowL[1] * betas[0] * betas[1] +
|
||||
rowL[2] * betas[1] * betas[1] +
|
||||
rowL[3] * betas[0] * betas[2] +
|
||||
rowL[4] * betas[1] * betas[2] +
|
||||
rowL[5] * betas[2] * betas[2] +
|
||||
rowL[6] * betas[0] * betas[3] +
|
||||
rowL[7] * betas[1] * betas[3] +
|
||||
rowL[8] * betas[2] * betas[3] +
|
||||
rowL[9] * betas[3] * betas[3]
|
||||
));
|
||||
(
|
||||
rowL[0] * betas[0] * betas[0] +
|
||||
rowL[1] * betas[0] * betas[1] +
|
||||
rowL[2] * betas[1] * betas[1] +
|
||||
rowL[3] * betas[0] * betas[2] +
|
||||
rowL[4] * betas[1] * betas[2] +
|
||||
rowL[5] * betas[2] * betas[2] +
|
||||
rowL[6] * betas[0] * betas[3] +
|
||||
rowL[7] * betas[1] * betas[3] +
|
||||
rowL[8] * betas[2] * betas[3] +
|
||||
rowL[9] * betas[3] * betas[3]
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
void epnp::gauss_newton(const CvMat * L_6x10, const CvMat * Rho,
|
||||
double betas[4])
|
||||
void epnp::gauss_newton(const CvMat * L_6x10, const CvMat * Rho, double betas[4])
|
||||
{
|
||||
const int iterations_number = 5;
|
||||
|
||||
@ -510,12 +509,13 @@ void epnp::gauss_newton(const CvMat * L_6x10, const CvMat * Rho,
|
||||
CvMat B = cvMat(6, 1, CV_64F, b);
|
||||
CvMat X = cvMat(4, 1, CV_64F, x);
|
||||
|
||||
for(int k = 0; k < iterations_number; k++) {
|
||||
for(int k = 0; k < iterations_number; k++)
|
||||
{
|
||||
compute_A_and_b_gauss_newton(L_6x10->data.db, Rho->data.db,
|
||||
betas, &A, &B);
|
||||
betas, &A, &B);
|
||||
qr_solve(&A, &B, &X);
|
||||
for(int i = 0; i < 4; i++)
|
||||
betas[i] += x[i];
|
||||
betas[i] += x[i];
|
||||
}
|
||||
}
|
||||
|
||||
@ -524,53 +524,64 @@ void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X)
|
||||
const int nr = A->rows;
|
||||
const int nc = A->cols;
|
||||
|
||||
if (max_nr != 0 && max_nr < nr) {
|
||||
if (max_nr != 0 && max_nr < nr)
|
||||
{
|
||||
delete [] A1;
|
||||
delete [] A2;
|
||||
}
|
||||
if (max_nr < nr) {
|
||||
if (max_nr < nr)
|
||||
{
|
||||
max_nr = nr;
|
||||
A1 = new double[nr];
|
||||
A2 = new double[nr];
|
||||
}
|
||||
|
||||
double * pA = A->data.db, * ppAkk = pA;
|
||||
for(int k = 0; k < nc; k++) {
|
||||
double * ppAik = ppAkk, eta = fabs(*ppAik);
|
||||
for(int i = k + 1; i < nr; i++) {
|
||||
double elt = fabs(*ppAik);
|
||||
for(int k = 0; k < nc; k++)
|
||||
{
|
||||
double * ppAik1 = ppAkk, eta = fabs(*ppAik1);
|
||||
for(int i = k + 1; i < nr; i++)
|
||||
{
|
||||
double elt = fabs(*ppAik1);
|
||||
if (eta < elt) eta = elt;
|
||||
ppAik += nc;
|
||||
ppAik1 += nc;
|
||||
}
|
||||
if (eta == 0) {
|
||||
if (eta == 0)
|
||||
{
|
||||
A1[k] = A2[k] = 0.0;
|
||||
//cerr << "God damnit, A is singular, this shouldn't happen." << endl;
|
||||
return;
|
||||
} else {
|
||||
double * ppAik = ppAkk, sum = 0.0, inv_eta = 1. / eta;
|
||||
for(int i = k; i < nr; i++) {
|
||||
*ppAik *= inv_eta;
|
||||
sum += *ppAik * *ppAik;
|
||||
ppAik += nc;
|
||||
}
|
||||
else
|
||||
{
|
||||
double * ppAik2 = ppAkk, sum2 = 0.0, inv_eta = 1. / eta;
|
||||
for(int i = k; i < nr; i++)
|
||||
{
|
||||
*ppAik2 *= inv_eta;
|
||||
sum2 += *ppAik2 * *ppAik2;
|
||||
ppAik2 += nc;
|
||||
}
|
||||
double sigma = sqrt(sum);
|
||||
double sigma = sqrt(sum2);
|
||||
if (*ppAkk < 0)
|
||||
sigma = -sigma;
|
||||
sigma = -sigma;
|
||||
*ppAkk += sigma;
|
||||
A1[k] = sigma * *ppAkk;
|
||||
A2[k] = -eta * sigma;
|
||||
for(int j = k + 1; j < nc; j++) {
|
||||
double * ppAik = ppAkk, sum = 0;
|
||||
for(int i = k; i < nr; i++) {
|
||||
sum += *ppAik * ppAik[j - k];
|
||||
ppAik += nc;
|
||||
}
|
||||
double tau = sum / A1[k];
|
||||
ppAik = ppAkk;
|
||||
for(int i = k; i < nr; i++) {
|
||||
ppAik[j - k] -= tau * *ppAik;
|
||||
ppAik += nc;
|
||||
}
|
||||
for(int j = k + 1; j < nc; j++)
|
||||
{
|
||||
double * ppAik = ppAkk, sum = 0;
|
||||
for(int i = k; i < nr; i++)
|
||||
{
|
||||
sum += *ppAik * ppAik[j - k];
|
||||
ppAik += nc;
|
||||
}
|
||||
double tau = sum / A1[k];
|
||||
ppAik = ppAkk;
|
||||
for(int i = k; i < nr; i++)
|
||||
{
|
||||
ppAik[j - k] -= tau * *ppAik;
|
||||
ppAik += nc;
|
||||
}
|
||||
}
|
||||
}
|
||||
ppAkk += nc + 1;
|
||||
@ -578,15 +589,18 @@ void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X)
|
||||
|
||||
// b <- Qt b
|
||||
double * ppAjj = pA, * pb = b->data.db;
|
||||
for(int j = 0; j < nc; j++) {
|
||||
for(int j = 0; j < nc; j++)
|
||||
{
|
||||
double * ppAij = ppAjj, tau = 0;
|
||||
for(int i = j; i < nr; i++) {
|
||||
for(int i = j; i < nr; i++)
|
||||
{
|
||||
tau += *ppAij * pb[i];
|
||||
ppAij += nc;
|
||||
}
|
||||
tau /= A1[j];
|
||||
ppAij = ppAjj;
|
||||
for(int i = j; i < nr; i++) {
|
||||
for(int i = j; i < nr; i++)
|
||||
{
|
||||
pb[i] -= tau * *ppAij;
|
||||
ppAij += nc;
|
||||
}
|
||||
@ -596,10 +610,12 @@ void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X)
|
||||
// X = R-1 b
|
||||
double * pX = X->data.db;
|
||||
pX[nc - 1] = pb[nc - 1] / A2[nc - 1];
|
||||
for(int i = nc - 2; i >= 0; i--) {
|
||||
for(int i = nc - 2; i >= 0; i--)
|
||||
{
|
||||
double * ppAij = pA + i * nc + (i + 1), sum = 0;
|
||||
|
||||
for(int j = i + 1; j < nc; j++) {
|
||||
for(int j = i + 1; j < nc; j++)
|
||||
{
|
||||
sum += *ppAij * pX[j];
|
||||
ppAij++;
|
||||
}
|
||||
|
@ -9,151 +9,151 @@ using namespace std;
|
||||
|
||||
void p3p::init_inverse_parameters()
|
||||
{
|
||||
inv_fx = 1. / fx;
|
||||
inv_fy = 1. / fy;
|
||||
cx_fx = cx / fx;
|
||||
cy_fy = cy / fy;
|
||||
inv_fx = 1. / fx;
|
||||
inv_fy = 1. / fy;
|
||||
cx_fx = cx / fx;
|
||||
cy_fy = cy / fy;
|
||||
}
|
||||
|
||||
p3p::p3p(cv::Mat cameraMatrix)
|
||||
{
|
||||
if (cameraMatrix.depth() == CV_32F)
|
||||
init_camera_parameters<float>(cameraMatrix);
|
||||
else
|
||||
init_camera_parameters<double>(cameraMatrix);
|
||||
init_inverse_parameters();
|
||||
if (cameraMatrix.depth() == CV_32F)
|
||||
init_camera_parameters<float>(cameraMatrix);
|
||||
else
|
||||
init_camera_parameters<double>(cameraMatrix);
|
||||
init_inverse_parameters();
|
||||
}
|
||||
|
||||
p3p::p3p(double _fx, double _fy, double _cx, double _cy)
|
||||
{
|
||||
fx = _fx;
|
||||
fy = _fy;
|
||||
cx = _cx;
|
||||
cy = _cy;
|
||||
init_inverse_parameters();
|
||||
fx = _fx;
|
||||
fy = _fy;
|
||||
cx = _cx;
|
||||
cy = _cy;
|
||||
init_inverse_parameters();
|
||||
}
|
||||
|
||||
bool p3p::solve(cv::Mat& R, cv::Mat& tvec, const cv::Mat& opoints, const cv::Mat& ipoints)
|
||||
{
|
||||
double rotation_matrix[3][3], translation[3];
|
||||
std::vector<double> points;
|
||||
if (opoints.depth() == ipoints.depth())
|
||||
{
|
||||
if (opoints.depth() == CV_32F)
|
||||
extract_points<cv::Point3f,cv::Point2f>(opoints, ipoints, points);
|
||||
else
|
||||
extract_points<cv::Point3d,cv::Point2d>(opoints, ipoints, points);
|
||||
}
|
||||
else if (opoints.depth() == CV_32F)
|
||||
extract_points<cv::Point3f,cv::Point2d>(opoints, ipoints, points);
|
||||
else
|
||||
extract_points<cv::Point3d,cv::Point2f>(opoints, ipoints, points);
|
||||
double rotation_matrix[3][3], translation[3];
|
||||
std::vector<double> points;
|
||||
if (opoints.depth() == ipoints.depth())
|
||||
{
|
||||
if (opoints.depth() == CV_32F)
|
||||
extract_points<cv::Point3f,cv::Point2f>(opoints, ipoints, points);
|
||||
else
|
||||
extract_points<cv::Point3d,cv::Point2d>(opoints, ipoints, points);
|
||||
}
|
||||
else if (opoints.depth() == CV_32F)
|
||||
extract_points<cv::Point3f,cv::Point2d>(opoints, ipoints, points);
|
||||
else
|
||||
extract_points<cv::Point3d,cv::Point2f>(opoints, ipoints, points);
|
||||
|
||||
bool result = solve(rotation_matrix, translation, points[0], points[1], points[2], points[3], points[4], points[5],
|
||||
points[6], points[7], points[8], points[9], points[10], points[11], points[12], points[13], points[14],
|
||||
points[15], points[16], points[17], points[18], points[19]);
|
||||
cv::Mat(3, 1, CV_64F, translation).copyTo(tvec);
|
||||
bool result = solve(rotation_matrix, translation, points[0], points[1], points[2], points[3], points[4], points[5],
|
||||
points[6], points[7], points[8], points[9], points[10], points[11], points[12], points[13], points[14],
|
||||
points[15], points[16], points[17], points[18], points[19]);
|
||||
cv::Mat(3, 1, CV_64F, translation).copyTo(tvec);
|
||||
cv::Mat(3, 3, CV_64F, rotation_matrix).copyTo(R);
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
bool p3p::solve(double R[3][3], double t[3],
|
||||
double mu0, double mv0, double X0, double Y0, double Z0,
|
||||
double mu1, double mv1, double X1, double Y1, double Z1,
|
||||
double mu2, double mv2, double X2, double Y2, double Z2,
|
||||
double mu3, double mv3, double X3, double Y3, double Z3)
|
||||
double mu0, double mv0, double X0, double Y0, double Z0,
|
||||
double mu1, double mv1, double X1, double Y1, double Z1,
|
||||
double mu2, double mv2, double X2, double Y2, double Z2,
|
||||
double mu3, double mv3, double X3, double Y3, double Z3)
|
||||
{
|
||||
double Rs[4][3][3], ts[4][3];
|
||||
double Rs[4][3][3], ts[4][3];
|
||||
|
||||
int n = solve(Rs, ts, mu0, mv0, X0, Y0, Z0, mu1, mv1, X1, Y1, Z1, mu2, mv2, X2, Y2, Z2);
|
||||
int n = solve(Rs, ts, mu0, mv0, X0, Y0, Z0, mu1, mv1, X1, Y1, Z1, mu2, mv2, X2, Y2, Z2);
|
||||
|
||||
if (n == 0)
|
||||
return false;
|
||||
if (n == 0)
|
||||
return false;
|
||||
|
||||
int ns = 0;
|
||||
double min_reproj = 0;
|
||||
for(int i = 0; i < n; i++) {
|
||||
double X3p = Rs[i][0][0] * X3 + Rs[i][0][1] * Y3 + Rs[i][0][2] * Z3 + ts[i][0];
|
||||
double Y3p = Rs[i][1][0] * X3 + Rs[i][1][1] * Y3 + Rs[i][1][2] * Z3 + ts[i][1];
|
||||
double Z3p = Rs[i][2][0] * X3 + Rs[i][2][1] * Y3 + Rs[i][2][2] * Z3 + ts[i][2];
|
||||
double mu3p = cx + fx * X3p / Z3p;
|
||||
double mv3p = cy + fy * Y3p / Z3p;
|
||||
double reproj = (mu3p - mu3) * (mu3p - mu3) + (mv3p - mv3) * (mv3p - mv3);
|
||||
if (i == 0 || min_reproj > reproj) {
|
||||
ns = i;
|
||||
min_reproj = reproj;
|
||||
}
|
||||
}
|
||||
int ns = 0;
|
||||
double min_reproj = 0;
|
||||
for(int i = 0; i < n; i++) {
|
||||
double X3p = Rs[i][0][0] * X3 + Rs[i][0][1] * Y3 + Rs[i][0][2] * Z3 + ts[i][0];
|
||||
double Y3p = Rs[i][1][0] * X3 + Rs[i][1][1] * Y3 + Rs[i][1][2] * Z3 + ts[i][1];
|
||||
double Z3p = Rs[i][2][0] * X3 + Rs[i][2][1] * Y3 + Rs[i][2][2] * Z3 + ts[i][2];
|
||||
double mu3p = cx + fx * X3p / Z3p;
|
||||
double mv3p = cy + fy * Y3p / Z3p;
|
||||
double reproj = (mu3p - mu3) * (mu3p - mu3) + (mv3p - mv3) * (mv3p - mv3);
|
||||
if (i == 0 || min_reproj > reproj) {
|
||||
ns = i;
|
||||
min_reproj = reproj;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < 3; i++) {
|
||||
for(int j = 0; j < 3; j++)
|
||||
R[i][j] = Rs[ns][i][j];
|
||||
t[i] = ts[ns][i];
|
||||
}
|
||||
for(int i = 0; i < 3; i++) {
|
||||
for(int j = 0; j < 3; j++)
|
||||
R[i][j] = Rs[ns][i][j];
|
||||
t[i] = ts[ns][i];
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
int p3p::solve(double R[4][3][3], double t[4][3],
|
||||
double mu0, double mv0, double X0, double Y0, double Z0,
|
||||
double mu1, double mv1, double X1, double Y1, double Z1,
|
||||
double mu2, double mv2, double X2, double Y2, double Z2)
|
||||
double mu0, double mv0, double X0, double Y0, double Z0,
|
||||
double mu1, double mv1, double X1, double Y1, double Z1,
|
||||
double mu2, double mv2, double X2, double Y2, double Z2)
|
||||
{
|
||||
double mk0, mk1, mk2;
|
||||
double norm;
|
||||
double mk0, mk1, mk2;
|
||||
double norm;
|
||||
|
||||
mu0 = inv_fx * mu0 - cx_fx;
|
||||
mv0 = inv_fy * mv0 - cy_fy;
|
||||
norm = sqrt(mu0 * mu0 + mv0 * mv0 + 1);
|
||||
mk0 = 1. / norm; mu0 *= mk0; mv0 *= mk0;
|
||||
mu0 = inv_fx * mu0 - cx_fx;
|
||||
mv0 = inv_fy * mv0 - cy_fy;
|
||||
norm = sqrt(mu0 * mu0 + mv0 * mv0 + 1);
|
||||
mk0 = 1. / norm; mu0 *= mk0; mv0 *= mk0;
|
||||
|
||||
mu1 = inv_fx * mu1 - cx_fx;
|
||||
mv1 = inv_fy * mv1 - cy_fy;
|
||||
norm = sqrt(mu1 * mu1 + mv1 * mv1 + 1);
|
||||
mk1 = 1. / norm; mu1 *= mk1; mv1 *= mk1;
|
||||
mu1 = inv_fx * mu1 - cx_fx;
|
||||
mv1 = inv_fy * mv1 - cy_fy;
|
||||
norm = sqrt(mu1 * mu1 + mv1 * mv1 + 1);
|
||||
mk1 = 1. / norm; mu1 *= mk1; mv1 *= mk1;
|
||||
|
||||
mu2 = inv_fx * mu2 - cx_fx;
|
||||
mv2 = inv_fy * mv2 - cy_fy;
|
||||
norm = sqrt(mu2 * mu2 + mv2 * mv2 + 1);
|
||||
mk2 = 1. / norm; mu2 *= mk2; mv2 *= mk2;
|
||||
mu2 = inv_fx * mu2 - cx_fx;
|
||||
mv2 = inv_fy * mv2 - cy_fy;
|
||||
norm = sqrt(mu2 * mu2 + mv2 * mv2 + 1);
|
||||
mk2 = 1. / norm; mu2 *= mk2; mv2 *= mk2;
|
||||
|
||||
double distances[3];
|
||||
distances[0] = sqrt( (X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) * (Z1 - Z2) );
|
||||
distances[1] = sqrt( (X0 - X2) * (X0 - X2) + (Y0 - Y2) * (Y0 - Y2) + (Z0 - Z2) * (Z0 - Z2) );
|
||||
distances[2] = sqrt( (X0 - X1) * (X0 - X1) + (Y0 - Y1) * (Y0 - Y1) + (Z0 - Z1) * (Z0 - Z1) );
|
||||
double distances[3];
|
||||
distances[0] = sqrt( (X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2) + (Z1 - Z2) * (Z1 - Z2) );
|
||||
distances[1] = sqrt( (X0 - X2) * (X0 - X2) + (Y0 - Y2) * (Y0 - Y2) + (Z0 - Z2) * (Z0 - Z2) );
|
||||
distances[2] = sqrt( (X0 - X1) * (X0 - X1) + (Y0 - Y1) * (Y0 - Y1) + (Z0 - Z1) * (Z0 - Z1) );
|
||||
|
||||
// Calculate angles
|
||||
double cosines[3];
|
||||
cosines[0] = mu1 * mu2 + mv1 * mv2 + mk1 * mk2;
|
||||
cosines[1] = mu0 * mu2 + mv0 * mv2 + mk0 * mk2;
|
||||
cosines[2] = mu0 * mu1 + mv0 * mv1 + mk0 * mk1;
|
||||
// Calculate angles
|
||||
double cosines[3];
|
||||
cosines[0] = mu1 * mu2 + mv1 * mv2 + mk1 * mk2;
|
||||
cosines[1] = mu0 * mu2 + mv0 * mv2 + mk0 * mk2;
|
||||
cosines[2] = mu0 * mu1 + mv0 * mv1 + mk0 * mk1;
|
||||
|
||||
double lengths[4][3];
|
||||
int n = solve_for_lengths(lengths, distances, cosines);
|
||||
double lengths[4][3];
|
||||
int n = solve_for_lengths(lengths, distances, cosines);
|
||||
|
||||
int nb_solutions = 0;
|
||||
for(int i = 0; i < n; i++) {
|
||||
double M_orig[3][3];
|
||||
int nb_solutions = 0;
|
||||
for(int i = 0; i < n; i++) {
|
||||
double M_orig[3][3];
|
||||
|
||||
M_orig[0][0] = lengths[i][0] * mu0;
|
||||
M_orig[0][1] = lengths[i][0] * mv0;
|
||||
M_orig[0][2] = lengths[i][0] * mk0;
|
||||
M_orig[0][0] = lengths[i][0] * mu0;
|
||||
M_orig[0][1] = lengths[i][0] * mv0;
|
||||
M_orig[0][2] = lengths[i][0] * mk0;
|
||||
|
||||
M_orig[1][0] = lengths[i][1] * mu1;
|
||||
M_orig[1][1] = lengths[i][1] * mv1;
|
||||
M_orig[1][2] = lengths[i][1] * mk1;
|
||||
M_orig[1][0] = lengths[i][1] * mu1;
|
||||
M_orig[1][1] = lengths[i][1] * mv1;
|
||||
M_orig[1][2] = lengths[i][1] * mk1;
|
||||
|
||||
M_orig[2][0] = lengths[i][2] * mu2;
|
||||
M_orig[2][1] = lengths[i][2] * mv2;
|
||||
M_orig[2][2] = lengths[i][2] * mk2;
|
||||
M_orig[2][0] = lengths[i][2] * mu2;
|
||||
M_orig[2][1] = lengths[i][2] * mv2;
|
||||
M_orig[2][2] = lengths[i][2] * mk2;
|
||||
|
||||
if (!align(M_orig, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, R[nb_solutions], t[nb_solutions]))
|
||||
continue;
|
||||
if (!align(M_orig, X0, Y0, Z0, X1, Y1, Z1, X2, Y2, Z2, R[nb_solutions], t[nb_solutions]))
|
||||
continue;
|
||||
|
||||
nb_solutions++;
|
||||
}
|
||||
nb_solutions++;
|
||||
}
|
||||
|
||||
return nb_solutions;
|
||||
return nb_solutions;
|
||||
}
|
||||
|
||||
/// Given 3D distances between three points and cosines of 3 angles at the apex, calculates
|
||||
@ -170,247 +170,247 @@ int p3p::solve(double R[4][3][3], double t[4][3],
|
||||
|
||||
int p3p::solve_for_lengths(double lengths[4][3], double distances[3], double cosines[3])
|
||||
{
|
||||
double p = cosines[0] * 2;
|
||||
double q = cosines[1] * 2;
|
||||
double r = cosines[2] * 2;
|
||||
double p = cosines[0] * 2;
|
||||
double q = cosines[1] * 2;
|
||||
double r = cosines[2] * 2;
|
||||
|
||||
double inv_d22 = 1. / (distances[2] * distances[2]);
|
||||
double a = inv_d22 * (distances[0] * distances[0]);
|
||||
double b = inv_d22 * (distances[1] * distances[1]);
|
||||
double inv_d22 = 1. / (distances[2] * distances[2]);
|
||||
double a = inv_d22 * (distances[0] * distances[0]);
|
||||
double b = inv_d22 * (distances[1] * distances[1]);
|
||||
|
||||
double a2 = a * a, b2 = b * b, p2 = p * p, q2 = q * q, r2 = r * r;
|
||||
double pr = p * r, pqr = q * pr;
|
||||
double a2 = a * a, b2 = b * b, p2 = p * p, q2 = q * q, r2 = r * r;
|
||||
double pr = p * r, pqr = q * pr;
|
||||
|
||||
// Check reality condition (the four points should not be coplanar)
|
||||
if (p2 + q2 + r2 - pqr - 1 == 0)
|
||||
return 0;
|
||||
// Check reality condition (the four points should not be coplanar)
|
||||
if (p2 + q2 + r2 - pqr - 1 == 0)
|
||||
return 0;
|
||||
|
||||
double ab = a * b, a_2 = 2*a;
|
||||
double ab = a * b, a_2 = 2*a;
|
||||
|
||||
double A = -2 * b + b2 + a2 + 1 + ab*(2 - r2) - a_2;
|
||||
double A = -2 * b + b2 + a2 + 1 + ab*(2 - r2) - a_2;
|
||||
|
||||
// Check reality condition
|
||||
if (A == 0) return 0;
|
||||
// Check reality condition
|
||||
if (A == 0) return 0;
|
||||
|
||||
double a_4 = 4*a;
|
||||
double a_4 = 4*a;
|
||||
|
||||
double B = q*(-2*(ab + a2 + 1 - b) + r2*ab + a_4) + pr*(b - b2 + ab);
|
||||
double C = q2 + b2*(r2 + p2 - 2) - b*(p2 + pqr) - ab*(r2 + pqr) + (a2 - a_2)*(2 + q2) + 2;
|
||||
double D = pr*(ab-b2+b) + q*((p2-2)*b + 2 * (ab - a2) + a_4 - 2);
|
||||
double E = 1 + 2*(b - a - ab) + b2 - b*p2 + a2;
|
||||
double B = q*(-2*(ab + a2 + 1 - b) + r2*ab + a_4) + pr*(b - b2 + ab);
|
||||
double C = q2 + b2*(r2 + p2 - 2) - b*(p2 + pqr) - ab*(r2 + pqr) + (a2 - a_2)*(2 + q2) + 2;
|
||||
double D = pr*(ab-b2+b) + q*((p2-2)*b + 2 * (ab - a2) + a_4 - 2);
|
||||
double E = 1 + 2*(b - a - ab) + b2 - b*p2 + a2;
|
||||
|
||||
double temp = (p2*(a-1+b) + r2*(a-1-b) + pqr - a*pqr);
|
||||
double b0 = b * temp * temp;
|
||||
// Check reality condition
|
||||
if (b0 == 0)
|
||||
return 0;
|
||||
double temp = (p2*(a-1+b) + r2*(a-1-b) + pqr - a*pqr);
|
||||
double b0 = b * temp * temp;
|
||||
// Check reality condition
|
||||
if (b0 == 0)
|
||||
return 0;
|
||||
|
||||
double real_roots[4];
|
||||
int n = solve_deg4(A, B, C, D, E, real_roots[0], real_roots[1], real_roots[2], real_roots[3]);
|
||||
double real_roots[4];
|
||||
int n = solve_deg4(A, B, C, D, E, real_roots[0], real_roots[1], real_roots[2], real_roots[3]);
|
||||
|
||||
if (n == 0)
|
||||
return 0;
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
int nb_solutions = 0;
|
||||
double r3 = r2*r, pr2 = p*r2, r3q = r3 * q;
|
||||
double inv_b0 = 1. / b0;
|
||||
int nb_solutions = 0;
|
||||
double r3 = r2*r, pr2 = p*r2, r3q = r3 * q;
|
||||
double inv_b0 = 1. / b0;
|
||||
|
||||
// For each solution of x
|
||||
for(int i = 0; i < n; i++) {
|
||||
double x = real_roots[i];
|
||||
// For each solution of x
|
||||
for(int i = 0; i < n; i++) {
|
||||
double x = real_roots[i];
|
||||
|
||||
// Check reality condition
|
||||
if (x <= 0)
|
||||
continue;
|
||||
// Check reality condition
|
||||
if (x <= 0)
|
||||
continue;
|
||||
|
||||
double x2 = x*x;
|
||||
double x2 = x*x;
|
||||
|
||||
double b1 =
|
||||
((1-a-b)*x2 + (q*a-q)*x + 1 - a + b) *
|
||||
(((r3*(a2 + ab*(2 - r2) - a_2 + b2 - 2*b + 1)) * x +
|
||||
double b1 =
|
||||
((1-a-b)*x2 + (q*a-q)*x + 1 - a + b) *
|
||||
(((r3*(a2 + ab*(2 - r2) - a_2 + b2 - 2*b + 1)) * x +
|
||||
|
||||
(r3q*(2*(b-a2) + a_4 + ab*(r2 - 2) - 2) + pr2*(1 + a2 + 2*(ab-a-b) + r2*(b - b2) + b2))) * x2 +
|
||||
(r3q*(2*(b-a2) + a_4 + ab*(r2 - 2) - 2) + pr2*(1 + a2 + 2*(ab-a-b) + r2*(b - b2) + b2))) * x2 +
|
||||
|
||||
(r3*(q2*(1-2*a+a2) + r2*(b2-ab) - a_4 + 2*(a2 - b2) + 2) + r*p2*(b2 + 2*(ab - b - a) + 1 + a2) + pr2*q*(a_4 + 2*(b - ab - a2) - 2 - r2*b)) * x +
|
||||
(r3*(q2*(1-2*a+a2) + r2*(b2-ab) - a_4 + 2*(a2 - b2) + 2) + r*p2*(b2 + 2*(ab - b - a) + 1 + a2) + pr2*q*(a_4 + 2*(b - ab - a2) - 2 - r2*b)) * x +
|
||||
|
||||
2*r3q*(a_2 - b - a2 + ab - 1) + pr2*(q2 - a_4 + 2*(a2 - b2) + r2*b + q2*(a2 - a_2) + 2) +
|
||||
p2*(p*(2*(ab - a - b) + a2 + b2 + 1) + 2*q*r*(b + a_2 - a2 - ab - 1)));
|
||||
2*r3q*(a_2 - b - a2 + ab - 1) + pr2*(q2 - a_4 + 2*(a2 - b2) + r2*b + q2*(a2 - a_2) + 2) +
|
||||
p2*(p*(2*(ab - a - b) + a2 + b2 + 1) + 2*q*r*(b + a_2 - a2 - ab - 1)));
|
||||
|
||||
// Check reality condition
|
||||
if (b1 <= 0)
|
||||
continue;
|
||||
// Check reality condition
|
||||
if (b1 <= 0)
|
||||
continue;
|
||||
|
||||
double y = inv_b0 * b1;
|
||||
double v = x2 + y*y - x*y*r;
|
||||
double y = inv_b0 * b1;
|
||||
double v = x2 + y*y - x*y*r;
|
||||
|
||||
if (v <= 0)
|
||||
continue;
|
||||
if (v <= 0)
|
||||
continue;
|
||||
|
||||
double Z = distances[2] / sqrt(v);
|
||||
double X = x * Z;
|
||||
double Y = y * Z;
|
||||
double Z = distances[2] / sqrt(v);
|
||||
double X = x * Z;
|
||||
double Y = y * Z;
|
||||
|
||||
lengths[nb_solutions][0] = X;
|
||||
lengths[nb_solutions][1] = Y;
|
||||
lengths[nb_solutions][2] = Z;
|
||||
lengths[nb_solutions][0] = X;
|
||||
lengths[nb_solutions][1] = Y;
|
||||
lengths[nb_solutions][2] = Z;
|
||||
|
||||
nb_solutions++;
|
||||
}
|
||||
nb_solutions++;
|
||||
}
|
||||
|
||||
return nb_solutions;
|
||||
return nb_solutions;
|
||||
}
|
||||
|
||||
bool p3p::align(double M_end[3][3],
|
||||
double X0, double Y0, double Z0,
|
||||
double X1, double Y1, double Z1,
|
||||
double X2, double Y2, double Z2,
|
||||
double R[3][3], double T[3])
|
||||
double X0, double Y0, double Z0,
|
||||
double X1, double Y1, double Z1,
|
||||
double X2, double Y2, double Z2,
|
||||
double R[3][3], double T[3])
|
||||
{
|
||||
// Centroids:
|
||||
double C_start[3], C_end[3];
|
||||
for(int i = 0; i < 3; i++) C_end[i] = (M_end[0][i] + M_end[1][i] + M_end[2][i]) / 3;
|
||||
C_start[0] = (X0 + X1 + X2) / 3;
|
||||
C_start[1] = (Y0 + Y1 + Y2) / 3;
|
||||
C_start[2] = (Z0 + Z1 + Z2) / 3;
|
||||
// Centroids:
|
||||
double C_start[3], C_end[3];
|
||||
for(int i = 0; i < 3; i++) C_end[i] = (M_end[0][i] + M_end[1][i] + M_end[2][i]) / 3;
|
||||
C_start[0] = (X0 + X1 + X2) / 3;
|
||||
C_start[1] = (Y0 + Y1 + Y2) / 3;
|
||||
C_start[2] = (Z0 + Z1 + Z2) / 3;
|
||||
|
||||
// Covariance matrix s:
|
||||
double s[3 * 3];
|
||||
for(int j = 0; j < 3; j++) {
|
||||
s[0 * 3 + j] = (X0 * M_end[0][j] + X1 * M_end[1][j] + X2 * M_end[2][j]) / 3 - C_end[j] * C_start[0];
|
||||
s[1 * 3 + j] = (Y0 * M_end[0][j] + Y1 * M_end[1][j] + Y2 * M_end[2][j]) / 3 - C_end[j] * C_start[1];
|
||||
s[2 * 3 + j] = (Z0 * M_end[0][j] + Z1 * M_end[1][j] + Z2 * M_end[2][j]) / 3 - C_end[j] * C_start[2];
|
||||
}
|
||||
// Covariance matrix s:
|
||||
double s[3 * 3];
|
||||
for(int j = 0; j < 3; j++) {
|
||||
s[0 * 3 + j] = (X0 * M_end[0][j] + X1 * M_end[1][j] + X2 * M_end[2][j]) / 3 - C_end[j] * C_start[0];
|
||||
s[1 * 3 + j] = (Y0 * M_end[0][j] + Y1 * M_end[1][j] + Y2 * M_end[2][j]) / 3 - C_end[j] * C_start[1];
|
||||
s[2 * 3 + j] = (Z0 * M_end[0][j] + Z1 * M_end[1][j] + Z2 * M_end[2][j]) / 3 - C_end[j] * C_start[2];
|
||||
}
|
||||
|
||||
double Qs[16], evs[4], U[16];
|
||||
double Qs[16], evs[4], U[16];
|
||||
|
||||
Qs[0 * 4 + 0] = s[0 * 3 + 0] + s[1 * 3 + 1] + s[2 * 3 + 2];
|
||||
Qs[1 * 4 + 1] = s[0 * 3 + 0] - s[1 * 3 + 1] - s[2 * 3 + 2];
|
||||
Qs[2 * 4 + 2] = s[1 * 3 + 1] - s[2 * 3 + 2] - s[0 * 3 + 0];
|
||||
Qs[3 * 4 + 3] = s[2 * 3 + 2] - s[0 * 3 + 0] - s[1 * 3 + 1];
|
||||
Qs[0 * 4 + 0] = s[0 * 3 + 0] + s[1 * 3 + 1] + s[2 * 3 + 2];
|
||||
Qs[1 * 4 + 1] = s[0 * 3 + 0] - s[1 * 3 + 1] - s[2 * 3 + 2];
|
||||
Qs[2 * 4 + 2] = s[1 * 3 + 1] - s[2 * 3 + 2] - s[0 * 3 + 0];
|
||||
Qs[3 * 4 + 3] = s[2 * 3 + 2] - s[0 * 3 + 0] - s[1 * 3 + 1];
|
||||
|
||||
Qs[1 * 4 + 0] = Qs[0 * 4 + 1] = s[1 * 3 + 2] - s[2 * 3 + 1];
|
||||
Qs[2 * 4 + 0] = Qs[0 * 4 + 2] = s[2 * 3 + 0] - s[0 * 3 + 2];
|
||||
Qs[3 * 4 + 0] = Qs[0 * 4 + 3] = s[0 * 3 + 1] - s[1 * 3 + 0];
|
||||
Qs[2 * 4 + 1] = Qs[1 * 4 + 2] = s[1 * 3 + 0] + s[0 * 3 + 1];
|
||||
Qs[3 * 4 + 1] = Qs[1 * 4 + 3] = s[2 * 3 + 0] + s[0 * 3 + 2];
|
||||
Qs[3 * 4 + 2] = Qs[2 * 4 + 3] = s[2 * 3 + 1] + s[1 * 3 + 2];
|
||||
Qs[1 * 4 + 0] = Qs[0 * 4 + 1] = s[1 * 3 + 2] - s[2 * 3 + 1];
|
||||
Qs[2 * 4 + 0] = Qs[0 * 4 + 2] = s[2 * 3 + 0] - s[0 * 3 + 2];
|
||||
Qs[3 * 4 + 0] = Qs[0 * 4 + 3] = s[0 * 3 + 1] - s[1 * 3 + 0];
|
||||
Qs[2 * 4 + 1] = Qs[1 * 4 + 2] = s[1 * 3 + 0] + s[0 * 3 + 1];
|
||||
Qs[3 * 4 + 1] = Qs[1 * 4 + 3] = s[2 * 3 + 0] + s[0 * 3 + 2];
|
||||
Qs[3 * 4 + 2] = Qs[2 * 4 + 3] = s[2 * 3 + 1] + s[1 * 3 + 2];
|
||||
|
||||
jacobi_4x4(Qs, evs, U);
|
||||
jacobi_4x4(Qs, evs, U);
|
||||
|
||||
// Looking for the largest eigen value:
|
||||
int i_ev = 0;
|
||||
double ev_max = evs[i_ev];
|
||||
for(int i = 1; i < 4; i++)
|
||||
if (evs[i] > ev_max)
|
||||
ev_max = evs[i_ev = i];
|
||||
// Looking for the largest eigen value:
|
||||
int i_ev = 0;
|
||||
double ev_max = evs[i_ev];
|
||||
for(int i = 1; i < 4; i++)
|
||||
if (evs[i] > ev_max)
|
||||
ev_max = evs[i_ev = i];
|
||||
|
||||
// Quaternion:
|
||||
double q[4];
|
||||
for(int i = 0; i < 4; i++)
|
||||
q[i] = U[i * 4 + i_ev];
|
||||
// Quaternion:
|
||||
double q[4];
|
||||
for(int i = 0; i < 4; i++)
|
||||
q[i] = U[i * 4 + i_ev];
|
||||
|
||||
double q02 = q[0] * q[0], q12 = q[1] * q[1], q22 = q[2] * q[2], q32 = q[3] * q[3];
|
||||
double q0_1 = q[0] * q[1], q0_2 = q[0] * q[2], q0_3 = q[0] * q[3];
|
||||
double q1_2 = q[1] * q[2], q1_3 = q[1] * q[3];
|
||||
double q2_3 = q[2] * q[3];
|
||||
double q02 = q[0] * q[0], q12 = q[1] * q[1], q22 = q[2] * q[2], q32 = q[3] * q[3];
|
||||
double q0_1 = q[0] * q[1], q0_2 = q[0] * q[2], q0_3 = q[0] * q[3];
|
||||
double q1_2 = q[1] * q[2], q1_3 = q[1] * q[3];
|
||||
double q2_3 = q[2] * q[3];
|
||||
|
||||
R[0][0] = q02 + q12 - q22 - q32;
|
||||
R[0][1] = 2. * (q1_2 - q0_3);
|
||||
R[0][2] = 2. * (q1_3 + q0_2);
|
||||
R[0][0] = q02 + q12 - q22 - q32;
|
||||
R[0][1] = 2. * (q1_2 - q0_3);
|
||||
R[0][2] = 2. * (q1_3 + q0_2);
|
||||
|
||||
R[1][0] = 2. * (q1_2 + q0_3);
|
||||
R[1][1] = q02 + q22 - q12 - q32;
|
||||
R[1][2] = 2. * (q2_3 - q0_1);
|
||||
R[1][0] = 2. * (q1_2 + q0_3);
|
||||
R[1][1] = q02 + q22 - q12 - q32;
|
||||
R[1][2] = 2. * (q2_3 - q0_1);
|
||||
|
||||
R[2][0] = 2. * (q1_3 - q0_2);
|
||||
R[2][1] = 2. * (q2_3 + q0_1);
|
||||
R[2][2] = q02 + q32 - q12 - q22;
|
||||
R[2][0] = 2. * (q1_3 - q0_2);
|
||||
R[2][1] = 2. * (q2_3 + q0_1);
|
||||
R[2][2] = q02 + q32 - q12 - q22;
|
||||
|
||||
for(int i = 0; i < 3; i++)
|
||||
T[i] = C_end[i] - (R[i][0] * C_start[0] + R[i][1] * C_start[1] + R[i][2] * C_start[2]);
|
||||
for(int i = 0; i < 3; i++)
|
||||
T[i] = C_end[i] - (R[i][0] * C_start[0] + R[i][1] * C_start[1] + R[i][2] * C_start[2]);
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool p3p::jacobi_4x4(double * A, double * D, double * U)
|
||||
{
|
||||
double B[4], Z[4];
|
||||
double Id[16] = {1., 0., 0., 0.,
|
||||
0., 1., 0., 0.,
|
||||
0., 0., 1., 0.,
|
||||
0., 0., 0., 1.};
|
||||
double B[4], Z[4];
|
||||
double Id[16] = {1., 0., 0., 0.,
|
||||
0., 1., 0., 0.,
|
||||
0., 0., 1., 0.,
|
||||
0., 0., 0., 1.};
|
||||
|
||||
memcpy(U, Id, 16 * sizeof(double));
|
||||
memcpy(U, Id, 16 * sizeof(double));
|
||||
|
||||
B[0] = A[0]; B[1] = A[5]; B[2] = A[10]; B[3] = A[15];
|
||||
memcpy(D, B, 4 * sizeof(double));
|
||||
memset(Z, 0, 4 * sizeof(double));
|
||||
B[0] = A[0]; B[1] = A[5]; B[2] = A[10]; B[3] = A[15];
|
||||
memcpy(D, B, 4 * sizeof(double));
|
||||
memset(Z, 0, 4 * sizeof(double));
|
||||
|
||||
for(int iter = 0; iter < 50; iter++) {
|
||||
double sum = fabs(A[1]) + fabs(A[2]) + fabs(A[3]) + fabs(A[6]) + fabs(A[7]) + fabs(A[11]);
|
||||
for(int iter = 0; iter < 50; iter++) {
|
||||
double sum = fabs(A[1]) + fabs(A[2]) + fabs(A[3]) + fabs(A[6]) + fabs(A[7]) + fabs(A[11]);
|
||||
|
||||
if (sum == 0.0)
|
||||
return true;
|
||||
if (sum == 0.0)
|
||||
return true;
|
||||
|
||||
double tresh = (iter < 3) ? 0.2 * sum / 16. : 0.0;
|
||||
for(int i = 0; i < 3; i++) {
|
||||
double * pAij = A + 5 * i + 1;
|
||||
for(int j = i + 1 ; j < 4; j++) {
|
||||
double Aij = *pAij;
|
||||
double eps_machine = 100.0 * fabs(Aij);
|
||||
double tresh = (iter < 3) ? 0.2 * sum / 16. : 0.0;
|
||||
for(int i = 0; i < 3; i++) {
|
||||
double * pAij = A + 5 * i + 1;
|
||||
for(int j = i + 1 ; j < 4; j++) {
|
||||
double Aij = *pAij;
|
||||
double eps_machine = 100.0 * fabs(Aij);
|
||||
|
||||
if ( iter > 3 && fabs(D[i]) + eps_machine == fabs(D[i]) && fabs(D[j]) + eps_machine == fabs(D[j]) )
|
||||
*pAij = 0.0;
|
||||
else if (fabs(Aij) > tresh) {
|
||||
double h = D[j] - D[i], t;
|
||||
if (fabs(h) + eps_machine == fabs(h))
|
||||
t = Aij / h;
|
||||
else {
|
||||
double theta = 0.5 * h / Aij;
|
||||
t = 1.0 / (fabs(theta) + sqrt(1.0 + theta * theta));
|
||||
if (theta < 0.0) t = -t;
|
||||
}
|
||||
if ( iter > 3 && fabs(D[i]) + eps_machine == fabs(D[i]) && fabs(D[j]) + eps_machine == fabs(D[j]) )
|
||||
*pAij = 0.0;
|
||||
else if (fabs(Aij) > tresh) {
|
||||
double hh = D[j] - D[i], t;
|
||||
if (fabs(hh) + eps_machine == fabs(hh))
|
||||
t = Aij / hh;
|
||||
else {
|
||||
double theta = 0.5 * hh / Aij;
|
||||
t = 1.0 / (fabs(theta) + sqrt(1.0 + theta * theta));
|
||||
if (theta < 0.0) t = -t;
|
||||
}
|
||||
|
||||
h = t * Aij;
|
||||
Z[i] -= h;
|
||||
Z[j] += h;
|
||||
D[i] -= h;
|
||||
D[j] += h;
|
||||
*pAij = 0.0;
|
||||
hh = t * Aij;
|
||||
Z[i] -= hh;
|
||||
Z[j] += hh;
|
||||
D[i] -= hh;
|
||||
D[j] += hh;
|
||||
*pAij = 0.0;
|
||||
|
||||
double c = 1.0 / sqrt(1 + t * t);
|
||||
double s = t * c;
|
||||
double tau = s / (1.0 + c);
|
||||
for(int k = 0; k <= i - 1; k++) {
|
||||
double g = A[k * 4 + i], h = A[k * 4 + j];
|
||||
A[k * 4 + i] = g - s * (h + g * tau);
|
||||
A[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = i + 1; k <= j - 1; k++) {
|
||||
double g = A[i * 4 + k], h = A[k * 4 + j];
|
||||
A[i * 4 + k] = g - s * (h + g * tau);
|
||||
A[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = j + 1; k < 4; k++) {
|
||||
double g = A[i * 4 + k], h = A[j * 4 + k];
|
||||
A[i * 4 + k] = g - s * (h + g * tau);
|
||||
A[j * 4 + k] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = 0; k < 4; k++) {
|
||||
double g = U[k * 4 + i], h = U[k * 4 + j];
|
||||
U[k * 4 + i] = g - s * (h + g * tau);
|
||||
U[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
}
|
||||
pAij++;
|
||||
}
|
||||
}
|
||||
double c = 1.0 / sqrt(1 + t * t);
|
||||
double s = t * c;
|
||||
double tau = s / (1.0 + c);
|
||||
for(int k = 0; k <= i - 1; k++) {
|
||||
double g = A[k * 4 + i], h = A[k * 4 + j];
|
||||
A[k * 4 + i] = g - s * (h + g * tau);
|
||||
A[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = i + 1; k <= j - 1; k++) {
|
||||
double g = A[i * 4 + k], h = A[k * 4 + j];
|
||||
A[i * 4 + k] = g - s * (h + g * tau);
|
||||
A[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = j + 1; k < 4; k++) {
|
||||
double g = A[i * 4 + k], h = A[j * 4 + k];
|
||||
A[i * 4 + k] = g - s * (h + g * tau);
|
||||
A[j * 4 + k] = h + s * (g - h * tau);
|
||||
}
|
||||
for(int k = 0; k < 4; k++) {
|
||||
double g = U[k * 4 + i], h = U[k * 4 + j];
|
||||
U[k * 4 + i] = g - s * (h + g * tau);
|
||||
U[k * 4 + j] = h + s * (g - h * tau);
|
||||
}
|
||||
}
|
||||
pAij++;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i = 0; i < 4; i++) B[i] += Z[i];
|
||||
memcpy(D, B, 4 * sizeof(double));
|
||||
memset(Z, 0, 4 * sizeof(double));
|
||||
}
|
||||
for(int i = 0; i < 4; i++) B[i] += Z[i];
|
||||
memcpy(D, B, 4 * sizeof(double));
|
||||
memset(Z, 0, 4 * sizeof(double));
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -253,10 +253,10 @@ namespace cv
|
||||
}
|
||||
}
|
||||
}
|
||||
PnPSolver(const Mat& objectPoints, const Mat& imagePoints, const Parameters& parameters,
|
||||
Mat& rvec, Mat& tvec, vector<int>& inliers):
|
||||
objectPoints(objectPoints), imagePoints(imagePoints), parameters(parameters),
|
||||
rvec(rvec), tvec(tvec), inliers(inliers)
|
||||
PnPSolver(const Mat& _objectPoints, const Mat& _imagePoints, const Parameters& _parameters,
|
||||
Mat& _rvec, Mat& _tvec, vector<int>& _inliers):
|
||||
objectPoints(_objectPoints), imagePoints(_imagePoints), parameters(_parameters),
|
||||
rvec(_rvec), tvec(_tvec), inliers(_inliers)
|
||||
{
|
||||
rvec.copyTo(initRvec);
|
||||
tvec.copyTo(initTvec);
|
||||
|
@ -155,7 +155,7 @@ static void prefilterNorm( const Mat& src, Mat& dst, int winsize, int ftzero, uc
|
||||
val = ((curr[x]*4 + curr[x-1] + curr[x+1] + prev[x] + next[x])*scale_g - sum*scale_s) >> 10;
|
||||
dptr[x] = tab[val + OFS];
|
||||
}
|
||||
|
||||
|
||||
sum += vsum[x+wsz2] - vsum[x-wsz2-1];
|
||||
val = ((curr[x]*5 + curr[x-1] + prev[x] + next[x])*scale_g - sum*scale_s) >> 10;
|
||||
dptr[x] = tab[val + OFS];
|
||||
@ -170,15 +170,15 @@ prefilterXSobel( const Mat& src, Mat& dst, int ftzero )
|
||||
const int OFS = 256*4, TABSZ = OFS*2 + 256;
|
||||
uchar tab[TABSZ];
|
||||
Size size = src.size();
|
||||
|
||||
|
||||
for( x = 0; x < TABSZ; x++ )
|
||||
tab[x] = (uchar)(x - OFS < -ftzero ? 0 : x - OFS > ftzero ? ftzero*2 : x - OFS + ftzero);
|
||||
uchar val0 = tab[0 + OFS];
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
volatile bool useSIMD = checkHardwareSupport(CV_CPU_SSE2);
|
||||
#endif
|
||||
|
||||
|
||||
for( y = 0; y < size.height-1; y += 2 )
|
||||
{
|
||||
const uchar* srow1 = src.ptr<uchar>(y);
|
||||
@ -187,10 +187,10 @@ prefilterXSobel( const Mat& src, Mat& dst, int ftzero )
|
||||
const uchar* srow3 = y < size.height-2 ? srow1 + src.step*2 : srow1;
|
||||
uchar* dptr0 = dst.ptr<uchar>(y);
|
||||
uchar* dptr1 = dptr0 + dst.step;
|
||||
|
||||
|
||||
dptr0[0] = dptr0[size.width-1] = dptr1[0] = dptr1[size.width-1] = val0;
|
||||
x = 1;
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
@ -205,26 +205,26 @@ prefilterXSobel( const Mat& src, Mat& dst, int ftzero )
|
||||
|
||||
d0 = _mm_sub_epi16(d0, c0);
|
||||
d1 = _mm_sub_epi16(d1, c1);
|
||||
|
||||
|
||||
__m128i c2 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(srow2 + x - 1)), z);
|
||||
__m128i c3 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(srow2 + x - 1)), z);
|
||||
__m128i d2 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(srow2 + x + 1)), z);
|
||||
__m128i d3 = _mm_unpacklo_epi8(_mm_loadl_epi64((__m128i*)(srow2 + x + 1)), z);
|
||||
|
||||
|
||||
d2 = _mm_sub_epi16(d2, c2);
|
||||
d3 = _mm_sub_epi16(d3, c3);
|
||||
|
||||
|
||||
__m128i v0 = _mm_add_epi16(d0, _mm_add_epi16(d2, _mm_add_epi16(d1, d1)));
|
||||
__m128i v1 = _mm_add_epi16(d1, _mm_add_epi16(d3, _mm_add_epi16(d2, d2)));
|
||||
v0 = _mm_packus_epi16(_mm_add_epi16(v0, ftz), _mm_add_epi16(v1, ftz));
|
||||
v0 = _mm_min_epu8(v0, ftz2);
|
||||
|
||||
|
||||
_mm_storel_epi64((__m128i*)(dptr0 + x), v0);
|
||||
_mm_storel_epi64((__m128i*)(dptr1 + x), _mm_unpackhi_epi64(v0, v0));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
for( ; x < size.width-1; x++ )
|
||||
{
|
||||
int d0 = srow0[x+1] - srow0[x-1], d1 = srow1[x+1] - srow1[x-1],
|
||||
@ -235,7 +235,7 @@ prefilterXSobel( const Mat& src, Mat& dst, int ftzero )
|
||||
dptr1[x] = (uchar)v1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( ; y < size.height; y++ )
|
||||
{
|
||||
uchar* dptr = dst.ptr<uchar>(y);
|
||||
@ -336,7 +336,7 @@ static void findStereoCorrespondenceBM_SSE2( const Mat& left, const Mat& right,
|
||||
short* costptr = cost.data ? (short*)cost.data + lofs + x : &costbuf;
|
||||
int x0 = x - wsz2 - 1, x1 = x + wsz2;
|
||||
const uchar* cbuf_sub = cbuf0 + ((x0 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
uchar* cbuf = cbuf0 + ((x1 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
cbuf = cbuf0 + ((x1 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
hsad = hsad0 - dy0*ndisp;
|
||||
lptr_sub = lptr0 + MIN(MAX(x0, -lofs), width-1-lofs) - dy0*sstep;
|
||||
lptr = lptr0 + MIN(MAX(x1, -lofs), width-1-lofs) - dy0*sstep;
|
||||
@ -374,7 +374,7 @@ static void findStereoCorrespondenceBM_SSE2( const Mat& left, const Mat& right,
|
||||
// initialize sums
|
||||
for( d = 0; d < ndisp; d++ )
|
||||
sad[d] = (ushort)(hsad0[d-ndisp*dy0]*(wsz2 + 2 - dy0));
|
||||
|
||||
|
||||
hsad = hsad0 + (1 - dy0)*ndisp;
|
||||
for( y = 1 - dy0; y < wsz2; y++, hsad += ndisp )
|
||||
for( d = 0; d < ndisp; d += 16 )
|
||||
@ -405,28 +405,28 @@ static void findStereoCorrespondenceBM_SSE2( const Mat& left, const Mat& right,
|
||||
{
|
||||
__m128i u0 = _mm_load_si128((__m128i*)(hsad_sub + d));
|
||||
__m128i u1 = _mm_load_si128((__m128i*)(hsad + d));
|
||||
|
||||
|
||||
__m128i v0 = _mm_load_si128((__m128i*)(hsad_sub + d + 8));
|
||||
__m128i v1 = _mm_load_si128((__m128i*)(hsad + d + 8));
|
||||
|
||||
|
||||
__m128i usad8 = _mm_load_si128((__m128i*)(sad + d));
|
||||
__m128i vsad8 = _mm_load_si128((__m128i*)(sad + d + 8));
|
||||
|
||||
|
||||
u1 = _mm_sub_epi16(u1, u0);
|
||||
v1 = _mm_sub_epi16(v1, v0);
|
||||
usad8 = _mm_add_epi16(usad8, u1);
|
||||
vsad8 = _mm_add_epi16(vsad8, v1);
|
||||
|
||||
|
||||
mask = _mm_cmpgt_epi16(minsad8, usad8);
|
||||
minsad8 = _mm_min_epi16(minsad8, usad8);
|
||||
mind8 = _mm_max_epi16(mind8, _mm_and_si128(mask, d8));
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(sad + d), usad8);
|
||||
_mm_store_si128((__m128i*)(sad + d + 8), vsad8);
|
||||
|
||||
|
||||
mask = _mm_cmpgt_epi16(minsad8, vsad8);
|
||||
minsad8 = _mm_min_epi16(minsad8, vsad8);
|
||||
|
||||
|
||||
d8 = _mm_add_epi16(d8, dd_8);
|
||||
mind8 = _mm_max_epi16(mind8, _mm_and_si128(mask, d8));
|
||||
d8 = _mm_add_epi16(d8, dd_8);
|
||||
@ -438,32 +438,33 @@ static void findStereoCorrespondenceBM_SSE2( const Mat& left, const Mat& right,
|
||||
dptr[y*dstep] = FILTERED;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
__m128i minsad82 = _mm_unpackhi_epi64(minsad8, minsad8);
|
||||
__m128i mind82 = _mm_unpackhi_epi64(mind8, mind8);
|
||||
mask = _mm_cmpgt_epi16(minsad8, minsad82);
|
||||
mind8 = _mm_xor_si128(mind8,_mm_and_si128(_mm_xor_si128(mind82,mind8),mask));
|
||||
minsad8 = _mm_min_epi16(minsad8, minsad82);
|
||||
|
||||
|
||||
minsad82 = _mm_shufflelo_epi16(minsad8, _MM_SHUFFLE(3,2,3,2));
|
||||
mind82 = _mm_shufflelo_epi16(mind8, _MM_SHUFFLE(3,2,3,2));
|
||||
mask = _mm_cmpgt_epi16(minsad8, minsad82);
|
||||
mind8 = _mm_xor_si128(mind8,_mm_and_si128(_mm_xor_si128(mind82,mind8),mask));
|
||||
minsad8 = _mm_min_epi16(minsad8, minsad82);
|
||||
|
||||
|
||||
minsad82 = _mm_shufflelo_epi16(minsad8, 1);
|
||||
mind82 = _mm_shufflelo_epi16(mind8, 1);
|
||||
mask = _mm_cmpgt_epi16(minsad8, minsad82);
|
||||
mind8 = _mm_xor_si128(mind8,_mm_and_si128(_mm_xor_si128(mind82,mind8),mask));
|
||||
mind = (short)_mm_cvtsi128_si32(mind8);
|
||||
minsad = sad[mind];
|
||||
|
||||
|
||||
if( uniquenessRatio > 0 )
|
||||
{
|
||||
int thresh = minsad + ((minsad * uniquenessRatio) >> 8);
|
||||
__m128i thresh8 = _mm_set1_epi16((short)(thresh + 1));
|
||||
__m128i d1 = _mm_set1_epi16((short)(mind-1)), d2 = _mm_set1_epi16((short)(mind+1));
|
||||
__m128i dd_16 = _mm_add_epi16(dd_8, dd_8), d8 = _mm_sub_epi16(d0_8, dd_16);
|
||||
__m128i dd_16 = _mm_add_epi16(dd_8, dd_8);
|
||||
d8 = _mm_sub_epi16(d0_8, dd_16);
|
||||
|
||||
for( d = 0; d < ndisp; d += 16 )
|
||||
{
|
||||
@ -492,7 +493,8 @@ static void findStereoCorrespondenceBM_SSE2( const Mat& left, const Mat& right,
|
||||
|
||||
if( 0 < mind && mind < ndisp - 1 )
|
||||
{
|
||||
int p = sad[mind+1], n = sad[mind-1], d = p + n - 2*sad[mind] + std::abs(p - n);
|
||||
int p = sad[mind+1], n = sad[mind-1];
|
||||
d = p + n - 2*sad[mind] + std::abs(p - n);
|
||||
dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*256/d : 0) + 15) >> 4);
|
||||
}
|
||||
else
|
||||
@ -567,7 +569,7 @@ findStereoCorrespondenceBM( const Mat& left, const Mat& right,
|
||||
htext[y] += tab[lval];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// initialize the left and right borders of the disparity map
|
||||
for( y = 0; y < height; y++ )
|
||||
{
|
||||
@ -583,7 +585,7 @@ findStereoCorrespondenceBM( const Mat& left, const Mat& right,
|
||||
int* costptr = cost.data ? (int*)cost.data + lofs + x : &costbuf;
|
||||
int x0 = x - wsz2 - 1, x1 = x + wsz2;
|
||||
const uchar* cbuf_sub = cbuf0 + ((x0 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
uchar* cbuf = cbuf0 + ((x1 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
cbuf = cbuf0 + ((x1 + wsz2 + 1) % (wsz + 1))*cstep - dy0*ndisp;
|
||||
hsad = hsad0 - dy0*ndisp;
|
||||
lptr_sub = lptr0 + MIN(MAX(x0, -lofs), width-1-lofs) - dy0*sstep;
|
||||
lptr = lptr0 + MIN(MAX(x1, -lofs), width-1-lofs) - dy0*sstep;
|
||||
@ -611,7 +613,7 @@ findStereoCorrespondenceBM( const Mat& left, const Mat& right,
|
||||
// initialize sums
|
||||
for( d = 0; d < ndisp; d++ )
|
||||
sad[d] = (int)(hsad0[d-ndisp*dy0]*(wsz2 + 2 - dy0));
|
||||
|
||||
|
||||
hsad = hsad0 + (1 - dy0)*ndisp;
|
||||
for( y = 1 - dy0; y < wsz2; y++, hsad += ndisp )
|
||||
for( d = 0; d < ndisp; d++ )
|
||||
@ -662,7 +664,8 @@ findStereoCorrespondenceBM( const Mat& left, const Mat& right,
|
||||
{
|
||||
sad[-1] = sad[1];
|
||||
sad[ndisp] = sad[ndisp-2];
|
||||
int p = sad[mind+1], n = sad[mind-1], d = p + n - 2*sad[mind] + std::abs(p - n);
|
||||
int p = sad[mind+1], n = sad[mind-1];
|
||||
d = p + n - 2*sad[mind] + std::abs(p - n);
|
||||
dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*256/d : 0) + 15) >> 4);
|
||||
costptr[y*coststep] = sad[mind];
|
||||
}
|
||||
@ -681,16 +684,16 @@ struct PrefilterInvoker
|
||||
state = _state;
|
||||
}
|
||||
|
||||
void operator()( int ind ) const
|
||||
void operator()( int ind ) const
|
||||
{
|
||||
if( state->preFilterType == CV_STEREO_BM_NORMALIZED_RESPONSE )
|
||||
prefilterNorm( *imgs0[ind], *imgs[ind], state->preFilterSize, state->preFilterCap, buf[ind] );
|
||||
else
|
||||
prefilterXSobel( *imgs0[ind], *imgs[ind], state->preFilterCap );
|
||||
prefilterXSobel( *imgs0[ind], *imgs[ind], state->preFilterCap );
|
||||
}
|
||||
|
||||
|
||||
const Mat* imgs0[2];
|
||||
Mat* imgs[2];
|
||||
Mat* imgs[2];
|
||||
uchar* buf[2];
|
||||
CvStereoBMState *state;
|
||||
};
|
||||
@ -709,21 +712,21 @@ struct FindStereoCorrespInvoker
|
||||
useShorts = _useShorts;
|
||||
validDisparityRect = _validDisparityRect;
|
||||
}
|
||||
|
||||
void operator()( const BlockedRange& range ) const
|
||||
|
||||
void operator()( const BlockedRange& range ) const
|
||||
{
|
||||
int cols = left->cols, rows = left->rows;
|
||||
int _row0 = min(cvRound(range.begin() * rows / nstripes), rows);
|
||||
int _row1 = min(cvRound(range.end() * rows / nstripes), rows);
|
||||
uchar *ptr = state->slidingSumBuf->data.ptr + range.begin() * stripeBufSize;
|
||||
int FILTERED = (state->minDisparity - 1)*16;
|
||||
|
||||
|
||||
Rect roi = validDisparityRect & Rect(0, _row0, cols, _row1 - _row0);
|
||||
if( roi.height == 0 )
|
||||
return;
|
||||
int row0 = roi.y;
|
||||
int row1 = roi.y + roi.height;
|
||||
|
||||
|
||||
Mat part;
|
||||
if( row0 > _row0 )
|
||||
{
|
||||
@ -735,22 +738,22 @@ struct FindStereoCorrespInvoker
|
||||
part = disp->rowRange(row1, _row1);
|
||||
part = Scalar::all(FILTERED);
|
||||
}
|
||||
|
||||
|
||||
Mat left_i = left->rowRange(row0, row1);
|
||||
Mat right_i = right->rowRange(row0, row1);
|
||||
Mat disp_i = disp->rowRange(row0, row1);
|
||||
Mat cost_i = state->disp12MaxDiff >= 0 ? Mat(state->cost).rowRange(row0, row1) : Mat();
|
||||
|
||||
#if CV_SSE2
|
||||
|
||||
#if CV_SSE2
|
||||
if( useShorts )
|
||||
findStereoCorrespondenceBM_SSE2( left_i, right_i, disp_i, cost_i, *state, ptr, row0, rows - row1 );
|
||||
else
|
||||
#endif
|
||||
#endif
|
||||
findStereoCorrespondenceBM( left_i, right_i, disp_i, cost_i, *state, ptr, row0, rows - row1 );
|
||||
|
||||
|
||||
if( state->disp12MaxDiff >= 0 )
|
||||
validateDisparity( disp_i, cost_i, state->minDisparity, state->numberOfDisparities, state->disp12MaxDiff );
|
||||
|
||||
|
||||
if( roi.x > 0 )
|
||||
{
|
||||
part = disp_i.colRange(0, roi.x);
|
||||
@ -767,7 +770,7 @@ protected:
|
||||
const Mat *left, *right;
|
||||
Mat* disp;
|
||||
CvStereoBMState *state;
|
||||
|
||||
|
||||
int nstripes;
|
||||
int stripeBufSize;
|
||||
bool useShorts;
|
||||
@ -775,7 +778,7 @@ protected:
|
||||
};
|
||||
|
||||
static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat& disp0, CvStereoBMState* state)
|
||||
{
|
||||
{
|
||||
if (left0.size() != right0.size() || disp0.size() != left0.size())
|
||||
CV_Error( CV_StsUnmatchedSizes, "All the images must have the same size" );
|
||||
|
||||
@ -783,7 +786,7 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
CV_Error( CV_StsUnsupportedFormat, "Both input images must have CV_8UC1" );
|
||||
|
||||
if (disp0.type() != CV_16SC1 && disp0.type() != CV_32FC1)
|
||||
CV_Error( CV_StsUnsupportedFormat, "Disparity image must have CV_16SC1 or CV_32FC1 format" );
|
||||
CV_Error( CV_StsUnsupportedFormat, "Disparity image must have CV_16SC1 or CV_32FC1 format" );
|
||||
|
||||
if( !state )
|
||||
CV_Error( CV_StsNullPtr, "Stereo BM state is NULL." );
|
||||
@ -809,7 +812,7 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
|
||||
if( state->uniquenessRatio < 0 )
|
||||
CV_Error( CV_StsOutOfRange, "uniqueness ratio must be non-negative" );
|
||||
|
||||
|
||||
if( !state->preFilteredImg0 || state->preFilteredImg0->cols * state->preFilteredImg0->rows < left0.cols * left0.rows )
|
||||
{
|
||||
cvReleaseMat( &state->preFilteredImg0 );
|
||||
@ -822,7 +825,7 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
}
|
||||
Mat left(left0.size(), CV_8U, state->preFilteredImg0->data.ptr);
|
||||
Mat right(right0.size(), CV_8U, state->preFilteredImg1->data.ptr);
|
||||
|
||||
|
||||
int mindisp = state->minDisparity;
|
||||
int ndisp = state->numberOfDisparities;
|
||||
|
||||
@ -832,15 +835,15 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
int rofs = -min(ndisp - 1 + mindisp, 0);
|
||||
int width1 = width - rofs - ndisp + 1;
|
||||
int FILTERED = (state->minDisparity - 1) << DISPARITY_SHIFT;
|
||||
|
||||
|
||||
if( lofs >= width || rofs >= width || width1 < 1 )
|
||||
{
|
||||
disp0 = Scalar::all( FILTERED * ( disp0.type() < CV_32F ? 1 : 1./(1 << DISPARITY_SHIFT) ) );
|
||||
disp0 = Scalar::all( FILTERED * ( disp0.type() < CV_32F ? 1 : 1./(1 << DISPARITY_SHIFT) ) );
|
||||
return;
|
||||
}
|
||||
|
||||
Mat disp = disp0;
|
||||
|
||||
|
||||
if( disp0.type() == CV_32F)
|
||||
{
|
||||
if( !state->disp || state->disp->rows != disp0.rows || state->disp->cols != disp0.cols )
|
||||
@ -850,8 +853,8 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
}
|
||||
disp = cv::cvarrToMat(state->disp);
|
||||
}
|
||||
|
||||
int wsz = state->SADWindowSize;
|
||||
|
||||
int wsz = state->SADWindowSize;
|
||||
int bufSize0 = (int)((ndisp + 2)*sizeof(int));
|
||||
bufSize0 += (int)((height+wsz+2)*ndisp*sizeof(int));
|
||||
bufSize0 += (int)((height + wsz + 2)*sizeof(int));
|
||||
@ -861,16 +864,16 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
int bufSize2 = 0;
|
||||
if( state->speckleRange >= 0 && state->speckleWindowSize > 0 )
|
||||
bufSize2 = width*height*(sizeof(cv::Point_<short>) + sizeof(int) + sizeof(uchar));
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
bool useShorts = state->preFilterCap <= 31 && state->SADWindowSize <= 21 && checkHardwareSupport(CV_CPU_SSE2);
|
||||
#else
|
||||
const bool useShorts = false;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_TBB
|
||||
|
||||
#ifdef HAVE_TBB
|
||||
const double SAD_overhead_coeff = 10.0;
|
||||
double N0 = 8000000 / (useShorts ? 1 : 4); // approx tbb's min number instructions reasonable for one thread
|
||||
double N0 = 8000000 / (useShorts ? 1 : 4); // approx tbb's min number instructions reasonable for one thread
|
||||
double maxStripeSize = min(max(N0 / (width * ndisp), (wsz-1) * SAD_overhead_coeff), (double)height);
|
||||
int nstripes = cvCeil(height / maxStripeSize);
|
||||
#else
|
||||
@ -878,27 +881,27 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
#endif
|
||||
|
||||
int bufSize = max(bufSize0 * nstripes, max(bufSize1 * 2, bufSize2));
|
||||
|
||||
|
||||
if( !state->slidingSumBuf || state->slidingSumBuf->cols < bufSize )
|
||||
{
|
||||
cvReleaseMat( &state->slidingSumBuf );
|
||||
state->slidingSumBuf = cvCreateMat( 1, bufSize, CV_8U );
|
||||
}
|
||||
|
||||
|
||||
uchar *_buf = state->slidingSumBuf->data.ptr;
|
||||
int idx[] = {0,1};
|
||||
parallel_do(idx, idx+2, PrefilterInvoker(left0, right0, left, right, _buf, _buf + bufSize1, state));
|
||||
|
||||
|
||||
Rect validDisparityRect(0, 0, width, height), R1 = state->roi1, R2 = state->roi2;
|
||||
validDisparityRect = getValidDisparityROI(R1.area() > 0 ? Rect(0, 0, width, height) : validDisparityRect,
|
||||
R2.area() > 0 ? Rect(0, 0, width, height) : validDisparityRect,
|
||||
state->minDisparity, state->numberOfDisparities,
|
||||
state->SADWindowSize);
|
||||
|
||||
state->SADWindowSize);
|
||||
|
||||
parallel_for(BlockedRange(0, nstripes),
|
||||
FindStereoCorrespInvoker(left, right, disp, state, nstripes,
|
||||
bufSize0, useShorts, validDisparityRect));
|
||||
|
||||
|
||||
if( state->speckleRange >= 0 && state->speckleWindowSize > 0 )
|
||||
{
|
||||
Mat buf(state->slidingSumBuf);
|
||||
@ -906,7 +909,7 @@ static void findStereoCorrespondenceBM( const Mat& left0, const Mat& right0, Mat
|
||||
}
|
||||
|
||||
if (disp0.data != disp.data)
|
||||
disp.convertTo(disp0, disp0.type(), 1./(1 << DISPARITY_SHIFT), 0);
|
||||
disp.convertTo(disp0, disp0.type(), 1./(1 << DISPARITY_SHIFT), 0);
|
||||
}
|
||||
|
||||
StereoBM::StereoBM()
|
||||
@ -928,13 +931,13 @@ void StereoBM::operator()( InputArray _left, InputArray _right,
|
||||
CV_Assert( disptype == CV_16S || disptype == CV_32F );
|
||||
_disparity.create(left.size(), disptype);
|
||||
Mat disparity = _disparity.getMat();
|
||||
|
||||
|
||||
findStereoCorrespondenceBM(left, right, disparity, state);
|
||||
}
|
||||
|
||||
template<> void Ptr<CvStereoBMState>::delete_obj()
|
||||
{ cvReleaseStereoBMState(&obj); }
|
||||
|
||||
|
||||
}
|
||||
|
||||
CV_IMPL void cvFindStereoCorrespondenceBM( const CvArr* leftarr, const CvArr* rightarr,
|
||||
@ -942,7 +945,7 @@ CV_IMPL void cvFindStereoCorrespondenceBM( const CvArr* leftarr, const CvArr* ri
|
||||
{
|
||||
cv::Mat left = cv::cvarrToMat(leftarr),
|
||||
right = cv::cvarrToMat(rightarr),
|
||||
disp = cv::cvarrToMat(disparr);
|
||||
disp = cv::cvarrToMat(disparr);
|
||||
cv::findStereoCorrespondenceBM(left, right, disp, state);
|
||||
}
|
||||
|
||||
|
@ -44,17 +44,17 @@
|
||||
This is a variation of
|
||||
"Stereo Processing by Semiglobal Matching and Mutual Information"
|
||||
by Heiko Hirschmuller.
|
||||
|
||||
|
||||
We match blocks rather than individual pixels, thus the algorithm is called
|
||||
SGBM (Semi-global block matching)
|
||||
*/
|
||||
*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
#include <limits.h>
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
typedef uchar PixType;
|
||||
typedef short CostType;
|
||||
typedef short DispType;
|
||||
@ -105,7 +105,7 @@ StereoSGBM::~StereoSGBM()
|
||||
row1[x] and row2[x-d]. The subpixel algorithm from
|
||||
"Depth Discontinuities by Pixel-to-Pixel Stereo" by Stan Birchfield and C. Tomasi
|
||||
is used, hence the suffix BT.
|
||||
|
||||
|
||||
the temporary buffer should contain width2*2 elements
|
||||
*/
|
||||
static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
@ -119,25 +119,25 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
int D = maxD - minD, width1 = maxX1 - minX1, width2 = maxX2 - minX2;
|
||||
const PixType *row1 = img1.ptr<PixType>(y), *row2 = img2.ptr<PixType>(y);
|
||||
PixType *prow1 = buffer + width2*2, *prow2 = prow1 + width*cn*2;
|
||||
|
||||
|
||||
tab += tabOfs;
|
||||
|
||||
|
||||
for( c = 0; c < cn*2; c++ )
|
||||
{
|
||||
prow1[width*c] = prow1[width*c + width-1] =
|
||||
prow1[width*c] = prow1[width*c + width-1] =
|
||||
prow2[width*c] = prow2[width*c + width-1] = tab[0];
|
||||
}
|
||||
|
||||
|
||||
int n1 = y > 0 ? -(int)img1.step : 0, s1 = y < img1.rows-1 ? (int)img1.step : 0;
|
||||
int n2 = y > 0 ? -(int)img2.step : 0, s2 = y < img2.rows-1 ? (int)img2.step : 0;
|
||||
|
||||
|
||||
if( cn == 1 )
|
||||
{
|
||||
for( x = 1; x < width-1; x++ )
|
||||
{
|
||||
prow1[x] = tab[(row1[x+1] - row1[x-1])*2 + row1[x+n1+1] - row1[x+n1-1] + row1[x+s1+1] - row1[x+s1-1]];
|
||||
prow2[width-1-x] = tab[(row2[x+1] - row2[x-1])*2 + row2[x+n2+1] - row2[x+n2-1] + row2[x+s2+1] - row2[x+s2-1]];
|
||||
|
||||
|
||||
prow1[x+width] = row1[x];
|
||||
prow2[width-1-x+width] = row2[x];
|
||||
}
|
||||
@ -149,35 +149,35 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
prow1[x] = tab[(row1[x*3+3] - row1[x*3-3])*2 + row1[x*3+n1+3] - row1[x*3+n1-3] + row1[x*3+s1+3] - row1[x*3+s1-3]];
|
||||
prow1[x+width] = tab[(row1[x*3+4] - row1[x*3-2])*2 + row1[x*3+n1+4] - row1[x*3+n1-2] + row1[x*3+s1+4] - row1[x*3+s1-2]];
|
||||
prow1[x+width*2] = tab[(row1[x*3+5] - row1[x*3-1])*2 + row1[x*3+n1+5] - row1[x*3+n1-1] + row1[x*3+s1+5] - row1[x*3+s1-1]];
|
||||
|
||||
|
||||
prow2[width-1-x] = tab[(row2[x*3+3] - row2[x*3-3])*2 + row2[x*3+n2+3] - row2[x*3+n2-3] + row2[x*3+s2+3] - row2[x*3+s2-3]];
|
||||
prow2[width-1-x+width] = tab[(row2[x*3+4] - row2[x*3-2])*2 + row2[x*3+n2+4] - row2[x*3+n2-2] + row2[x*3+s2+4] - row2[x*3+s2-2]];
|
||||
prow2[width-1-x+width*2] = tab[(row2[x*3+5] - row2[x*3-1])*2 + row2[x*3+n2+5] - row2[x*3+n2-1] + row2[x*3+s2+5] - row2[x*3+s2-1]];
|
||||
|
||||
|
||||
prow1[x+width*3] = row1[x*3];
|
||||
prow1[x+width*4] = row1[x*3+1];
|
||||
prow1[x+width*5] = row1[x*3+2];
|
||||
|
||||
|
||||
prow2[width-1-x+width*3] = row2[x*3];
|
||||
prow2[width-1-x+width*4] = row2[x*3+1];
|
||||
prow2[width-1-x+width*5] = row2[x*3+2];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
memset( cost, 0, width1*D*sizeof(cost[0]) );
|
||||
|
||||
|
||||
buffer -= minX2;
|
||||
cost -= minX1*D + minD; // simplify the cost indices inside the loop
|
||||
|
||||
#if CV_SSE2
|
||||
|
||||
#if CV_SSE2
|
||||
volatile bool useSIMD = checkHardwareSupport(CV_CPU_SSE2);
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
|
||||
#if 1
|
||||
for( c = 0; c < cn*2; c++, prow1 += width, prow2 += width )
|
||||
{
|
||||
int diff_scale = c < cn ? 0 : 2;
|
||||
|
||||
|
||||
// precompute
|
||||
// v0 = min(row2[x-1/2], row2[x], row2[x+1/2]) and
|
||||
// v1 = max(row2[x-1/2], row2[x], row2[x+1/2]) and
|
||||
@ -191,7 +191,7 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
buffer[x] = (PixType)v0;
|
||||
buffer[x + width2] = (PixType)v1;
|
||||
}
|
||||
|
||||
|
||||
for( x = minX1; x < maxX1; x++ )
|
||||
{
|
||||
int u = prow1[x];
|
||||
@ -199,14 +199,14 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
int ur = x < width-1 ? (u + prow1[x+1])/2 : u;
|
||||
int u0 = min(ul, ur); u0 = min(u0, u);
|
||||
int u1 = max(ul, ur); u1 = max(u1, u);
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
__m128i _u = _mm_set1_epi8((char)u), _u0 = _mm_set1_epi8((char)u0);
|
||||
__m128i _u1 = _mm_set1_epi8((char)u1), z = _mm_setzero_si128();
|
||||
__m128i ds = _mm_cvtsi32_si128(diff_scale);
|
||||
|
||||
|
||||
for( int d = minD; d < maxD; d += 16 )
|
||||
{
|
||||
__m128i _v = _mm_loadu_si128((const __m128i*)(prow2 + width-x-1 + d));
|
||||
@ -215,10 +215,10 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
__m128i c0 = _mm_max_epu8(_mm_subs_epu8(_u, _v1), _mm_subs_epu8(_v0, _u));
|
||||
__m128i c1 = _mm_max_epu8(_mm_subs_epu8(_v, _u1), _mm_subs_epu8(_u0, _v));
|
||||
__m128i diff = _mm_min_epu8(c0, c1);
|
||||
|
||||
|
||||
c0 = _mm_load_si128((__m128i*)(cost + x*D + d));
|
||||
c1 = _mm_load_si128((__m128i*)(cost + x*D + d + 8));
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(cost + x*D + d), _mm_adds_epi16(c0, _mm_srl_epi16(_mm_unpacklo_epi8(diff,z), ds)));
|
||||
_mm_store_si128((__m128i*)(cost + x*D + d + 8), _mm_adds_epi16(c1, _mm_srl_epi16(_mm_unpackhi_epi8(diff,z), ds)));
|
||||
}
|
||||
@ -233,7 +233,7 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
int v1 = buffer[width-x-1 + d + width2];
|
||||
int c0 = max(0, u - v1); c0 = max(c0, v0 - u);
|
||||
int c1 = max(0, v - u1); c1 = max(c1, u0 - v);
|
||||
|
||||
|
||||
cost[x*D + d] = (CostType)(cost[x*D+d] + (min(c0, c1) >> diff_scale));
|
||||
}
|
||||
}
|
||||
@ -249,14 +249,14 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
if( useSIMD )
|
||||
{
|
||||
__m128i _u = _mm_set1_epi8(u), z = _mm_setzero_si128();
|
||||
|
||||
|
||||
for( int d = minD; d < maxD; d += 16 )
|
||||
{
|
||||
__m128i _v = _mm_loadu_si128((const __m128i*)(prow2 + width-1-x + d));
|
||||
__m128i diff = _mm_adds_epu8(_mm_subs_epu8(_u,_v), _mm_subs_epu8(_v,_u));
|
||||
__m128i c0 = _mm_load_si128((__m128i*)(cost + x*D + d));
|
||||
__m128i c1 = _mm_load_si128((__m128i*)(cost + x*D + d + 8));
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(cost + x*D + d), _mm_adds_epi16(c0, _mm_unpacklo_epi8(diff,z)));
|
||||
_mm_store_si128((__m128i*)(cost + x*D + d + 8), _mm_adds_epi16(c1, _mm_unpackhi_epi8(diff,z)));
|
||||
}
|
||||
@ -282,22 +282,22 @@ static void calcPixelCostBT( const Mat& img1, const Mat& img2, int y,
|
||||
minD <= d < maxD.
|
||||
disp2full is the reverse disparity map, that is:
|
||||
disp2full(x+roi.x,y+roi.y)=d means that img2(x+roi.x, y+roi.y) ~ img1(x+roi.x+d, y+roi.y)
|
||||
|
||||
|
||||
note that disp1buf will have the same size as the roi and
|
||||
disp2full will have the same size as img1 (or img2).
|
||||
On exit disp2buf is not the final disparity, it is an intermediate result that becomes
|
||||
final after all the tiles are processed.
|
||||
|
||||
|
||||
the disparity in disp1buf is written with sub-pixel accuracy
|
||||
(4 fractional bits, see CvStereoSGBM::DISP_SCALE),
|
||||
using quadratic interpolation, while the disparity in disp2buf
|
||||
is written as is, without interpolation.
|
||||
|
||||
|
||||
disp2cost also has the same size as img1 (or img2).
|
||||
It contains the minimum current cost, used to find the best disparity, corresponding to the minimal cost.
|
||||
*/
|
||||
*/
|
||||
static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
Mat& disp1, const StereoSGBM& params,
|
||||
Mat& disp1, const StereoSGBM& params,
|
||||
Mat& buffer )
|
||||
{
|
||||
#if CV_SSE2
|
||||
@ -312,15 +312,15 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
|
||||
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
|
||||
};
|
||||
|
||||
|
||||
volatile bool useSIMD = checkHardwareSupport(CV_CPU_SSE2);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
const int ALIGN = 16;
|
||||
const int DISP_SHIFT = StereoSGBM::DISP_SHIFT;
|
||||
const int DISP_SCALE = StereoSGBM::DISP_SCALE;
|
||||
const CostType MAX_COST = SHRT_MAX;
|
||||
|
||||
|
||||
int minD = params.minDisparity, maxD = minD + params.numberOfDisparities;
|
||||
Size SADWindowSize;
|
||||
SADWindowSize.width = SADWindowSize.height = params.SADWindowSize > 0 ? params.SADWindowSize : 5;
|
||||
@ -336,28 +336,28 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
int npasses = params.fullDP ? 2 : 1;
|
||||
const int TAB_OFS = 256*4, TAB_SIZE = 256 + TAB_OFS*2;
|
||||
PixType clipTab[TAB_SIZE];
|
||||
|
||||
|
||||
for( k = 0; k < TAB_SIZE; k++ )
|
||||
clipTab[k] = (PixType)(min(max(k - TAB_OFS, -ftzero), ftzero) + ftzero);
|
||||
|
||||
|
||||
if( minX1 >= maxX1 )
|
||||
{
|
||||
disp1 = Scalar::all(INVALID_DISP_SCALED);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
CV_Assert( D % 16 == 0 );
|
||||
|
||||
|
||||
// NR - the number of directions. the loop on x below that computes Lr assumes that NR == 8.
|
||||
// if you change NR, please, modify the loop as well.
|
||||
int D2 = D+16, NRD2 = NR2*D2;
|
||||
|
||||
|
||||
// the number of L_r(.,.) and min_k L_r(.,.) lines in the buffer:
|
||||
// for 8-way dynamic programming we need the current row and
|
||||
// the previous row, i.e. 2 rows in total
|
||||
const int NLR = 2;
|
||||
const int LrBorder = NLR - 1;
|
||||
|
||||
|
||||
// for each possible stereo match (img1(x,y) <=> img2(x-d,y))
|
||||
// we keep pixel difference cost (C) and the summary cost over NR directions (S).
|
||||
// we also keep all the partial costs for the previous line L_r(x,d) and also min_k L_r(x, k)
|
||||
@ -370,29 +370,29 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
CSBufSize*2*sizeof(CostType) + // C, S
|
||||
width*16*img1.channels()*sizeof(PixType) + // temp buffer for computing per-pixel cost
|
||||
width*(sizeof(CostType) + sizeof(DispType)) + 1024; // disp2cost + disp2
|
||||
|
||||
|
||||
if( !buffer.data || !buffer.isContinuous() ||
|
||||
buffer.cols*buffer.rows*buffer.elemSize() < totalBufSize )
|
||||
buffer.create(1, (int)totalBufSize, CV_8U);
|
||||
|
||||
|
||||
// summary cost over different (nDirs) directions
|
||||
CostType* Cbuf = (CostType*)alignPtr(buffer.data, ALIGN);
|
||||
CostType* Sbuf = Cbuf + CSBufSize;
|
||||
CostType* hsumBuf = Sbuf + CSBufSize;
|
||||
CostType* pixDiff = hsumBuf + costBufSize*hsumBufNRows;
|
||||
|
||||
|
||||
CostType* disp2cost = pixDiff + costBufSize + (LrSize + minLrSize)*NLR;
|
||||
DispType* disp2ptr = (DispType*)(disp2cost + width);
|
||||
PixType* tempBuf = (PixType*)(disp2ptr + width);
|
||||
|
||||
|
||||
// add P2 to every C(x,y). it saves a few operations in the inner loops
|
||||
for( k = 0; k < width1*D; k++ )
|
||||
Cbuf[k] = (CostType)P2;
|
||||
|
||||
|
||||
for( int pass = 1; pass <= npasses; pass++ )
|
||||
{
|
||||
int x1, y1, x2, y2, dx, dy;
|
||||
|
||||
|
||||
if( pass == 1 )
|
||||
{
|
||||
y1 = 0; y2 = height; dy = 1;
|
||||
@ -403,9 +403,9 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
y1 = height-1; y2 = -1; dy = -1;
|
||||
x1 = width1-1; x2 = -1; dx = -1;
|
||||
}
|
||||
|
||||
|
||||
CostType *Lr[NLR]={0}, *minLr[NLR]={0};
|
||||
|
||||
|
||||
for( k = 0; k < NLR; k++ )
|
||||
{
|
||||
// shift Lr[k] and minLr[k] pointers, because we allocated them with the borders,
|
||||
@ -418,26 +418,26 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
minLr[k] = pixDiff + costBufSize + LrSize*NLR + minLrSize*k + NR2*2;
|
||||
memset( minLr[k] - LrBorder*NR2, 0, minLrSize*sizeof(CostType) );
|
||||
}
|
||||
|
||||
|
||||
for( int y = y1; y != y2; y += dy )
|
||||
{
|
||||
int x, d;
|
||||
DispType* disp1ptr = disp1.ptr<DispType>(y);
|
||||
CostType* C = Cbuf + (!params.fullDP ? 0 : y*costBufSize);
|
||||
CostType* S = Sbuf + (!params.fullDP ? 0 : y*costBufSize);
|
||||
|
||||
|
||||
if( pass == 1 ) // compute C on the first pass, and reuse it on the second pass, if any.
|
||||
{
|
||||
int dy1 = y == 0 ? 0 : y + SH2, dy2 = y == 0 ? SH2 : dy1;
|
||||
|
||||
|
||||
for( k = dy1; k <= dy2; k++ )
|
||||
{
|
||||
CostType* hsumAdd = hsumBuf + (min(k, height-1) % hsumBufNRows)*costBufSize;
|
||||
|
||||
|
||||
if( k < height )
|
||||
{
|
||||
calcPixelCostBT( img1, img2, k, minD, maxD, pixDiff, tempBuf, clipTab, TAB_OFS, ftzero );
|
||||
|
||||
|
||||
memset(hsumAdd, 0, D*sizeof(CostType));
|
||||
for( x = 0; x <= SW2*D; x += D )
|
||||
{
|
||||
@ -445,17 +445,17 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
for( d = 0; d < D; d++ )
|
||||
hsumAdd[d] = (CostType)(hsumAdd[d] + pixDiff[x + d]*scale);
|
||||
}
|
||||
|
||||
|
||||
if( y > 0 )
|
||||
{
|
||||
const CostType* hsumSub = hsumBuf + (max(y - SH2 - 1, 0) % hsumBufNRows)*costBufSize;
|
||||
const CostType* Cprev = !params.fullDP || y == 0 ? C : C - costBufSize;
|
||||
|
||||
|
||||
for( x = D; x < width1*D; x += D )
|
||||
{
|
||||
const CostType* pixAdd = pixDiff + min(x + SW2*D, (width1-1)*D);
|
||||
const CostType* pixSub = pixDiff + max(x - (SW2+1)*D, 0);
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
@ -490,13 +490,13 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
{
|
||||
const CostType* pixAdd = pixDiff + min(x + SW2*D, (width1-1)*D);
|
||||
const CostType* pixSub = pixDiff + max(x - (SW2+1)*D, 0);
|
||||
|
||||
|
||||
for( d = 0; d < D; d++ )
|
||||
hsumAdd[x + d] = (CostType)(hsumAdd[x - D + d] + pixAdd[d] - pixSub[d]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( y == 0 )
|
||||
{
|
||||
int scale = k == 0 ? SH2 + 1 : 1;
|
||||
@ -504,18 +504,18 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
C[x] = (CostType)(C[x] + hsumAdd[x]*scale);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// also, clear the S buffer
|
||||
for( k = 0; k < width1*D; k++ )
|
||||
S[k] = 0;
|
||||
}
|
||||
|
||||
|
||||
// clear the left and the right borders
|
||||
memset( Lr[0] - NRD2*LrBorder - 8, 0, NRD2*LrBorder*sizeof(CostType) );
|
||||
memset( Lr[0] + width1*NRD2 - 8, 0, NRD2*LrBorder*sizeof(CostType) );
|
||||
memset( minLr[0] - NR2*LrBorder, 0, NR2*LrBorder*sizeof(CostType) );
|
||||
memset( minLr[0] + width1*NR2, 0, NR2*LrBorder*sizeof(CostType) );
|
||||
|
||||
|
||||
/*
|
||||
[formula 13 in the paper]
|
||||
compute L_r(p, d) = C(p, d) +
|
||||
@ -537,87 +537,87 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
for( x = x1; x != x2; x += dx )
|
||||
{
|
||||
int xm = x*NR2, xd = xm*D2;
|
||||
|
||||
|
||||
int delta0 = minLr[0][xm - dx*NR2] + P2, delta1 = minLr[1][xm - NR2 + 1] + P2;
|
||||
int delta2 = minLr[1][xm + 2] + P2, delta3 = minLr[1][xm + NR2 + 3] + P2;
|
||||
|
||||
|
||||
CostType* Lr_p0 = Lr[0] + xd - dx*NRD2;
|
||||
CostType* Lr_p1 = Lr[1] + xd - NRD2 + D2;
|
||||
CostType* Lr_p2 = Lr[1] + xd + D2*2;
|
||||
CostType* Lr_p3 = Lr[1] + xd + NRD2 + D2*3;
|
||||
|
||||
|
||||
Lr_p0[-1] = Lr_p0[D] = Lr_p1[-1] = Lr_p1[D] =
|
||||
Lr_p2[-1] = Lr_p2[D] = Lr_p3[-1] = Lr_p3[D] = MAX_COST;
|
||||
|
||||
|
||||
CostType* Lr_p = Lr[0] + xd;
|
||||
const CostType* Cp = C + x*D;
|
||||
CostType* Sp = S + x*D;
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
__m128i _P1 = _mm_set1_epi16((short)P1);
|
||||
|
||||
|
||||
__m128i _delta0 = _mm_set1_epi16((short)delta0);
|
||||
__m128i _delta1 = _mm_set1_epi16((short)delta1);
|
||||
__m128i _delta2 = _mm_set1_epi16((short)delta2);
|
||||
__m128i _delta3 = _mm_set1_epi16((short)delta3);
|
||||
__m128i _minL0 = _mm_set1_epi16((short)MAX_COST);
|
||||
|
||||
|
||||
for( d = 0; d < D; d += 8 )
|
||||
{
|
||||
__m128i Cpd = _mm_load_si128((const __m128i*)(Cp + d));
|
||||
__m128i L0, L1, L2, L3;
|
||||
|
||||
|
||||
L0 = _mm_load_si128((const __m128i*)(Lr_p0 + d));
|
||||
L1 = _mm_load_si128((const __m128i*)(Lr_p1 + d));
|
||||
L2 = _mm_load_si128((const __m128i*)(Lr_p2 + d));
|
||||
L3 = _mm_load_si128((const __m128i*)(Lr_p3 + d));
|
||||
|
||||
|
||||
L0 = _mm_min_epi16(L0, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p0 + d - 1)), _P1));
|
||||
L0 = _mm_min_epi16(L0, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p0 + d + 1)), _P1));
|
||||
|
||||
|
||||
L1 = _mm_min_epi16(L1, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p1 + d - 1)), _P1));
|
||||
L1 = _mm_min_epi16(L1, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p1 + d + 1)), _P1));
|
||||
|
||||
|
||||
L2 = _mm_min_epi16(L2, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p2 + d - 1)), _P1));
|
||||
L2 = _mm_min_epi16(L2, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p2 + d + 1)), _P1));
|
||||
|
||||
|
||||
L3 = _mm_min_epi16(L3, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p3 + d - 1)), _P1));
|
||||
L3 = _mm_min_epi16(L3, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p3 + d + 1)), _P1));
|
||||
|
||||
|
||||
L0 = _mm_min_epi16(L0, _delta0);
|
||||
L0 = _mm_adds_epi16(_mm_subs_epi16(L0, _delta0), Cpd);
|
||||
|
||||
|
||||
L1 = _mm_min_epi16(L1, _delta1);
|
||||
L1 = _mm_adds_epi16(_mm_subs_epi16(L1, _delta1), Cpd);
|
||||
|
||||
|
||||
L2 = _mm_min_epi16(L2, _delta2);
|
||||
L2 = _mm_adds_epi16(_mm_subs_epi16(L2, _delta2), Cpd);
|
||||
|
||||
|
||||
L3 = _mm_min_epi16(L3, _delta3);
|
||||
L3 = _mm_adds_epi16(_mm_subs_epi16(L3, _delta3), Cpd);
|
||||
|
||||
|
||||
_mm_store_si128( (__m128i*)(Lr_p + d), L0);
|
||||
_mm_store_si128( (__m128i*)(Lr_p + d + D2), L1);
|
||||
_mm_store_si128( (__m128i*)(Lr_p + d + D2*2), L2);
|
||||
_mm_store_si128( (__m128i*)(Lr_p + d + D2*3), L3);
|
||||
|
||||
|
||||
__m128i t0 = _mm_min_epi16(_mm_unpacklo_epi16(L0, L2), _mm_unpackhi_epi16(L0, L2));
|
||||
__m128i t1 = _mm_min_epi16(_mm_unpacklo_epi16(L1, L3), _mm_unpackhi_epi16(L1, L3));
|
||||
t0 = _mm_min_epi16(_mm_unpacklo_epi16(t0, t1), _mm_unpackhi_epi16(t0, t1));
|
||||
_minL0 = _mm_min_epi16(_minL0, t0);
|
||||
|
||||
|
||||
__m128i Sval = _mm_load_si128((const __m128i*)(Sp + d));
|
||||
|
||||
|
||||
L0 = _mm_adds_epi16(L0, L1);
|
||||
L2 = _mm_adds_epi16(L2, L3);
|
||||
Sval = _mm_adds_epi16(Sval, L0);
|
||||
Sval = _mm_adds_epi16(Sval, L2);
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(Sp + d), Sval);
|
||||
}
|
||||
|
||||
|
||||
_minL0 = _mm_min_epi16(_minL0, _mm_srli_si128(_minL0, 8));
|
||||
_mm_storel_epi64((__m128i*)&minLr[0][xm], _minL0);
|
||||
}
|
||||
@ -625,28 +625,28 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
#endif
|
||||
{
|
||||
int minL0 = MAX_COST, minL1 = MAX_COST, minL2 = MAX_COST, minL3 = MAX_COST;
|
||||
|
||||
|
||||
for( d = 0; d < D; d++ )
|
||||
{
|
||||
int Cpd = Cp[d], L0, L1, L2, L3;
|
||||
|
||||
|
||||
L0 = Cpd + min((int)Lr_p0[d], min(Lr_p0[d-1] + P1, min(Lr_p0[d+1] + P1, delta0))) - delta0;
|
||||
L1 = Cpd + min((int)Lr_p1[d], min(Lr_p1[d-1] + P1, min(Lr_p1[d+1] + P1, delta1))) - delta1;
|
||||
L1 = Cpd + min((int)Lr_p1[d], min(Lr_p1[d-1] + P1, min(Lr_p1[d+1] + P1, delta1))) - delta1;
|
||||
L2 = Cpd + min((int)Lr_p2[d], min(Lr_p2[d-1] + P1, min(Lr_p2[d+1] + P1, delta2))) - delta2;
|
||||
L3 = Cpd + min((int)Lr_p3[d], min(Lr_p3[d-1] + P1, min(Lr_p3[d+1] + P1, delta3))) - delta3;
|
||||
|
||||
|
||||
Lr_p[d] = (CostType)L0;
|
||||
minL0 = min(minL0, L0);
|
||||
|
||||
|
||||
Lr_p[d + D2] = (CostType)L1;
|
||||
minL1 = min(minL1, L1);
|
||||
|
||||
|
||||
Lr_p[d + D2*2] = (CostType)L2;
|
||||
minL2 = min(minL2, L2);
|
||||
|
||||
|
||||
Lr_p[d + D2*3] = (CostType)L3;
|
||||
minL3 = min(minL3, L3);
|
||||
|
||||
|
||||
Sp[d] = saturate_cast<CostType>(Sp[d] + L0 + L1 + L2 + L3);
|
||||
}
|
||||
minLr[0][xm] = (CostType)minL0;
|
||||
@ -655,7 +655,7 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
minLr[0][xm+3] = (CostType)minL3;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( pass == npasses )
|
||||
{
|
||||
for( x = 0; x < width; x++ )
|
||||
@ -663,73 +663,73 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
disp1ptr[x] = disp2ptr[x] = (DispType)INVALID_DISP_SCALED;
|
||||
disp2cost[x] = MAX_COST;
|
||||
}
|
||||
|
||||
|
||||
for( x = width1 - 1; x >= 0; x-- )
|
||||
{
|
||||
CostType* Sp = S + x*D;
|
||||
int minS = MAX_COST, bestDisp = -1;
|
||||
|
||||
|
||||
if( npasses == 1 )
|
||||
{
|
||||
int xm = x*NR2, xd = xm*D2;
|
||||
|
||||
|
||||
int minL0 = MAX_COST;
|
||||
int delta0 = minLr[0][xm + NR2] + P2;
|
||||
CostType* Lr_p0 = Lr[0] + xd + NRD2;
|
||||
Lr_p0[-1] = Lr_p0[D] = MAX_COST;
|
||||
CostType* Lr_p = Lr[0] + xd;
|
||||
|
||||
|
||||
const CostType* Cp = C + x*D;
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
__m128i _P1 = _mm_set1_epi16((short)P1);
|
||||
__m128i _delta0 = _mm_set1_epi16((short)delta0);
|
||||
|
||||
|
||||
__m128i _minL0 = _mm_set1_epi16((short)minL0);
|
||||
__m128i _minS = _mm_set1_epi16(MAX_COST), _bestDisp = _mm_set1_epi16(-1);
|
||||
__m128i _d8 = _mm_setr_epi16(0, 1, 2, 3, 4, 5, 6, 7), _8 = _mm_set1_epi16(8);
|
||||
|
||||
|
||||
for( d = 0; d < D; d += 8 )
|
||||
{
|
||||
__m128i Cpd = _mm_load_si128((const __m128i*)(Cp + d)), L0;
|
||||
|
||||
|
||||
L0 = _mm_load_si128((const __m128i*)(Lr_p0 + d));
|
||||
L0 = _mm_min_epi16(L0, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p0 + d - 1)), _P1));
|
||||
L0 = _mm_min_epi16(L0, _mm_adds_epi16(_mm_loadu_si128((const __m128i*)(Lr_p0 + d + 1)), _P1));
|
||||
L0 = _mm_min_epi16(L0, _delta0);
|
||||
L0 = _mm_adds_epi16(_mm_subs_epi16(L0, _delta0), Cpd);
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(Lr_p + d), L0);
|
||||
_minL0 = _mm_min_epi16(_minL0, L0);
|
||||
L0 = _mm_adds_epi16(L0, *(__m128i*)(Sp + d));
|
||||
_mm_store_si128((__m128i*)(Sp + d), L0);
|
||||
|
||||
|
||||
__m128i mask = _mm_cmpgt_epi16(_minS, L0);
|
||||
_minS = _mm_min_epi16(_minS, L0);
|
||||
_bestDisp = _mm_xor_si128(_bestDisp, _mm_and_si128(_mm_xor_si128(_bestDisp,_d8), mask));
|
||||
_d8 = _mm_adds_epi16(_d8, _8);
|
||||
}
|
||||
|
||||
|
||||
short CV_DECL_ALIGNED(16) bestDispBuf[8];
|
||||
_mm_store_si128((__m128i*)bestDispBuf, _bestDisp);
|
||||
|
||||
|
||||
_minL0 = _mm_min_epi16(_minL0, _mm_srli_si128(_minL0, 8));
|
||||
_minL0 = _mm_min_epi16(_minL0, _mm_srli_si128(_minL0, 4));
|
||||
_minL0 = _mm_min_epi16(_minL0, _mm_srli_si128(_minL0, 2));
|
||||
|
||||
|
||||
__m128i qS = _mm_min_epi16(_minS, _mm_srli_si128(_minS, 8));
|
||||
qS = _mm_min_epi16(qS, _mm_srli_si128(qS, 4));
|
||||
qS = _mm_min_epi16(qS, _mm_srli_si128(qS, 2));
|
||||
|
||||
|
||||
minLr[0][xm] = (CostType)_mm_cvtsi128_si32(_minL0);
|
||||
minS = (CostType)_mm_cvtsi128_si32(qS);
|
||||
|
||||
|
||||
qS = _mm_shuffle_epi32(_mm_unpacklo_epi16(qS, qS), 0);
|
||||
qS = _mm_cmpeq_epi16(_minS, qS);
|
||||
int idx = _mm_movemask_epi8(_mm_packs_epi16(qS, qS)) & 255;
|
||||
|
||||
|
||||
bestDisp = bestDispBuf[LSBTab[idx]];
|
||||
}
|
||||
else
|
||||
@ -738,10 +738,10 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
for( d = 0; d < D; d++ )
|
||||
{
|
||||
int L0 = Cp[d] + min((int)Lr_p0[d], min(Lr_p0[d-1] + P1, min(Lr_p0[d+1] + P1, delta0))) - delta0;
|
||||
|
||||
|
||||
Lr_p[d] = (CostType)L0;
|
||||
minL0 = min(minL0, L0);
|
||||
|
||||
|
||||
int Sval = Sp[d] = saturate_cast<CostType>(Sp[d] + L0);
|
||||
if( Sval < minS )
|
||||
{
|
||||
@ -764,7 +764,7 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( d = 0; d < D; d++ )
|
||||
{
|
||||
if( Sp[d]*(100 - uniquenessRatio) < minS*100 && std::abs(bestDisp - d) > 1 )
|
||||
@ -773,13 +773,13 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
if( d < D )
|
||||
continue;
|
||||
d = bestDisp;
|
||||
int x2 = x + minX1 - d - minD;
|
||||
if( disp2cost[x2] > minS )
|
||||
int _x2 = x + minX1 - d - minD;
|
||||
if( disp2cost[_x2] > minS )
|
||||
{
|
||||
disp2cost[x2] = (CostType)minS;
|
||||
disp2ptr[x2] = (DispType)(d + minD);
|
||||
disp2cost[_x2] = (CostType)minS;
|
||||
disp2ptr[_x2] = (DispType)(d + minD);
|
||||
}
|
||||
|
||||
|
||||
if( 0 < d && d < D-1 )
|
||||
{
|
||||
// do subpixel quadratic interpolation:
|
||||
@ -792,24 +792,24 @@ static void computeDisparitySGBM( const Mat& img1, const Mat& img2,
|
||||
d *= DISP_SCALE;
|
||||
disp1ptr[x + minX1] = (DispType)(d + minD*DISP_SCALE);
|
||||
}
|
||||
|
||||
|
||||
for( x = minX1; x < maxX1; x++ )
|
||||
{
|
||||
// we round the computed disparity both towards -inf and +inf and check
|
||||
// if either of the corresponding disparities in disp2 is consistent.
|
||||
// This is to give the computed disparity a chance to look valid if it is.
|
||||
int d = disp1ptr[x];
|
||||
if( d == INVALID_DISP_SCALED )
|
||||
int d1 = disp1ptr[x];
|
||||
if( d1 == INVALID_DISP_SCALED )
|
||||
continue;
|
||||
int _d = d >> DISP_SHIFT;
|
||||
int d_ = (d + DISP_SCALE-1) >> DISP_SHIFT;
|
||||
int _d = d1 >> DISP_SHIFT;
|
||||
int d_ = (d1 + DISP_SCALE-1) >> DISP_SHIFT;
|
||||
int _x = x - _d, x_ = x - d_;
|
||||
if( 0 <= _x && _x < width && disp2ptr[_x] >= minD && std::abs(disp2ptr[_x] - _d) > disp12MaxDiff &&
|
||||
0 <= x_ && x_ < width && disp2ptr[x_] >= minD && std::abs(disp2ptr[x_] - d_) > disp12MaxDiff )
|
||||
disp1ptr[x] = (DispType)INVALID_DISP_SCALED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// now shift the cyclic buffers
|
||||
std::swap( Lr[0], Lr[1] );
|
||||
std::swap( minLr[0], minLr[1] );
|
||||
@ -825,13 +825,13 @@ void StereoSGBM::operator ()( InputArray _left, InputArray _right,
|
||||
Mat left = _left.getMat(), right = _right.getMat();
|
||||
CV_Assert( left.size() == right.size() && left.type() == right.type() &&
|
||||
left.depth() == DataType<PixType>::depth );
|
||||
|
||||
|
||||
_disp.create( left.size(), CV_16S );
|
||||
Mat disp = _disp.getMat();
|
||||
|
||||
|
||||
computeDisparitySGBM( left, right, disp, *this, buffer );
|
||||
medianBlur(disp, disp, 3);
|
||||
|
||||
|
||||
if( speckleWindowSize > 0 )
|
||||
filterSpeckles(disp, (minDisparity - 1)*DISP_SCALE, speckleWindowSize, DISP_SCALE*speckleRange, buffer);
|
||||
}
|
||||
@ -844,33 +844,33 @@ Rect getValidDisparityROI( Rect roi1, Rect roi2,
|
||||
{
|
||||
int SW2 = SADWindowSize/2;
|
||||
int minD = minDisparity, maxD = minDisparity + numberOfDisparities - 1;
|
||||
|
||||
|
||||
int xmin = max(roi1.x, roi2.x + maxD) + SW2;
|
||||
int xmax = min(roi1.x + roi1.width, roi2.x + roi2.width - minD) - SW2;
|
||||
int ymin = max(roi1.y, roi2.y) + SW2;
|
||||
int ymax = min(roi1.y + roi1.height, roi2.y + roi2.height) - SW2;
|
||||
|
||||
|
||||
Rect r(xmin, ymin, xmax - xmin, ymax - ymin);
|
||||
|
||||
|
||||
return r.width > 0 && r.height > 0 ? r : Rect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void cv::filterSpeckles( InputOutputArray _img, double _newval, int maxSpeckleSize,
|
||||
double _maxDiff, InputOutputArray __buf )
|
||||
{
|
||||
Mat img = _img.getMat();
|
||||
Mat temp, &_buf = __buf.needed() ? __buf.getMatRef() : temp;
|
||||
CV_Assert( img.type() == CV_16SC1 );
|
||||
|
||||
|
||||
int newVal = cvRound(_newval);
|
||||
int maxDiff = cvRound(_maxDiff);
|
||||
int width = img.cols, height = img.rows, npixels = width*height;
|
||||
size_t bufSize = npixels*(int)(sizeof(Point2s) + sizeof(int) + sizeof(uchar));
|
||||
if( !_buf.isContinuous() || !_buf.data || _buf.cols*_buf.rows*_buf.elemSize() < bufSize )
|
||||
_buf.create(1, (int)bufSize, CV_8U);
|
||||
|
||||
|
||||
uchar* buf = _buf.data;
|
||||
int i, j, dstep = (int)(img.step/sizeof(short));
|
||||
int* labels = (int*)buf;
|
||||
@ -879,33 +879,33 @@ void cv::filterSpeckles( InputOutputArray _img, double _newval, int maxSpeckleSi
|
||||
buf += npixels*sizeof(wbuf[0]);
|
||||
uchar* rtype = (uchar*)buf;
|
||||
int curlabel = 0;
|
||||
|
||||
|
||||
// clear out label assignments
|
||||
memset(labels, 0, npixels*sizeof(labels[0]));
|
||||
|
||||
|
||||
for( i = 0; i < height; i++ )
|
||||
{
|
||||
short* ds = img.ptr<short>(i);
|
||||
int* ls = labels + width*i;
|
||||
|
||||
|
||||
for( j = 0; j < width; j++ )
|
||||
{
|
||||
if( ds[j] != newVal ) // not a bad disparity
|
||||
if( ds[j] != newVal ) // not a bad disparity
|
||||
{
|
||||
if( ls[j] ) // has a label, check for bad label
|
||||
{
|
||||
if( ls[j] ) // has a label, check for bad label
|
||||
{
|
||||
if( rtype[ls[j]] ) // small region, zero out disparity
|
||||
ds[j] = (short)newVal;
|
||||
}
|
||||
// no label, assign and propagate
|
||||
else
|
||||
{
|
||||
Point2s* ws = wbuf; // initialize wavefront
|
||||
Point2s p((short)j, (short)i); // current pixel
|
||||
curlabel++; // next label
|
||||
int count = 0; // current region size
|
||||
Point2s* ws = wbuf; // initialize wavefront
|
||||
Point2s p((short)j, (short)i); // current pixel
|
||||
curlabel++; // next label
|
||||
int count = 0; // current region size
|
||||
ls[j] = curlabel;
|
||||
|
||||
|
||||
// wavefront propagation
|
||||
while( ws >= wbuf ) // wavefront not empty
|
||||
{
|
||||
@ -914,50 +914,50 @@ void cv::filterSpeckles( InputOutputArray _img, double _newval, int maxSpeckleSi
|
||||
short* dpp = &img.at<short>(p.y, p.x);
|
||||
short dp = *dpp;
|
||||
int* lpp = labels + width*p.y + p.x;
|
||||
|
||||
|
||||
if( p.x < width-1 && !lpp[+1] && dpp[+1] != newVal && std::abs(dp - dpp[+1]) <= maxDiff )
|
||||
{
|
||||
lpp[+1] = curlabel;
|
||||
*ws++ = Point2s(p.x+1, p.y);
|
||||
}
|
||||
|
||||
|
||||
if( p.x > 0 && !lpp[-1] && dpp[-1] != newVal && std::abs(dp - dpp[-1]) <= maxDiff )
|
||||
{
|
||||
lpp[-1] = curlabel;
|
||||
*ws++ = Point2s(p.x-1, p.y);
|
||||
}
|
||||
|
||||
|
||||
if( p.y < height-1 && !lpp[+width] && dpp[+dstep] != newVal && std::abs(dp - dpp[+dstep]) <= maxDiff )
|
||||
{
|
||||
lpp[+width] = curlabel;
|
||||
*ws++ = Point2s(p.x, p.y+1);
|
||||
}
|
||||
|
||||
|
||||
if( p.y > 0 && !lpp[-width] && dpp[-dstep] != newVal && std::abs(dp - dpp[-dstep]) <= maxDiff )
|
||||
{
|
||||
lpp[-width] = curlabel;
|
||||
*ws++ = Point2s(p.x, p.y-1);
|
||||
}
|
||||
|
||||
|
||||
// pop most recent and propagate
|
||||
// NB: could try least recent, maybe better convergence
|
||||
p = *--ws;
|
||||
}
|
||||
|
||||
|
||||
// assign label type
|
||||
if( count <= maxSpeckleSize ) // speckle region
|
||||
if( count <= maxSpeckleSize ) // speckle region
|
||||
{
|
||||
rtype[ls[j]] = 1; // small region label
|
||||
rtype[ls[j]] = 1; // small region label
|
||||
ds[j] = (short)newVal;
|
||||
}
|
||||
else
|
||||
rtype[ls[j]] = 0; // large region label
|
||||
rtype[ls[j]] = 0; // large region label
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cv::validateDisparity( InputOutputArray _disp, InputArray _cost, int minDisparity,
|
||||
int numberOfDisparities, int disp12MaxDiff )
|
||||
{
|
||||
@ -971,32 +971,32 @@ void cv::validateDisparity( InputOutputArray _disp, InputArray _cost, int minDis
|
||||
const int DISP_SHIFT = 4, DISP_SCALE = 1 << DISP_SHIFT;
|
||||
int INVALID_DISP = minD - 1, INVALID_DISP_SCALED = INVALID_DISP*DISP_SCALE;
|
||||
int costType = cost.type();
|
||||
|
||||
|
||||
disp12MaxDiff *= DISP_SCALE;
|
||||
|
||||
|
||||
CV_Assert( numberOfDisparities > 0 && disp.type() == CV_16S &&
|
||||
(costType == CV_16S || costType == CV_32S) &&
|
||||
disp.size() == cost.size() );
|
||||
|
||||
|
||||
for( int y = 0; y < rows; y++ )
|
||||
{
|
||||
short* dptr = disp.ptr<short>(y);
|
||||
|
||||
|
||||
for( x = 0; x < cols; x++ )
|
||||
{
|
||||
disp2buf[x] = INVALID_DISP_SCALED;
|
||||
disp2cost[x] = INT_MAX;
|
||||
}
|
||||
|
||||
|
||||
if( costType == CV_16S )
|
||||
{
|
||||
const short* cptr = cost.ptr<short>(y);
|
||||
|
||||
|
||||
for( x = minX1; x < maxX1; x++ )
|
||||
{
|
||||
int d = dptr[x], c = cptr[x];
|
||||
int x2 = x - ((d + DISP_SCALE/2) >> DISP_SHIFT);
|
||||
|
||||
|
||||
if( disp2cost[x2] > c )
|
||||
{
|
||||
disp2cost[x2] = c;
|
||||
@ -1007,12 +1007,12 @@ void cv::validateDisparity( InputOutputArray _disp, InputArray _cost, int minDis
|
||||
else
|
||||
{
|
||||
const int* cptr = cost.ptr<int>(y);
|
||||
|
||||
|
||||
for( x = minX1; x < maxX1; x++ )
|
||||
{
|
||||
int d = dptr[x], c = cptr[x];
|
||||
int x2 = x - ((d + DISP_SCALE/2) >> DISP_SHIFT);
|
||||
|
||||
|
||||
if( disp2cost[x2] < c )
|
||||
{
|
||||
disp2cost[x2] = c;
|
||||
@ -1020,7 +1020,7 @@ void cv::validateDisparity( InputOutputArray _disp, InputArray _cost, int minDis
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( x = minX1; x < maxX1; x++ )
|
||||
{
|
||||
// we round the computed disparity both towards -inf and +inf and check
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -55,22 +55,22 @@ using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
//template<class T> ostream& operator<<(ostream& out, const Mat_<T>& mat)
|
||||
//{
|
||||
//{
|
||||
// for(Mat_<T>::const_iterator pos = mat.begin(), end = mat.end(); pos != end; ++pos)
|
||||
// out << *pos << " ";
|
||||
// return out;
|
||||
//}
|
||||
//ostream& operator<<(ostream& out, const Mat& mat) { return out << Mat_<double>(mat); }
|
||||
//ostream& operator<<(ostream& out, const Mat& mat) { return out << Mat_<double>(mat); }
|
||||
|
||||
Mat calcRvec(const vector<Point3f>& points, const Size& cornerSize)
|
||||
{
|
||||
{
|
||||
Point3f p00 = points[0];
|
||||
Point3f p10 = points[1];
|
||||
Point3f p01 = points[cornerSize.width];
|
||||
Point3f p01 = points[cornerSize.width];
|
||||
|
||||
Vec3d ex(p10.x - p00.x, p10.y - p00.y, p10.z - p00.z);
|
||||
Vec3d ey(p01.x - p00.x, p01.y - p00.y, p01.z - p00.z);
|
||||
Vec3d ez = ex.cross(ey);
|
||||
Vec3d ey(p01.x - p00.x, p01.y - p00.y, p01.z - p00.z);
|
||||
Vec3d ez = ex.cross(ey);
|
||||
|
||||
Mat rot(3, 3, CV_64F);
|
||||
*rot.ptr<Vec3d>(0) = ex;
|
||||
@ -89,7 +89,7 @@ public:
|
||||
{
|
||||
}
|
||||
~CV_CalibrateCameraArtificialTest() {}
|
||||
protected:
|
||||
protected:
|
||||
int r;
|
||||
|
||||
const static int JUST_FIND_CORNERS = 0;
|
||||
@ -111,7 +111,7 @@ protected:
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Bad shape of camera matrix returned \n");
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
|
||||
}
|
||||
}
|
||||
|
||||
double fx_e = camMat_est.at<double>(0, 0), fy_e = camMat_est.at<double>(1, 1);
|
||||
double cx_e = camMat_est.at<double>(0, 2), cy_e = camMat_est.at<double>(1, 2);
|
||||
@ -121,19 +121,19 @@ protected:
|
||||
const double eps = 1e-2;
|
||||
const double dlt = 1e-5;
|
||||
|
||||
bool fail = checkErr(fx_e, fx, eps, dlt) || checkErr(fy_e, fy, eps, dlt) ||
|
||||
checkErr(cx_e, cx, eps, dlt) || checkErr(cy_e, cy, eps, dlt);
|
||||
bool fail = checkErr(fx_e, fx, eps, dlt) || checkErr(fy_e, fy, eps, dlt) ||
|
||||
checkErr(cx_e, cx, eps, dlt) || checkErr(cy_e, cy, eps, dlt);
|
||||
|
||||
if (fail)
|
||||
{
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
ts->printf( cvtest::TS::LOG, "%d) Expected [Fx Fy Cx Cy] = [%.3f %.3f %.3f %.3f]\n", r, fx, fy, cx, cy);
|
||||
ts->printf( cvtest::TS::LOG, "%d) Estimated [Fx Fy Cx Cy] = [%.3f %.3f %.3f %.3f]\n", r, fx_e, fy_e, cx_e, cy_e);
|
||||
ts->printf( cvtest::TS::LOG, "%d) Estimated [Fx Fy Cx Cy] = [%.3f %.3f %.3f %.3f]\n", r, fx_e, fy_e, cx_e, cy_e);
|
||||
}
|
||||
|
||||
void compareDistCoeffs(const Mat_<double>& distCoeffs, const Mat& distCoeffs_est)
|
||||
{
|
||||
{
|
||||
const double *dt_e = distCoeffs_est.ptr<double>();
|
||||
|
||||
double k1_e = dt_e[0], k2_e = dt_e[1], k3_e = dt_e[4];
|
||||
@ -143,21 +143,21 @@ protected:
|
||||
double p1 = distCoeffs(0, 2), p2 = distCoeffs(0, 3);
|
||||
|
||||
const double eps = 5e-2;
|
||||
const double dlt = 1e-3;
|
||||
const double dlt = 1e-3;
|
||||
|
||||
const double eps_k3 = 5;
|
||||
const double dlt_k3 = 1e-3;
|
||||
const double dlt_k3 = 1e-3;
|
||||
|
||||
bool fail = checkErr(k1_e, k1, eps, dlt) || checkErr(k2_e, k2, eps, dlt) || checkErr(k3_e, k3, eps_k3, dlt_k3) ||
|
||||
checkErr(p1_e, p1, eps, dlt) || checkErr(p2_e, p2, eps, dlt);
|
||||
bool fail = checkErr(k1_e, k1, eps, dlt) || checkErr(k2_e, k2, eps, dlt) || checkErr(k3_e, k3, eps_k3, dlt_k3) ||
|
||||
checkErr(p1_e, p1, eps, dlt) || checkErr(p2_e, p2, eps, dlt);
|
||||
|
||||
if (fail)
|
||||
{
|
||||
// commented according to vp123's recomendation. TODO - improve accuaracy
|
||||
//ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); ss
|
||||
}
|
||||
//ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY); ss
|
||||
}
|
||||
ts->printf( cvtest::TS::LOG, "%d) DistCoeff exp=(%.2f, %.2f, %.4f, %.4f %.2f)\n", r, k1, k2, p1, p2, k3);
|
||||
ts->printf( cvtest::TS::LOG, "%d) DistCoeff est=(%.2f, %.2f, %.4f, %.4f %.2f)\n", r, k1_e, k2_e, p1_e, p2_e, k3_e);
|
||||
ts->printf( cvtest::TS::LOG, "%d) DistCoeff est=(%.2f, %.2f, %.4f, %.4f %.2f)\n", r, k1_e, k2_e, p1_e, p2_e, k3_e);
|
||||
ts->printf( cvtest::TS::LOG, "%d) AbsError = [%.5f %.5f %.5f %.5f %.5f]\n", r, fabs(k1-k1_e), fabs(k2-k2_e), fabs(p1-p1_e), fabs(p2-p2_e), fabs(k3-k3_e));
|
||||
}
|
||||
|
||||
@ -173,20 +173,20 @@ protected:
|
||||
const Point3d& tvec = *tvecs[i].ptr<Point3d>();
|
||||
const Point3d& tvec_est = *tvecs_est[i].ptr<Point3d>();
|
||||
|
||||
if (norm(tvec_est - tvec) > eps* (norm(tvec) + dlt))
|
||||
if (norm(tvec_est - tvec) > eps* (norm(tvec) + dlt))
|
||||
{
|
||||
if (err_count++ < errMsgNum)
|
||||
{
|
||||
if (err_count == errMsgNum)
|
||||
ts->printf( cvtest::TS::LOG, "%d) ...\n", r);
|
||||
else
|
||||
if (err_count == errMsgNum)
|
||||
ts->printf( cvtest::TS::LOG, "%d) ...\n", r);
|
||||
else
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "%d) Bad accuracy in returned tvecs. Index = %d\n", r, i);
|
||||
ts->printf( cvtest::TS::LOG, "%d) Bad accuracy in returned tvecs. Index = %d\n", r, i);
|
||||
ts->printf( cvtest::TS::LOG, "%d) norm(tvec_est - tvec) = %f, norm(tvec_exp) = %f \n", r, norm(tvec_est - tvec), norm(tvec));
|
||||
}
|
||||
}
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,20 +199,20 @@ protected:
|
||||
int err_count = 0;
|
||||
const int errMsgNum = 4;
|
||||
for(size_t i = 0; i < rvecs.size(); ++i)
|
||||
{
|
||||
{
|
||||
Rodrigues(rvecs[i], rmat);
|
||||
Rodrigues(rvecs_est[i], rmat_est);
|
||||
Rodrigues(rvecs_est[i], rmat_est);
|
||||
|
||||
if (norm(rmat_est, rmat) > eps* (norm(rmat) + dlt))
|
||||
{
|
||||
if (err_count++ < errMsgNum)
|
||||
{
|
||||
if (err_count == errMsgNum)
|
||||
ts->printf( cvtest::TS::LOG, "%d) ...\n", r);
|
||||
ts->printf( cvtest::TS::LOG, "%d) ...\n", r);
|
||||
else
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "%d) Bad accuracy in returned rvecs (rotation matrs). Index = %d\n", r, i);
|
||||
ts->printf( cvtest::TS::LOG, "%d) norm(rot_mat_est - rot_mat_exp) = %f, norm(rot_mat_exp) = %f \n", r, norm(rmat_est, rmat), norm(rmat));
|
||||
ts->printf( cvtest::TS::LOG, "%d) Bad accuracy in returned rvecs (rotation matrs). Index = %d\n", r, i);
|
||||
ts->printf( cvtest::TS::LOG, "%d) norm(rot_mat_est - rot_mat_exp) = %f, norm(rot_mat_exp) = %f \n", r, norm(rmat_est, rmat), norm(rmat));
|
||||
|
||||
}
|
||||
}
|
||||
@ -221,19 +221,19 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
double reprojectErrorWithoutIntrinsics(const vector<Point3f>& cb3d, const vector<Mat>& rvecs_exp, const vector<Mat>& tvecs_exp,
|
||||
double reprojectErrorWithoutIntrinsics(const vector<Point3f>& cb3d, const vector<Mat>& _rvecs_exp, const vector<Mat>& _tvecs_exp,
|
||||
const vector<Mat>& rvecs_est, const vector<Mat>& tvecs_est)
|
||||
{
|
||||
{
|
||||
const static Mat eye33 = Mat::eye(3, 3, CV_64F);
|
||||
const static Mat zero15 = Mat::zeros(1, 5, CV_64F);
|
||||
Mat chessboard3D(cb3d);
|
||||
Mat _chessboard3D(cb3d);
|
||||
vector<Point2f> uv_exp, uv_est;
|
||||
double res = 0;
|
||||
double res = 0;
|
||||
|
||||
for(size_t i = 0; i < rvecs_exp.size(); ++i)
|
||||
{
|
||||
projectPoints(chessboard3D, rvecs_exp[i], tvecs_exp[i], eye33, zero15, uv_exp);
|
||||
projectPoints(chessboard3D, rvecs_est[i], tvecs_est[i], eye33, zero15, uv_est);
|
||||
for(size_t i = 0; i < rvecs_exp.size(); ++i)
|
||||
{
|
||||
projectPoints(_chessboard3D, _rvecs_exp[i], _tvecs_exp[i], eye33, zero15, uv_exp);
|
||||
projectPoints(_chessboard3D, rvecs_est[i], tvecs_est[i], eye33, zero15, uv_est);
|
||||
for(size_t j = 0; j < cb3d.size(); ++j)
|
||||
res += norm(uv_exp[i] - uv_est[i]);
|
||||
}
|
||||
@ -243,7 +243,7 @@ protected:
|
||||
Size2f sqSile;
|
||||
|
||||
vector<Point3f> chessboard3D;
|
||||
vector<Mat> boards, rvecs_exp, tvecs_exp, rvecs_spnp, tvecs_spnp;
|
||||
vector<Mat> boards, rvecs_exp, tvecs_exp, rvecs_spnp, tvecs_spnp;
|
||||
vector< vector<Point3f> > objectPoints;
|
||||
vector< vector<Point2f> > imagePoints_art;
|
||||
vector< vector<Point2f> > imagePoints_findCb;
|
||||
@ -268,29 +268,29 @@ protected:
|
||||
imagePoints_findCb.clear();
|
||||
|
||||
vector<Point2f> corners_art, corners_fcb;
|
||||
for(size_t i = 0; i < brdsNum; ++i)
|
||||
{
|
||||
for(size_t i = 0; i < brdsNum; ++i)
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
boards[i] = cbg(bg, camMat, distCoeffs, sqSile, corners_art);
|
||||
if(findChessboardCorners(boards[i], cornersSize, corners_fcb))
|
||||
break;
|
||||
}
|
||||
if(findChessboardCorners(boards[i], cornersSize, corners_fcb))
|
||||
break;
|
||||
}
|
||||
|
||||
//cv::namedWindow("CB"); imshow("CB", boards[i]); cv::waitKey();
|
||||
|
||||
imagePoints_art.push_back(corners_art);
|
||||
imagePoints_art.push_back(corners_art);
|
||||
imagePoints_findCb.push_back(corners_fcb);
|
||||
|
||||
tvecs_exp[i].create(1, 3, CV_64F);
|
||||
*tvecs_exp[i].ptr<Point3d>() = cbg.corners3d[0];
|
||||
rvecs_exp[i] = calcRvec(cbg.corners3d, cbg.cornersSize());
|
||||
rvecs_exp[i] = calcRvec(cbg.corners3d, cbg.cornersSize());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void runTest(const Size& imgSize, const Mat_<double>& camMat, const Mat_<double>& distCoeffs, size_t brdsNum, const Size& cornersSize, int flag = 0)
|
||||
{
|
||||
{
|
||||
const TermCriteria tc(TermCriteria::EPS|TermCriteria::MAX_ITER, 30, 0.1);
|
||||
|
||||
vector< vector<Point2f> > imagePoints;
|
||||
@ -300,9 +300,9 @@ protected:
|
||||
case JUST_FIND_CORNERS: imagePoints = imagePoints_findCb; break;
|
||||
case ARTIFICIAL_CORNERS: imagePoints = imagePoints_art; break;
|
||||
|
||||
case USE_CORNERS_SUBPIX:
|
||||
case USE_CORNERS_SUBPIX:
|
||||
for(size_t i = 0; i < brdsNum; ++i)
|
||||
{
|
||||
{
|
||||
Mat gray;
|
||||
cvtColor(boards[i], gray, CV_BGR2GRAY);
|
||||
vector<Point2f> tmp = imagePoints_findCb[i];
|
||||
@ -312,9 +312,9 @@ protected:
|
||||
break;
|
||||
case USE_4QUAD_CORNERS:
|
||||
for(size_t i = 0; i < brdsNum; ++i)
|
||||
{
|
||||
{
|
||||
Mat gray;
|
||||
cvtColor(boards[i], gray, CV_BGR2GRAY);
|
||||
cvtColor(boards[i], gray, CV_BGR2GRAY);
|
||||
vector<Point2f> tmp = imagePoints_findCb[i];
|
||||
find4QuadCornerSubpix(gray, tmp, Size(5, 5));
|
||||
imagePoints.push_back(tmp);
|
||||
@ -323,7 +323,7 @@ protected:
|
||||
default:
|
||||
throw std::exception();
|
||||
}
|
||||
|
||||
|
||||
Mat camMat_est = Mat::eye(3, 3, CV_64F), distCoeffs_est = Mat::zeros(1, 5, CV_64F);
|
||||
vector<Mat> rvecs_est, tvecs_est;
|
||||
|
||||
@ -342,9 +342,9 @@ protected:
|
||||
compareCameraMatrs(camMat, camMat_est);
|
||||
compareDistCoeffs(distCoeffs, distCoeffs_est);
|
||||
compareShiftVecs(tvecs_exp, tvecs_est);
|
||||
compareRotationVecs(rvecs_exp, rvecs_est);
|
||||
compareRotationVecs(rvecs_exp, rvecs_est);
|
||||
|
||||
double rep_errorWOI = reprojectErrorWithoutIntrinsics(chessboard3D, rvecs_exp, tvecs_exp, rvecs_est, tvecs_est);
|
||||
double rep_errorWOI = reprojectErrorWithoutIntrinsics(chessboard3D, rvecs_exp, tvecs_exp, rvecs_est, tvecs_est);
|
||||
rep_errorWOI /= brdsNum * cornersSize.area();
|
||||
|
||||
const double thres2 = 0.01;
|
||||
@ -352,8 +352,8 @@ protected:
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "%d) Too big reproject error without intrinsics = %f\n", r, rep_errorWOI);
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ts->printf( cvtest::TS::LOG, "%d) Testing solvePnP...\n", r);
|
||||
rvecs_spnp.resize(brdsNum);
|
||||
tvecs_spnp.resize(brdsNum);
|
||||
@ -361,11 +361,11 @@ protected:
|
||||
solvePnP(Mat(objectPoints[i]), Mat(imagePoints[i]), camMat, distCoeffs, rvecs_spnp[i], tvecs_spnp[i]);
|
||||
|
||||
compareShiftVecs(tvecs_exp, tvecs_spnp);
|
||||
compareRotationVecs(rvecs_exp, rvecs_spnp);
|
||||
compareRotationVecs(rvecs_exp, rvecs_spnp);
|
||||
}
|
||||
|
||||
void run(int)
|
||||
{
|
||||
{
|
||||
|
||||
ts->set_failed_test_info(cvtest::TS::OK);
|
||||
RNG& rng = theRNG();
|
||||
@ -373,11 +373,11 @@ protected:
|
||||
int progress = 0;
|
||||
int repeat_num = 3;
|
||||
for(r = 0; r < repeat_num; ++r)
|
||||
{
|
||||
const int brds_num = 20;
|
||||
{
|
||||
const int brds_num = 20;
|
||||
|
||||
Mat bg(Size(640, 480), CV_8UC3);
|
||||
randu(bg, Scalar::all(32), Scalar::all(255));
|
||||
Mat bg(Size(640, 480), CV_8UC3);
|
||||
randu(bg, Scalar::all(32), Scalar::all(255));
|
||||
GaussianBlur(bg, bg, Size(5, 5), 2);
|
||||
|
||||
double fx = 300 + (20 * (double)rng - 10);
|
||||
@ -399,20 +399,20 @@ protected:
|
||||
Mat_<double> distCoeffs(1, 5, 0.0);
|
||||
distCoeffs << k1, k2, p1, p2, k3;
|
||||
|
||||
ChessBoardGenerator cbg(Size(9, 8));
|
||||
ChessBoardGenerator cbg(Size(9, 8));
|
||||
cbg.min_cos = 0.9;
|
||||
cbg.cov = 0.8;
|
||||
|
||||
progress = update_progress(progress, r, repeat_num, 0);
|
||||
ts->printf( cvtest::TS::LOG, "\n");
|
||||
ts->printf( cvtest::TS::LOG, "\n");
|
||||
prepareForTest(bg, camMat, distCoeffs, brds_num, cbg);
|
||||
|
||||
ts->printf( cvtest::TS::LOG, "artificial corners\n");
|
||||
runTest(bg.size(), camMat, distCoeffs, brds_num, cbg.cornersSize(), ARTIFICIAL_CORNERS);
|
||||
ts->printf( cvtest::TS::LOG, "artificial corners\n");
|
||||
runTest(bg.size(), camMat, distCoeffs, brds_num, cbg.cornersSize(), ARTIFICIAL_CORNERS);
|
||||
progress = update_progress(progress, r, repeat_num, 0);
|
||||
|
||||
ts->printf( cvtest::TS::LOG, "findChessboard corners\n");
|
||||
runTest(bg.size(), camMat, distCoeffs, brds_num, cbg.cornersSize(), JUST_FIND_CORNERS);
|
||||
runTest(bg.size(), camMat, distCoeffs, brds_num, cbg.cornersSize(), JUST_FIND_CORNERS);
|
||||
progress = update_progress(progress, r, repeat_num, 0);
|
||||
|
||||
ts->printf( cvtest::TS::LOG, "cornersSubPix corners\n");
|
||||
@ -424,6 +424,6 @@ protected:
|
||||
progress = update_progress(progress, r, repeat_num, 0);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
TEST(Calib3d_CalibrateCamera_CPP, accuracy_on_artificial_data) { CV_CalibrateCameraArtificialTest test; test.safe_run(); }
|
||||
|
@ -54,9 +54,9 @@ void show_points( const Mat& gray, const Mat& u, const vector<Point2f>& v, Size
|
||||
{
|
||||
Mat rgb( gray.size(), CV_8U);
|
||||
merge(vector<Mat>(3, gray), rgb);
|
||||
|
||||
|
||||
for(size_t i = 0; i < v.size(); i++ )
|
||||
circle( rgb, v[i], 3, CV_RGB(255, 0, 0), CV_FILLED);
|
||||
circle( rgb, v[i], 3, CV_RGB(255, 0, 0), CV_FILLED);
|
||||
|
||||
if( !u.empty() )
|
||||
{
|
||||
@ -67,7 +67,7 @@ void show_points( const Mat& gray, const Mat& u, const vector<Point2f>& v, Size
|
||||
}
|
||||
if (!v.empty())
|
||||
{
|
||||
Mat corners((int)v.size(), 1, CV_32FC2, (void*)&v[0]);
|
||||
Mat corners((int)v.size(), 1, CV_32FC2, (void*)&v[0]);
|
||||
drawChessboardCorners( rgb, pattern_size, corners, was_found );
|
||||
}
|
||||
//namedWindow( "test", 0 ); imshow( "test", rgb ); waitKey(0);
|
||||
@ -122,11 +122,11 @@ double calcError(const vector<Point2f>& v, const Mat& u)
|
||||
//printf("\n");
|
||||
err = min(err, err1);
|
||||
}
|
||||
|
||||
|
||||
#if defined(_L2_ERR)
|
||||
err = sqrt(err/count_exp);
|
||||
#endif //_L2_ERR
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -137,8 +137,7 @@ const double precise_success_error_level = 2;
|
||||
/* ///////////////////// chess_corner_test ///////////////////////// */
|
||||
void CV_ChessboardDetectorTest::run( int /*start_from */)
|
||||
{
|
||||
cvtest::TS& ts = *this->ts;
|
||||
ts.set_failed_test_info( cvtest::TS::OK );
|
||||
ts->set_failed_test_info( cvtest::TS::OK );
|
||||
|
||||
/*if (!checkByGenerator())
|
||||
return;*/
|
||||
@ -146,23 +145,23 @@ void CV_ChessboardDetectorTest::run( int /*start_from */)
|
||||
{
|
||||
case CHESSBOARD:
|
||||
checkByGenerator();
|
||||
if (ts.get_err_code() != cvtest::TS::OK)
|
||||
if (ts->get_err_code() != cvtest::TS::OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
run_batch("negative_list.dat");
|
||||
if (ts.get_err_code() != cvtest::TS::OK)
|
||||
if (ts->get_err_code() != cvtest::TS::OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
run_batch("chessboard_list.dat");
|
||||
if (ts.get_err_code() != cvtest::TS::OK)
|
||||
if (ts->get_err_code() != cvtest::TS::OK)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
run_batch("chessboard_list_subpixel.dat");
|
||||
break;
|
||||
case CIRCLES_GRID:
|
||||
@ -176,36 +175,34 @@ void CV_ChessboardDetectorTest::run( int /*start_from */)
|
||||
|
||||
void CV_ChessboardDetectorTest::run_batch( const string& filename )
|
||||
{
|
||||
cvtest::TS& ts = *this->ts;
|
||||
|
||||
ts.printf(cvtest::TS::LOG, "\nRunning batch %s\n", filename.c_str());
|
||||
ts->printf(cvtest::TS::LOG, "\nRunning batch %s\n", filename.c_str());
|
||||
//#define WRITE_POINTS 1
|
||||
#ifndef WRITE_POINTS
|
||||
#ifndef WRITE_POINTS
|
||||
double max_rough_error = 0, max_precise_error = 0;
|
||||
#endif
|
||||
string folder;
|
||||
switch( pattern )
|
||||
{
|
||||
case CHESSBOARD:
|
||||
folder = string(ts.get_data_path()) + "cameracalibration/";
|
||||
folder = string(ts->get_data_path()) + "cameracalibration/";
|
||||
break;
|
||||
case CIRCLES_GRID:
|
||||
folder = string(ts.get_data_path()) + "cameracalibration/circles/";
|
||||
folder = string(ts->get_data_path()) + "cameracalibration/circles/";
|
||||
break;
|
||||
case ASYMMETRIC_CIRCLES_GRID:
|
||||
folder = string(ts.get_data_path()) + "cameracalibration/asymmetric_circles/";
|
||||
folder = string(ts->get_data_path()) + "cameracalibration/asymmetric_circles/";
|
||||
break;
|
||||
}
|
||||
|
||||
FileStorage fs( folder + filename, FileStorage::READ );
|
||||
FileNode board_list = fs["boards"];
|
||||
|
||||
|
||||
if( !fs.isOpened() || board_list.empty() || !board_list.isSeq() || board_list.size() % 2 != 0 )
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "%s can not be readed or is not valid\n", (folder + filename).c_str() );
|
||||
ts.printf( cvtest::TS::LOG, "fs.isOpened=%d, board_list.empty=%d, board_list.isSeq=%d,board_list.size()%2=%d\n",
|
||||
ts->printf( cvtest::TS::LOG, "%s can not be readed or is not valid\n", (folder + filename).c_str() );
|
||||
ts->printf( cvtest::TS::LOG, "fs.isOpened=%d, board_list.empty=%d, board_list.isSeq=%d,board_list.size()%2=%d\n",
|
||||
fs.isOpened(), (int)board_list.empty(), board_list.isSeq(), board_list.size()%2);
|
||||
ts.set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -216,29 +213,29 @@ void CV_ChessboardDetectorTest::run_batch( const string& filename )
|
||||
|
||||
for(int idx = 0; idx < max_idx; ++idx )
|
||||
{
|
||||
ts.update_context( this, idx, true );
|
||||
|
||||
ts->update_context( this, idx, true );
|
||||
|
||||
/* read the image */
|
||||
string img_file = board_list[idx * 2];
|
||||
string img_file = board_list[idx * 2];
|
||||
Mat gray = imread( folder + img_file, 0);
|
||||
|
||||
|
||||
if( gray.empty() )
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "one of chessboard images can't be read: %s\n", img_file.c_str() );
|
||||
ts.set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
|
||||
ts->printf( cvtest::TS::LOG, "one of chessboard images can't be read: %s\n", img_file.c_str() );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_MISSING_TEST_DATA );
|
||||
return;
|
||||
}
|
||||
|
||||
string filename = folder + (string)board_list[idx * 2 + 1];
|
||||
string _filename = folder + (string)board_list[idx * 2 + 1];
|
||||
bool doesContatinChessboard;
|
||||
Mat expected;
|
||||
{
|
||||
FileStorage fs(filename, FileStorage::READ);
|
||||
fs["corners"] >> expected;
|
||||
fs["isFound"] >> doesContatinChessboard;
|
||||
fs.release();
|
||||
}
|
||||
size_t count_exp = static_cast<size_t>(expected.cols * expected.rows);
|
||||
FileStorage fs1(_filename, FileStorage::READ);
|
||||
fs1["corners"] >> expected;
|
||||
fs1["isFound"] >> doesContatinChessboard;
|
||||
fs1.release();
|
||||
}
|
||||
size_t count_exp = static_cast<size_t>(expected.cols * expected.rows);
|
||||
Size pattern_size = expected.size();
|
||||
|
||||
vector<Point2f> v;
|
||||
@ -256,11 +253,11 @@ void CV_ChessboardDetectorTest::run_batch( const string& filename )
|
||||
break;
|
||||
}
|
||||
show_points( gray, Mat(), v, pattern_size, result );
|
||||
|
||||
|
||||
if( result ^ doesContatinChessboard || v.size() != count_exp )
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "chessboard is detected incorrectly in %s\n", img_file.c_str() );
|
||||
ts.set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
||||
ts->printf( cvtest::TS::LOG, "chessboard is detected incorrectly in %s\n", img_file.c_str() );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
||||
return;
|
||||
}
|
||||
|
||||
@ -291,45 +288,45 @@ void CV_ChessboardDetectorTest::run_batch( const string& filename )
|
||||
#if 1
|
||||
if( err > precise_success_error_level )
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Image %s: bad accuracy of adjusted corners %f\n", img_file.c_str(), err );
|
||||
ts.set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
ts->printf( cvtest::TS::LOG, "Image %s: bad accuracy of adjusted corners %f\n", img_file.c_str(), err );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
ts.printf(cvtest::TS::LOG, "Error on %s is %f\n", img_file.c_str(), err);
|
||||
ts->printf(cvtest::TS::LOG, "Error on %s is %f\n", img_file.c_str(), err);
|
||||
max_precise_error = MAX( max_precise_error, err );
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef WRITE_POINTS
|
||||
Mat mat_v(pattern_size, CV_32FC2, (void*)&v[0]);
|
||||
FileStorage fs(filename, FileStorage::WRITE);
|
||||
FileStorage fs(_filename, FileStorage::WRITE);
|
||||
fs << "isFound" << result;
|
||||
fs << "corners" << mat_v;
|
||||
fs.release();
|
||||
#endif
|
||||
progress = update_progress( progress, idx, max_idx, 0 );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
sum_error /= count;
|
||||
ts.printf(cvtest::TS::LOG, "Average error is %f\n", sum_error);
|
||||
ts->printf(cvtest::TS::LOG, "Average error is %f\n", sum_error);
|
||||
}
|
||||
|
||||
double calcErrorMinError(const Size& cornSz, const vector<Point2f>& corners_found, const vector<Point2f>& corners_generated)
|
||||
{
|
||||
Mat m1(cornSz, CV_32FC2, (Point2f*)&corners_generated[0]);
|
||||
Mat m1(cornSz, CV_32FC2, (Point2f*)&corners_generated[0]);
|
||||
Mat m2; flip(m1, m2, 0);
|
||||
|
||||
Mat m3; flip(m1, m3, 1); m3 = m3.t(); flip(m3, m3, 1);
|
||||
|
||||
|
||||
Mat m4 = m1.t(); flip(m4, m4, 1);
|
||||
|
||||
double min1 = min(calcError(corners_found, m1), calcError(corners_found, m2));
|
||||
double min2 = min(calcError(corners_found, m3), calcError(corners_found, m4));
|
||||
double min1 = min(calcError(corners_found, m1), calcError(corners_found, m2));
|
||||
double min2 = min(calcError(corners_found, m3), calcError(corners_found, m4));
|
||||
return min(min1, min2);
|
||||
}
|
||||
|
||||
bool validateData(const ChessBoardGenerator& cbg, const Size& imgSz,
|
||||
bool validateData(const ChessBoardGenerator& cbg, const Size& imgSz,
|
||||
const vector<Point2f>& corners_generated)
|
||||
{
|
||||
Size cornersSize = cbg.cornersSize();
|
||||
@ -341,7 +338,7 @@ bool validateData(const ChessBoardGenerator& cbg, const Size& imgSz,
|
||||
for(int j = 1; j < mat.cols - 2; ++j)
|
||||
{
|
||||
const Point2f& cur = mat(i, j);
|
||||
|
||||
|
||||
tmp = norm( cur - mat(i + 1, j + 1) );
|
||||
if (tmp < minNeibDist)
|
||||
tmp = minNeibDist;
|
||||
@ -361,33 +358,33 @@ bool validateData(const ChessBoardGenerator& cbg, const Size& imgSz,
|
||||
|
||||
const double threshold = 0.25;
|
||||
double cbsize = (max(cornersSize.width, cornersSize.height) + 1) * minNeibDist;
|
||||
int imgsize = min(imgSz.height, imgSz.width);
|
||||
int imgsize = min(imgSz.height, imgSz.width);
|
||||
return imgsize * threshold < cbsize;
|
||||
}
|
||||
|
||||
bool CV_ChessboardDetectorTest::checkByGenerator()
|
||||
{
|
||||
{
|
||||
bool res = true;
|
||||
//theRNG() = 0x58e6e895b9913160;
|
||||
//cv::DefaultRngAuto dra;
|
||||
//theRNG() = *ts->get_rng();
|
||||
|
||||
Mat bg(Size(800, 600), CV_8UC3, Scalar::all(255));
|
||||
randu(bg, Scalar::all(0), Scalar::all(255));
|
||||
GaussianBlur(bg, bg, Size(7,7), 3.0);
|
||||
|
||||
Mat bg(Size(800, 600), CV_8UC3, Scalar::all(255));
|
||||
randu(bg, Scalar::all(0), Scalar::all(255));
|
||||
GaussianBlur(bg, bg, Size(7,7), 3.0);
|
||||
|
||||
Mat_<float> camMat(3, 3);
|
||||
camMat << 300.f, 0.f, bg.cols/2.f, 0, 300.f, bg.rows/2.f, 0.f, 0.f, 1.f;
|
||||
|
||||
|
||||
Mat_<float> distCoeffs(1, 5);
|
||||
distCoeffs << 1.2f, 0.2f, 0.f, 0.f, 0.f;
|
||||
|
||||
const Size sizes[] = { Size(6, 6), Size(8, 6), Size(11, 12), Size(5, 4) };
|
||||
const size_t sizes_num = sizeof(sizes)/sizeof(sizes[0]);
|
||||
const int test_num = 16;
|
||||
const size_t sizes_num = sizeof(sizes)/sizeof(sizes[0]);
|
||||
const int test_num = 16;
|
||||
int progress = 0;
|
||||
for(int i = 0; i < test_num; ++i)
|
||||
{
|
||||
{
|
||||
progress = update_progress( progress, i, test_num, 0 );
|
||||
ChessBoardGenerator cbg(sizes[i % sizes_num]);
|
||||
|
||||
@ -398,37 +395,37 @@ bool CV_ChessboardDetectorTest::checkByGenerator()
|
||||
if(!validateData(cbg, cb.size(), corners_generated))
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Chess board skipped - too small" );
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*cb = cb * 0.8 + Scalar::all(30);
|
||||
/*cb = cb * 0.8 + Scalar::all(30);
|
||||
GaussianBlur(cb, cb, Size(3, 3), 0.8); */
|
||||
//cv::addWeighted(cb, 0.8, bg, 0.2, 20, cb);
|
||||
//cv::addWeighted(cb, 0.8, bg, 0.2, 20, cb);
|
||||
//cv::namedWindow("CB"); cv::imshow("CB", cb); cv::waitKey();
|
||||
|
||||
|
||||
vector<Point2f> corners_found;
|
||||
int flags = i % 8; // need to check branches for all flags
|
||||
bool found = findChessboardCorners(cb, cbg.cornersSize(), corners_found, flags);
|
||||
if (!found)
|
||||
{
|
||||
if (!found)
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Chess board corners not found\n" );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
res = false;
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
double err = calcErrorMinError(cbg.cornersSize(), corners_found, corners_generated);
|
||||
double err = calcErrorMinError(cbg.cornersSize(), corners_found, corners_generated);
|
||||
if( err > rough_success_error_level )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "bad accuracy of corner guesses" );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
res = false;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ***** negative ***** */
|
||||
{
|
||||
{
|
||||
vector<Point2f> corners_found;
|
||||
bool found = findChessboardCorners(bg, Size(8, 7), corners_found);
|
||||
if (found)
|
||||
@ -437,27 +434,27 @@ bool CV_ChessboardDetectorTest::checkByGenerator()
|
||||
ChessBoardGenerator cbg(Size(8, 7));
|
||||
|
||||
vector<Point2f> cg;
|
||||
Mat cb = cbg(bg, camMat, distCoeffs, cg);
|
||||
Mat cb = cbg(bg, camMat, distCoeffs, cg);
|
||||
|
||||
found = findChessboardCorners(cb, Size(3, 4), corners_found);
|
||||
if (found)
|
||||
res = false;
|
||||
res = false;
|
||||
|
||||
Point2f c = std::accumulate(cg.begin(), cg.end(), Point2f(), plus<Point2f>()) * (1.f/cg.size());
|
||||
|
||||
Mat_<double> aff(2, 3);
|
||||
aff << 1.0, 0.0, -(double)c.x, 0.0, 1.0, 0.0;
|
||||
Mat sh;
|
||||
warpAffine(cb, sh, aff, cb.size());
|
||||
warpAffine(cb, sh, aff, cb.size());
|
||||
|
||||
found = findChessboardCorners(sh, cbg.cornersSize(), corners_found);
|
||||
if (found)
|
||||
res = false;
|
||||
|
||||
res = false;
|
||||
|
||||
vector< vector<Point> > cnts(1);
|
||||
vector<Point>& cnt = cnts[0];
|
||||
cnt.push_back(cg[ 0]); cnt.push_back(cg[0+2]);
|
||||
cnt.push_back(cg[7+0]); cnt.push_back(cg[7+2]);
|
||||
cnt.push_back(cg[ 0]); cnt.push_back(cg[0+2]);
|
||||
cnt.push_back(cg[7+0]); cnt.push_back(cg[7+2]);
|
||||
cv::drawContours(cb, cnts, -1, Scalar::all(128), CV_FILLED);
|
||||
|
||||
found = findChessboardCorners(cb, cbg.cornersSize(), corners_found);
|
||||
@ -466,7 +463,7 @@ bool CV_ChessboardDetectorTest::checkByGenerator()
|
||||
|
||||
cv::drawChessboardCorners(cb, cbg.cornersSize(), Mat(corners_found), found);
|
||||
}
|
||||
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -47,87 +47,87 @@ using namespace std;
|
||||
|
||||
class Differential
|
||||
{
|
||||
public:
|
||||
typedef Mat_<double> mat_t;
|
||||
public:
|
||||
typedef Mat_<double> mat_t;
|
||||
|
||||
Differential(double eps_, const mat_t& rv1_, const mat_t& tv1_, const mat_t& rv2_, const mat_t& tv2_)
|
||||
Differential(double eps_, const mat_t& rv1_, const mat_t& tv1_, const mat_t& rv2_, const mat_t& tv2_)
|
||||
: rv1(rv1_), tv1(tv1_), rv2(rv2_), tv2(tv2_), eps(eps_), ev(3, 1) {}
|
||||
|
||||
void dRv1(mat_t& dr3_dr1, mat_t& dt3_dr1)
|
||||
{
|
||||
{
|
||||
dr3_dr1.create(3, 3); dt3_dr1.create(3, 3);
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
{
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1 + ev, tv1, rv2, tv2, rv3_p, tv3_p);
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1 + ev, tv1, rv2, tv2, rv3_p, tv3_p);
|
||||
composeRT( rv1 - ev, tv1, rv2, tv2, rv3_m, tv3_m);
|
||||
|
||||
dr3_dr1.col(i) = rv3_p - rv3_m;
|
||||
dt3_dr1.col(i) = tv3_p - tv3_m;
|
||||
dr3_dr1.col(i) = rv3_p - rv3_m;
|
||||
dt3_dr1.col(i) = tv3_p - tv3_m;
|
||||
}
|
||||
dr3_dr1 /= 2 * eps; dt3_dr1 /= 2 * eps;
|
||||
}
|
||||
|
||||
void dRv2(mat_t& dr3_dr2, mat_t& dt3_dr2)
|
||||
{
|
||||
{
|
||||
dr3_dr2.create(3, 3); dt3_dr2.create(3, 3);
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
{
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1, rv2 + ev, tv2, rv3_p, tv3_p);
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1, rv2 + ev, tv2, rv3_p, tv3_p);
|
||||
composeRT( rv1, tv1, rv2 - ev, tv2, rv3_m, tv3_m);
|
||||
|
||||
dr3_dr2.col(i) = rv3_p - rv3_m;
|
||||
dt3_dr2.col(i) = tv3_p - tv3_m;
|
||||
dr3_dr2.col(i) = rv3_p - rv3_m;
|
||||
dt3_dr2.col(i) = tv3_p - tv3_m;
|
||||
}
|
||||
dr3_dr2 /= 2 * eps; dt3_dr2 /= 2 * eps;
|
||||
}
|
||||
|
||||
void dTv1(mat_t& drt3_dt1, mat_t& dt3_dt1)
|
||||
{
|
||||
{
|
||||
drt3_dt1.create(3, 3); dt3_dt1.create(3, 3);
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
{
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1 + ev, rv2, tv2, rv3_p, tv3_p);
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1 + ev, rv2, tv2, rv3_p, tv3_p);
|
||||
composeRT( rv1, tv1 - ev, rv2, tv2, rv3_m, tv3_m);
|
||||
|
||||
drt3_dt1.col(i) = rv3_p - rv3_m;
|
||||
dt3_dt1.col(i) = tv3_p - tv3_m;
|
||||
drt3_dt1.col(i) = rv3_p - rv3_m;
|
||||
dt3_dt1.col(i) = tv3_p - tv3_m;
|
||||
}
|
||||
drt3_dt1 /= 2 * eps; dt3_dt1 /= 2 * eps;
|
||||
}
|
||||
|
||||
void dTv2(mat_t& dr3_dt2, mat_t& dt3_dt2)
|
||||
{
|
||||
{
|
||||
dr3_dt2.create(3, 3); dt3_dt2.create(3, 3);
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
|
||||
for(int i = 0; i < 3; ++i)
|
||||
{
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1, rv2, tv2 + ev, rv3_p, tv3_p);
|
||||
ev.setTo(Scalar(0)); ev(i, 0) = eps;
|
||||
|
||||
composeRT( rv1, tv1, rv2, tv2 + ev, rv3_p, tv3_p);
|
||||
composeRT( rv1, tv1, rv2, tv2 - ev, rv3_m, tv3_m);
|
||||
|
||||
dr3_dt2.col(i) = rv3_p - rv3_m;
|
||||
dt3_dt2.col(i) = tv3_p - tv3_m;
|
||||
dr3_dt2.col(i) = rv3_p - rv3_m;
|
||||
dt3_dt2.col(i) = tv3_p - tv3_m;
|
||||
}
|
||||
dr3_dt2 /= 2 * eps; dt3_dt2 /= 2 * eps;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
const mat_t& rv1, tv1, rv2, tv2;
|
||||
double eps;
|
||||
Mat_<double> ev;
|
||||
|
||||
|
||||
Differential& operator=(const Differential&);
|
||||
Mat rv3_m, tv3_m, rv3_p, tv3_p;
|
||||
Mat rv3_m, tv3_m, rv3_p, tv3_p;
|
||||
};
|
||||
|
||||
class CV_composeRT_Test : public cvtest::BaseTest
|
||||
@ -135,24 +135,23 @@ class CV_composeRT_Test : public cvtest::BaseTest
|
||||
public:
|
||||
CV_composeRT_Test() {}
|
||||
~CV_composeRT_Test() {}
|
||||
protected:
|
||||
|
||||
protected:
|
||||
|
||||
void run(int)
|
||||
{
|
||||
cvtest::TS& ts = *this->ts;
|
||||
ts.set_failed_test_info(cvtest::TS::OK);
|
||||
|
||||
Mat_<double> rvec1(3, 1), tvec1(3, 1), rvec2(3, 1), tvec2(3, 1);
|
||||
ts->set_failed_test_info(cvtest::TS::OK);
|
||||
|
||||
Mat_<double> rvec1(3, 1), tvec1(3, 1), rvec2(3, 1), tvec2(3, 1);
|
||||
|
||||
randu(rvec1, Scalar(0), Scalar(6.29));
|
||||
randu(rvec2, Scalar(0), Scalar(6.29));
|
||||
|
||||
randu(tvec1, Scalar(-2), Scalar(2));
|
||||
randu(tvec2, Scalar(-2), Scalar(2));
|
||||
|
||||
|
||||
Mat rvec3, tvec3;
|
||||
composeRT(rvec1, tvec1, rvec2, tvec2, rvec3, tvec3);
|
||||
|
||||
|
||||
Mat rvec3_exp, tvec3_exp;
|
||||
|
||||
Mat rmat1, rmat2;
|
||||
@ -164,53 +163,53 @@ protected:
|
||||
|
||||
const double thres = 1e-5;
|
||||
if (norm(rvec3_exp, rvec3) > thres || norm(tvec3_exp, tvec3) > thres)
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
|
||||
const double eps = 1e-3;
|
||||
Differential diff(eps, rvec1, tvec1, rvec2, tvec2);
|
||||
|
||||
|
||||
Mat dr3dr1, dr3dt1, dr3dr2, dr3dt2, dt3dr1, dt3dt1, dt3dr2, dt3dt2;
|
||||
|
||||
composeRT(rvec1, tvec1, rvec2, tvec2, rvec3, tvec3,
|
||||
composeRT(rvec1, tvec1, rvec2, tvec2, rvec3, tvec3,
|
||||
dr3dr1, dr3dt1, dr3dr2, dr3dt2, dt3dr1, dt3dt1, dt3dr2, dt3dt2);
|
||||
|
||||
|
||||
Mat_<double> dr3_dr1, dt3_dr1;
|
||||
diff.dRv1(dr3_dr1, dt3_dr1);
|
||||
|
||||
if (norm(dr3_dr1, dr3dr1) > thres || norm(dt3_dr1, dt3dr1) > thres)
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Invalid derivates by r1\n" );
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid derivates by r1\n" );
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
|
||||
Mat_<double> dr3_dr2, dt3_dr2;
|
||||
diff.dRv2(dr3_dr2, dt3_dr2);
|
||||
|
||||
if (norm(dr3_dr2, dr3dr2) > thres || norm(dt3_dr2, dt3dr2) > thres)
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Invalid derivates by r2\n" );
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid derivates by r2\n" );
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
|
||||
Mat_<double> dr3_dt1, dt3_dt1;
|
||||
diff.dTv1(dr3_dt1, dt3_dt1);
|
||||
|
||||
if (norm(dr3_dt1, dr3dt1) > thres || norm(dt3_dt1, dt3dt1) > thres)
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Invalid derivates by t1\n" );
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid derivates by t1\n" );
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
|
||||
|
||||
Mat_<double> dr3_dt2, dt3_dt2;
|
||||
diff.dTv2(dr3_dt2, dt3_dt2);
|
||||
|
||||
if (norm(dr3_dt2, dr3dt2) > thres || norm(dt3_dt2, dt3dt2) > thres)
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Invalid derivates by t2\n" );
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Invalid derivates by t2\n" );
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
TEST(Calib3d_ComposeRT, accuracy) { CV_composeRT_Test test; test.safe_run(); }
|
||||
|
||||
|
@ -86,20 +86,20 @@ protected:
|
||||
double sigma;
|
||||
|
||||
private:
|
||||
float max_diff, max_2diff;
|
||||
bool check_matrix_size(const cv::Mat& H);
|
||||
bool check_matrix_diff(const cv::Mat& original, const cv::Mat& found, const int norm_type, double &diff);
|
||||
float max_diff, max_2diff;
|
||||
bool check_matrix_size(const cv::Mat& H);
|
||||
bool check_matrix_diff(const cv::Mat& original, const cv::Mat& found, const int norm_type, double &diff);
|
||||
int check_ransac_mask_1(const Mat& src, const Mat& mask);
|
||||
int check_ransac_mask_2(const Mat& original_mask, const Mat& found_mask);
|
||||
int check_ransac_mask_2(const Mat& original_mask, const Mat& found_mask);
|
||||
|
||||
void print_information_1(int j, int N, int method, const Mat& H);
|
||||
void print_information_2(int j, int N, int method, const Mat& H, const Mat& H_res, int k, double diff);
|
||||
void print_information_3(int j, int N, const Mat& mask);
|
||||
void print_information_4(int method, int j, int N, int k, int l, double diff);
|
||||
void print_information_5(int method, int j, int N, int l, double diff);
|
||||
void print_information_6(int j, int N, int k, double diff, bool value);
|
||||
void print_information_7(int j, int N, int k, double diff, bool original_value, bool found_value);
|
||||
void print_information_8(int j, int N, int k, int l, double diff);
|
||||
void print_information_1(int j, int N, int method, const Mat& H);
|
||||
void print_information_2(int j, int N, int method, const Mat& H, const Mat& H_res, int k, double diff);
|
||||
void print_information_3(int j, int N, const Mat& mask);
|
||||
void print_information_4(int method, int j, int N, int k, int l, double diff);
|
||||
void print_information_5(int method, int j, int N, int l, double diff);
|
||||
void print_information_6(int j, int N, int k, double diff, bool value);
|
||||
void print_information_7(int j, int N, int k, double diff, bool original_value, bool found_value);
|
||||
void print_information_8(int j, int N, int k, int l, double diff);
|
||||
};
|
||||
|
||||
CV_HomographyTest::CV_HomographyTest() : max_diff(1e-2f), max_2diff(2e-2f)
|
||||
@ -112,7 +112,7 @@ CV_HomographyTest::CV_HomographyTest() : max_diff(1e-2f), max_2diff(2e-2f)
|
||||
|
||||
CV_HomographyTest::~CV_HomographyTest() {}
|
||||
|
||||
bool CV_HomographyTest::check_matrix_size(const cv::Mat& H)
|
||||
bool CV_HomographyTest::check_matrix_size(const cv::Mat& H)
|
||||
{
|
||||
return (H.rows == 3) && (H.cols == 3);
|
||||
}
|
||||
@ -138,25 +138,25 @@ int CV_HomographyTest::check_ransac_mask_2(const Mat& original_mask, const Mat&
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CV_HomographyTest::print_information_1(int j, int N, int method, const Mat& H)
|
||||
void CV_HomographyTest::print_information_1(int j, int N, int _method, const Mat& H)
|
||||
{
|
||||
cout << endl; cout << "Checking for homography matrix sizes..." << endl; cout << endl;
|
||||
cout << "Type of srcPoints: "; if ((j>-1) && (j<2)) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>";
|
||||
cout << " Type of dstPoints: "; if (j % 2 == 0) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>"; cout << endl;
|
||||
cout << "Count of points: " << N << endl; cout << endl;
|
||||
cout << "Method: "; if (method == 0) cout << 0; else if (method == 8) cout << "RANSAC"; else cout << "LMEDS"; cout << endl;
|
||||
cout << "Method: "; if (_method == 0) cout << 0; else if (_method == 8) cout << "RANSAC"; else cout << "LMEDS"; cout << endl;
|
||||
cout << "Homography matrix:" << endl; cout << endl;
|
||||
cout << H << endl; cout << endl;
|
||||
cout << "Number of rows: " << H.rows << " Number of cols: " << H.cols << endl; cout << endl;
|
||||
}
|
||||
|
||||
void CV_HomographyTest::print_information_2(int j, int N, int method, const Mat& H, const Mat& H_res, int k, double diff)
|
||||
void CV_HomographyTest::print_information_2(int j, int N, int _method, const Mat& H, const Mat& H_res, int k, double diff)
|
||||
{
|
||||
cout << endl; cout << "Checking for accuracy of homography matrix computing..." << endl; cout << endl;
|
||||
cout << "Type of srcPoints: "; if ((j>-1) && (j<2)) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>";
|
||||
cout << " Type of dstPoints: "; if (j % 2 == 0) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>"; cout << endl;
|
||||
cout << "Count of points: " << N << endl; cout << endl;
|
||||
cout << "Method: "; if (method == 0) cout << 0; else if (method == 8) cout << "RANSAC"; else cout << "LMEDS"; cout << endl;
|
||||
cout << "Method: "; if (_method == 0) cout << 0; else if (_method == 8) cout << "RANSAC"; else cout << "LMEDS"; cout << endl;
|
||||
cout << "Original matrix:" << endl; cout << endl;
|
||||
cout << H << endl; cout << endl;
|
||||
cout << "Found matrix:" << endl; cout << endl;
|
||||
@ -178,10 +178,10 @@ void CV_HomographyTest::print_information_3(int j, int N, const Mat& mask)
|
||||
cout << "Number of rows: " << mask.rows << " Number of cols: " << mask.cols << endl; cout << endl;
|
||||
}
|
||||
|
||||
void CV_HomographyTest::print_information_4(int method, int j, int N, int k, int l, double diff)
|
||||
void CV_HomographyTest::print_information_4(int _method, int j, int N, int k, int l, double diff)
|
||||
{
|
||||
cout << endl; cout << "Checking for accuracy of reprojection error computing..." << endl; cout << endl;
|
||||
cout << "Method: "; if (method == 0) cout << 0 << endl; else cout << "CV_LMEDS" << endl;
|
||||
cout << "Method: "; if (_method == 0) cout << 0 << endl; else cout << "CV_LMEDS" << endl;
|
||||
cout << "Type of srcPoints: "; if ((j>-1) && (j<2)) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>";
|
||||
cout << " Type of dstPoints: "; if (j % 2 == 0) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>"; cout << endl;
|
||||
cout << "Sigma of normal noise: " << sigma << endl;
|
||||
@ -192,10 +192,10 @@ void CV_HomographyTest::print_information_4(int method, int j, int N, int k, int
|
||||
cout << "Maxumum allowed difference: " << max_2diff << endl; cout << endl;
|
||||
}
|
||||
|
||||
void CV_HomographyTest::print_information_5(int method, int j, int N, int l, double diff)
|
||||
{
|
||||
void CV_HomographyTest::print_information_5(int _method, int j, int N, int l, double diff)
|
||||
{
|
||||
cout << endl; cout << "Checking for accuracy of reprojection error computing..." << endl; cout << endl;
|
||||
cout << "Method: "; if (method == 0) cout << 0 << endl; else cout << "CV_LMEDS" << endl;
|
||||
cout << "Method: "; if (_method == 0) cout << 0 << endl; else cout << "CV_LMEDS" << endl;
|
||||
cout << "Type of srcPoints: "; if ((j>-1) && (j<2)) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>";
|
||||
cout << " Type of dstPoints: "; if (j % 2 == 0) cout << "Mat of CV_32FC2"; else cout << "vector <Point2f>"; cout << endl;
|
||||
cout << "Sigma of normal noise: " << sigma << endl;
|
||||
@ -371,7 +371,7 @@ void CV_HomographyTest::run(int)
|
||||
if (code)
|
||||
{
|
||||
print_information_3(j, N, mask[j]);
|
||||
|
||||
|
||||
switch (code)
|
||||
{
|
||||
case 1: { CV_Error(CALIB3D_HOMOGRAPHY_ERROR_RANSAC_MASK, MESSAGE_RANSAC_MASK_1); break; }
|
||||
@ -380,7 +380,7 @@ void CV_HomographyTest::run(int)
|
||||
|
||||
default: break;
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@ -412,7 +412,7 @@ void CV_HomographyTest::run(int)
|
||||
{
|
||||
case 0:
|
||||
case CV_LMEDS:
|
||||
{
|
||||
{
|
||||
Mat H_res_64 [4] = { cv::findHomography(src_mat_2f, dst_mat_2f),
|
||||
cv::findHomography(src_mat_2f, dst_vec),
|
||||
cv::findHomography(src_vec, dst_mat_2f),
|
||||
@ -465,7 +465,7 @@ void CV_HomographyTest::run(int)
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
case CV_RANSAC:
|
||||
{
|
||||
cv::Mat mask_res [4];
|
||||
@ -555,7 +555,7 @@ void CV_HomographyTest::run(int)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -106,7 +106,7 @@ protected:
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool runTest(RNG& rng, int mode, int method, const vector<Point3f>& points, const double* eps, double& maxError)
|
||||
virtual bool runTest(RNG& rng, int mode, int method, const vector<Point3f>& points, const double* epsilon, double& maxError)
|
||||
{
|
||||
Mat rvec, tvec;
|
||||
vector<int> inliers;
|
||||
@ -136,7 +136,7 @@ protected:
|
||||
bool isTestSuccess = inliers.size() >= points.size()*0.95;
|
||||
|
||||
double rvecDiff = norm(rvec-trueRvec), tvecDiff = norm(tvec-trueTvec);
|
||||
isTestSuccess = isTestSuccess && rvecDiff < eps[method] && tvecDiff < eps[method];
|
||||
isTestSuccess = isTestSuccess && rvecDiff < epsilon[method] && tvecDiff < epsilon[method];
|
||||
double error = rvecDiff > tvecDiff ? rvecDiff : tvecDiff;
|
||||
//cout << error << " " << inliers.size() << " " << eps[method] << endl;
|
||||
if (error > maxError)
|
||||
@ -147,8 +147,7 @@ protected:
|
||||
|
||||
void run(int)
|
||||
{
|
||||
cvtest::TS& ts = *this->ts;
|
||||
ts.set_failed_test_info(cvtest::TS::OK);
|
||||
ts->set_failed_test_info(cvtest::TS::OK);
|
||||
|
||||
vector<Point3f> points;
|
||||
const int pointsCount = 500;
|
||||
@ -157,7 +156,7 @@ protected:
|
||||
|
||||
|
||||
const int methodsCount = 3;
|
||||
RNG rng = ts.get_rng();
|
||||
RNG rng = ts->get_rng();
|
||||
|
||||
|
||||
for (int mode = 0; mode < 2; mode++)
|
||||
@ -174,9 +173,9 @@ protected:
|
||||
//cout << maxError << " " << successfulTestsCount << endl;
|
||||
if (successfulTestsCount < 0.7*totalTestsCount)
|
||||
{
|
||||
ts.printf( cvtest::TS::LOG, "Invalid accuracy for method %d, failed %d tests from %d, maximum error equals %f, distortion mode equals %d\n",
|
||||
ts->printf( cvtest::TS::LOG, "Invalid accuracy for method %d, failed %d tests from %d, maximum error equals %f, distortion mode equals %d\n",
|
||||
method, totalTestsCount - successfulTestsCount, totalTestsCount, maxError, mode);
|
||||
ts.set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_BAD_ACCURACY);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -198,7 +197,7 @@ public:
|
||||
|
||||
~CV_solvePnP_Test() {}
|
||||
protected:
|
||||
virtual bool runTest(RNG& rng, int mode, int method, const vector<Point3f>& points, const double* eps, double& maxError)
|
||||
virtual bool runTest(RNG& rng, int mode, int method, const vector<Point3f>& points, const double* epsilon, double& maxError)
|
||||
{
|
||||
Mat rvec, tvec;
|
||||
Mat trueRvec, trueTvec;
|
||||
@ -226,7 +225,7 @@ protected:
|
||||
false, method);
|
||||
|
||||
double rvecDiff = norm(rvec-trueRvec), tvecDiff = norm(tvec-trueTvec);
|
||||
bool isTestSuccess = rvecDiff < eps[method] && tvecDiff < eps[method];
|
||||
bool isTestSuccess = rvecDiff < epsilon[method] && tvecDiff < epsilon[method];
|
||||
|
||||
double error = rvecDiff > tvecDiff ? rvecDiff : tvecDiff;
|
||||
if (error > maxError)
|
||||
|
@ -421,7 +421,7 @@ void CV_StereoMatchingTest::run(int)
|
||||
ts->set_failed_test_info( code );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
string fullResultFilename = dataPath + ALGORITHMS_DIR + algorithmName + RESULT_FILE;
|
||||
FileStorage resFS( fullResultFilename, FileStorage::READ );
|
||||
bool isWrite = true; // write or compare results
|
||||
@ -593,11 +593,11 @@ int CV_StereoMatchingTest::readDatasetsParams( FileStorage& fs )
|
||||
assert(fn.isSeq());
|
||||
for( int i = 0; i < (int)fn.size(); i+=3 )
|
||||
{
|
||||
string name = fn[i];
|
||||
string _name = fn[i];
|
||||
DatasetParams params;
|
||||
string sf = fn[i+1]; params.dispScaleFactor = atoi(sf.c_str());
|
||||
string uv = fn[i+2]; params.dispUnknVal = atoi(uv.c_str());
|
||||
datasetsParams[name] = params;
|
||||
datasetsParams[_name] = params;
|
||||
}
|
||||
return cvtest::TS::OK;
|
||||
}
|
||||
@ -713,7 +713,7 @@ class CV_StereoSGBMTest : public CV_StereoMatchingTest
|
||||
public:
|
||||
CV_StereoSGBMTest()
|
||||
{
|
||||
name = "stereosgbm";
|
||||
name = "stereosgbm";
|
||||
fill(rmsEps.begin(), rmsEps.end(), 0.25f);
|
||||
fill(fracEps.begin(), fracEps.end(), 0.01f);
|
||||
}
|
||||
|
@ -63,48 +63,48 @@ private:
|
||||
GSD_INTENSITY_LT = 15,
|
||||
GSD_INTENSITY_UT = 250
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS Histogram
|
||||
{
|
||||
private:
|
||||
enum {
|
||||
HistogramSize = (GSD_HUE_UT - GSD_HUE_LT + 1)
|
||||
};
|
||||
|
||||
|
||||
protected:
|
||||
int findCoverageIndex(double surfaceToCover, int defaultValue = 0);
|
||||
|
||||
|
||||
public:
|
||||
CvHistogram *fHistogram;
|
||||
Histogram();
|
||||
virtual ~Histogram();
|
||||
|
||||
|
||||
void findCurveThresholds(int &x1, int &x2, double percent = 0.05);
|
||||
void mergeWith(Histogram *source, double weight);
|
||||
};
|
||||
|
||||
|
||||
int nStartCounter, nFrameCount, nSkinHueLowerBound, nSkinHueUpperBound, nMorphingMethod, nSamplingDivider;
|
||||
double fHistogramMergeFactor, fHuePercentCovered;
|
||||
Histogram histogramHueMotion, skinHueHistogram;
|
||||
IplImage *imgHueFrame, *imgSaturationFrame, *imgLastGrayFrame, *imgMotionFrame, *imgFilteredFrame;
|
||||
IplImage *imgShrinked, *imgTemp, *imgGrayFrame, *imgHSVFrame;
|
||||
|
||||
|
||||
protected:
|
||||
void initData(IplImage *src, int widthDivider, int heightDivider);
|
||||
void adaptiveFilter();
|
||||
|
||||
|
||||
public:
|
||||
|
||||
|
||||
enum {
|
||||
MORPHING_METHOD_NONE = 0,
|
||||
MORPHING_METHOD_ERODE = 1,
|
||||
MORPHING_METHOD_ERODE_ERODE = 2,
|
||||
MORPHING_METHOD_ERODE_DILATE = 3
|
||||
};
|
||||
|
||||
|
||||
CvAdaptiveSkinDetector(int samplingDivider = 1, int morphingMethod = MORPHING_METHOD_NONE);
|
||||
virtual ~CvAdaptiveSkinDetector();
|
||||
|
||||
|
||||
virtual void process(IplImage *inputBGRImage, IplImage *outputHueMask);
|
||||
};
|
||||
|
||||
@ -116,7 +116,7 @@ public:
|
||||
class CV_EXPORTS CvFuzzyPoint {
|
||||
public:
|
||||
double x, y, value;
|
||||
|
||||
|
||||
CvFuzzyPoint(double _x, double _y);
|
||||
};
|
||||
|
||||
@ -124,13 +124,13 @@ class CV_EXPORTS CvFuzzyCurve {
|
||||
private:
|
||||
std::vector<CvFuzzyPoint> points;
|
||||
double value, centre;
|
||||
|
||||
|
||||
bool between(double x, double x1, double x2);
|
||||
|
||||
|
||||
public:
|
||||
CvFuzzyCurve();
|
||||
~CvFuzzyCurve();
|
||||
|
||||
|
||||
void setCentre(double _centre);
|
||||
double getCentre();
|
||||
void clear();
|
||||
@ -143,7 +143,7 @@ public:
|
||||
class CV_EXPORTS CvFuzzyFunction {
|
||||
public:
|
||||
std::vector<CvFuzzyCurve> curves;
|
||||
|
||||
|
||||
CvFuzzyFunction();
|
||||
~CvFuzzyFunction();
|
||||
void addCurve(CvFuzzyCurve *curve, double value = 0);
|
||||
@ -186,7 +186,7 @@ private:
|
||||
FuzzyResizer();
|
||||
int calcOutput(double edgeDensity, double density);
|
||||
};
|
||||
|
||||
|
||||
class SearchWindow
|
||||
{
|
||||
public:
|
||||
@ -200,7 +200,7 @@ private:
|
||||
double density;
|
||||
unsigned int depthLow, depthHigh;
|
||||
int verticalEdgeLeft, verticalEdgeRight, horizontalEdgeTop, horizontalEdgeBottom;
|
||||
|
||||
|
||||
SearchWindow();
|
||||
~SearchWindow();
|
||||
void setSize(int _x, int _y, int _width, int _height);
|
||||
@ -212,7 +212,7 @@ private:
|
||||
void getResizeAttribsEdgeDensityFuzzy(int &resizeDx, int &resizeDy, int &resizeDw, int &resizeDh);
|
||||
bool meanShift(IplImage *maskImage, IplImage *depthMap, int maxIteration, bool initDepth);
|
||||
};
|
||||
|
||||
|
||||
public:
|
||||
enum TrackingState
|
||||
{
|
||||
@ -222,40 +222,40 @@ public:
|
||||
tsSetWindow = 3,
|
||||
tsDisabled = 10
|
||||
};
|
||||
|
||||
|
||||
enum ResizeMethod {
|
||||
rmEdgeDensityLinear = 0,
|
||||
rmEdgeDensityFuzzy = 1,
|
||||
rmInnerDensity = 2
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
MinKernelMass = 1000
|
||||
};
|
||||
|
||||
|
||||
SearchWindow kernel;
|
||||
int searchMode;
|
||||
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
MaxMeanShiftIteration = 5,
|
||||
MaxSetSizeIteration = 5
|
||||
};
|
||||
|
||||
|
||||
void findOptimumSearchWindow(SearchWindow &searchWindow, IplImage *maskImage, IplImage *depthMap, int maxIteration, int resizeMethod, bool initDepth);
|
||||
|
||||
|
||||
public:
|
||||
CvFuzzyMeanShiftTracker();
|
||||
~CvFuzzyMeanShiftTracker();
|
||||
|
||||
|
||||
void track(IplImage *maskImage, IplImage *depthMap, int resizeMethod, bool resetSearch, int minKernelMass = MinKernelMass);
|
||||
};
|
||||
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
class CV_EXPORTS Octree
|
||||
{
|
||||
public:
|
||||
@ -268,11 +268,11 @@ namespace cv
|
||||
bool isLeaf;
|
||||
int children[8];
|
||||
};
|
||||
|
||||
|
||||
Octree();
|
||||
Octree( const vector<Point3f>& points, int maxLevels = 10, int minPoints = 20 );
|
||||
virtual ~Octree();
|
||||
|
||||
|
||||
virtual void buildTree( const vector<Point3f>& points, int maxLevels = 10, int minPoints = 20 );
|
||||
virtual void getPointsWithinSphere( const Point3f& center, float radius,
|
||||
vector<Point3f>& points ) const;
|
||||
@ -281,85 +281,85 @@ namespace cv
|
||||
int minPoints;
|
||||
vector<Point3f> points;
|
||||
vector<Node> nodes;
|
||||
|
||||
|
||||
virtual void buildNext(size_t node_ind);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class CV_EXPORTS Mesh3D
|
||||
{
|
||||
public:
|
||||
struct EmptyMeshException {};
|
||||
|
||||
|
||||
Mesh3D();
|
||||
Mesh3D(const vector<Point3f>& vtx);
|
||||
~Mesh3D();
|
||||
|
||||
|
||||
void buildOctree();
|
||||
void clearOctree();
|
||||
float estimateResolution(float tryRatio = 0.1f);
|
||||
void computeNormals(float normalRadius, int minNeighbors = 20);
|
||||
void computeNormals(const vector<int>& subset, float normalRadius, int minNeighbors = 20);
|
||||
|
||||
|
||||
void writeAsVrml(const String& file, const vector<Scalar>& colors = vector<Scalar>()) const;
|
||||
|
||||
|
||||
vector<Point3f> vtx;
|
||||
vector<Point3f> normals;
|
||||
float resolution;
|
||||
Octree octree;
|
||||
|
||||
|
||||
const static Point3f allzero;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS SpinImageModel
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
/* model parameters, leave unset for default or auto estimate */
|
||||
float normalRadius;
|
||||
int minNeighbors;
|
||||
|
||||
|
||||
float binSize;
|
||||
int imageWidth;
|
||||
|
||||
|
||||
float lambda;
|
||||
float gamma;
|
||||
|
||||
|
||||
float T_GeometriccConsistency;
|
||||
float T_GroupingCorespondances;
|
||||
|
||||
|
||||
/* public interface */
|
||||
SpinImageModel();
|
||||
explicit SpinImageModel(const Mesh3D& mesh);
|
||||
~SpinImageModel();
|
||||
|
||||
|
||||
void setLogger(std::ostream* log);
|
||||
void selectRandomSubset(float ratio);
|
||||
void setSubset(const vector<int>& subset);
|
||||
void compute();
|
||||
|
||||
|
||||
void match(const SpinImageModel& scene, vector< vector<Vec2i> >& result);
|
||||
|
||||
|
||||
Mat packRandomScaledSpins(bool separateScale = false, size_t xCount = 10, size_t yCount = 10) const;
|
||||
|
||||
|
||||
size_t getSpinCount() const { return spinImages.rows; }
|
||||
Mat getSpinImage(size_t index) const { return spinImages.row((int)index); }
|
||||
const Point3f& getSpinVertex(size_t index) const { return mesh.vtx[subset[index]]; }
|
||||
const Point3f& getSpinNormal(size_t index) const { return mesh.normals[subset[index]]; }
|
||||
|
||||
|
||||
const Mesh3D& getMesh() const { return mesh; }
|
||||
Mesh3D& getMesh() { return mesh; }
|
||||
|
||||
|
||||
/* static utility functions */
|
||||
static bool spinCorrelation(const Mat& spin1, const Mat& spin2, float lambda, float& result);
|
||||
|
||||
|
||||
static Point2f calcSpinMapCoo(const Point3f& point, const Point3f& vertex, const Point3f& normal);
|
||||
|
||||
|
||||
static float geometricConsistency(const Point3f& pointScene1, const Point3f& normalScene1,
|
||||
const Point3f& pointModel1, const Point3f& normalModel1,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
const Point3f& pointModel2, const Point3f& normalModel2);
|
||||
|
||||
|
||||
static float groupingCreteria(const Point3f& pointScene1, const Point3f& normalScene1,
|
||||
const Point3f& pointModel1, const Point3f& normalModel1,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
@ -367,40 +367,40 @@ namespace cv
|
||||
float gamma);
|
||||
protected:
|
||||
void defaultParams();
|
||||
|
||||
|
||||
void matchSpinToModel(const Mat& spin, vector<int>& indeces,
|
||||
vector<float>& corrCoeffs, bool useExtremeOutliers = true) const;
|
||||
|
||||
|
||||
void repackSpinImages(const vector<uchar>& mask, Mat& spinImages, bool reAlloc = true) const;
|
||||
|
||||
|
||||
vector<int> subset;
|
||||
Mesh3D mesh;
|
||||
Mat spinImages;
|
||||
std::ostream* out;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS TickMeter
|
||||
{
|
||||
public:
|
||||
TickMeter();
|
||||
void start();
|
||||
void stop();
|
||||
|
||||
|
||||
int64 getTimeTicks() const;
|
||||
double getTimeMicro() const;
|
||||
double getTimeMilli() const;
|
||||
double getTimeSec() const;
|
||||
int64 getCounter() const;
|
||||
|
||||
|
||||
void reset();
|
||||
private:
|
||||
int64 counter;
|
||||
int64 sumTime;
|
||||
int64 startTime;
|
||||
};
|
||||
|
||||
|
||||
CV_EXPORTS std::ostream& operator<<(std::ostream& out, const TickMeter& tm);
|
||||
|
||||
|
||||
class CV_EXPORTS SelfSimDescriptor
|
||||
{
|
||||
public:
|
||||
@ -412,29 +412,29 @@ namespace cv
|
||||
SelfSimDescriptor(const SelfSimDescriptor& ss);
|
||||
virtual ~SelfSimDescriptor();
|
||||
SelfSimDescriptor& operator = (const SelfSimDescriptor& ss);
|
||||
|
||||
|
||||
size_t getDescriptorSize() const;
|
||||
Size getGridSize( Size imgsize, Size winStride ) const;
|
||||
|
||||
|
||||
virtual void compute(const Mat& img, vector<float>& descriptors, Size winStride=Size(),
|
||||
const vector<Point>& locations=vector<Point>()) const;
|
||||
virtual void computeLogPolarMapping(Mat& mappingMask) const;
|
||||
virtual void SSD(const Mat& img, Point pt, Mat& ssd) const;
|
||||
|
||||
|
||||
int smallSize;
|
||||
int largeSize;
|
||||
int startDistanceBucket;
|
||||
int numberOfDistanceBuckets;
|
||||
int numberOfAngles;
|
||||
|
||||
|
||||
enum { DEFAULT_SMALL_SIZE = 5, DEFAULT_LARGE_SIZE = 41,
|
||||
DEFAULT_NUM_ANGLES = 20, DEFAULT_START_DISTANCE_BUCKET = 3,
|
||||
DEFAULT_NUM_DISTANCE_BUCKETS = 7 };
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
typedef bool (*BundleAdjustCallback)(int iteration, double norm_error, void* user_data);
|
||||
|
||||
|
||||
class LevMarqSparse {
|
||||
public:
|
||||
LevMarqSparse();
|
||||
@ -447,9 +447,9 @@ namespace cv
|
||||
Mat& visibility, // visibility matrix. rows correspond to points, columns correspond to cameras
|
||||
// 1 - point is visible for the camera, 0 - invisible
|
||||
Mat& P0, // starting vector of parameters, first cameras then points
|
||||
Mat& X, // measurements, in order of visibility. non visible cases are skipped
|
||||
Mat& X, // measurements, in order of visibility. non visible cases are skipped
|
||||
TermCriteria criteria, // termination criteria
|
||||
|
||||
|
||||
// callback for estimation of Jacobian matrices
|
||||
void (CV_CDECL * fjac)(int i, int j, Mat& point_params,
|
||||
Mat& cam_params, Mat& A, Mat& B, void* data),
|
||||
@ -459,9 +459,9 @@ namespace cv
|
||||
void* data, // user-specific data passed to the callbacks
|
||||
BundleAdjustCallback cb, void* user_data
|
||||
);
|
||||
|
||||
|
||||
virtual ~LevMarqSparse();
|
||||
|
||||
|
||||
virtual void run( int npoints, // number of points
|
||||
int ncameras, // number of cameras
|
||||
int nPointParams, // number of params per one point (3 in case of 3D points)
|
||||
@ -471,9 +471,9 @@ namespace cv
|
||||
Mat& visibility, // visibility matrix. rows correspond to points, columns correspond to cameras
|
||||
// 1 - point is visible for the camera, 0 - invisible
|
||||
Mat& P0, // starting vector of parameters, first cameras then points
|
||||
Mat& X, // measurements, in order of visibility. non visible cases are skipped
|
||||
Mat& X, // measurements, in order of visibility. non visible cases are skipped
|
||||
TermCriteria criteria, // termination criteria
|
||||
|
||||
|
||||
// callback for estimation of Jacobian matrices
|
||||
void (CV_CDECL * fjac)(int i, int j, Mat& point_params,
|
||||
Mat& cam_params, Mat& A, Mat& B, void* data),
|
||||
@ -482,13 +482,13 @@ namespace cv
|
||||
Mat& cam_params, Mat& estim, void* data),
|
||||
void* data // user-specific data passed to the callbacks
|
||||
);
|
||||
|
||||
|
||||
virtual void clear();
|
||||
|
||||
|
||||
// useful function to do simple bundle adjustment tasks
|
||||
static void bundleAdjust(vector<Point3d>& points, // positions of points in global coordinate system (input and output)
|
||||
const vector<vector<Point2d> >& imagePoints, // projections of 3d points for every camera
|
||||
const vector<vector<int> >& visibility, // visibility of 3d points for every camera
|
||||
const vector<vector<int> >& visibility, // visibility of 3d points for every camera
|
||||
vector<Mat>& cameraMatrix, // intrinsic matrices of all cameras (input and output)
|
||||
vector<Mat>& R, // rotation matrices of all cameras (input and output)
|
||||
vector<Mat>& T, // translation vector of all cameras (input and output)
|
||||
@ -496,123 +496,123 @@ namespace cv
|
||||
const TermCriteria& criteria=
|
||||
TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, DBL_EPSILON),
|
||||
BundleAdjustCallback cb = 0, void* user_data = 0);
|
||||
|
||||
|
||||
public:
|
||||
virtual void optimize(CvMat &_vis); //main function that runs minimization
|
||||
|
||||
|
||||
//iteratively asks for measurement for visible camera-point pairs
|
||||
void ask_for_proj(CvMat &_vis,bool once=false);
|
||||
//iteratively asks for Jacobians for every camera_point pair
|
||||
void ask_for_projac(CvMat &_vis);
|
||||
|
||||
|
||||
CvMat* err; //error X-hX
|
||||
double prevErrNorm, errNorm;
|
||||
double lambda;
|
||||
CvTermCriteria criteria;
|
||||
int iters;
|
||||
|
||||
|
||||
CvMat** U; //size of array is equal to number of cameras
|
||||
CvMat** V; //size of array is equal to number of points
|
||||
CvMat** inv_V_star; //inverse of V*
|
||||
|
||||
|
||||
CvMat** A;
|
||||
CvMat** B;
|
||||
CvMat** W;
|
||||
|
||||
CvMat* X; //measurement
|
||||
CvMat* hX; //current measurement extimation given new parameter vector
|
||||
|
||||
CvMat* prevP; //current already accepted parameter.
|
||||
|
||||
CvMat* X; //measurement
|
||||
CvMat* hX; //current measurement extimation given new parameter vector
|
||||
|
||||
CvMat* prevP; //current already accepted parameter.
|
||||
CvMat* P; // parameters used to evaluate function with new params
|
||||
// this parameters may be rejected
|
||||
|
||||
// this parameters may be rejected
|
||||
|
||||
CvMat* deltaP; //computed increase of parameters (result of normal system solution )
|
||||
|
||||
|
||||
CvMat** ea; // sum_i AijT * e_ij , used as right part of normal equation
|
||||
// length of array is j = number of cameras
|
||||
// length of array is j = number of cameras
|
||||
CvMat** eb; // sum_j BijT * e_ij , used as right part of normal equation
|
||||
// length of array is i = number of points
|
||||
|
||||
|
||||
CvMat** Yj; //length of array is i = num_points
|
||||
|
||||
CvMat* S; //big matrix of block Sjk , each block has size num_cam_params x num_cam_params
|
||||
|
||||
|
||||
CvMat* S; //big matrix of block Sjk , each block has size num_cam_params x num_cam_params
|
||||
|
||||
CvMat* JtJ_diag; //diagonal of JtJ, used to backup diagonal elements before augmentation
|
||||
|
||||
|
||||
CvMat* Vis_index; // matrix which element is index of measurement for point i and camera j
|
||||
|
||||
|
||||
int num_cams;
|
||||
int num_points;
|
||||
int num_err_param;
|
||||
int num_cam_param;
|
||||
int num_point_param;
|
||||
|
||||
//target function and jacobian pointers, which needs to be initialized
|
||||
|
||||
//target function and jacobian pointers, which needs to be initialized
|
||||
void (*fjac)(int i, int j, Mat& point_params, Mat& cam_params, Mat& A, Mat& B, void* data);
|
||||
void (*func)(int i, int j, Mat& point_params, Mat& cam_params, Mat& estim, void* data);
|
||||
|
||||
|
||||
void* data;
|
||||
|
||||
|
||||
BundleAdjustCallback cb;
|
||||
void* user_data;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
CV_EXPORTS int chamerMatching( Mat& img, Mat& templ,
|
||||
vector<vector<Point> >& results, vector<float>& cost,
|
||||
double templScale=1, int maxMatches = 20,
|
||||
double minMatchDistance = 1.0, int padX = 3,
|
||||
int padY = 3, int scales = 5, double minScale = 0.6, double maxScale = 1.6,
|
||||
double orientationWeight = 0.5, double truncate = 20);
|
||||
|
||||
|
||||
|
||||
|
||||
class CV_EXPORTS StereoVar
|
||||
{
|
||||
public:
|
||||
// Flags
|
||||
// Flags
|
||||
enum {USE_INITIAL_DISPARITY = 1, USE_EQUALIZE_HIST = 2, USE_SMART_ID = 4, USE_AUTO_PARAMS = 8, USE_MEDIAN_FILTERING = 16};
|
||||
enum {CYCLE_O, CYCLE_V};
|
||||
enum {PENALIZATION_TICHONOV, PENALIZATION_CHARBONNIER, PENALIZATION_PERONA_MALIK};
|
||||
|
||||
|
||||
//! the default constructor
|
||||
CV_WRAP StereoVar();
|
||||
|
||||
|
||||
//! the full constructor taking all the necessary algorithm parameters
|
||||
CV_WRAP StereoVar(int levels, double pyrScale, int nIt, int minDisp, int maxDisp, int poly_n, double poly_sigma, float fi, float lambda, int penalization, int cycle, int flags);
|
||||
|
||||
|
||||
//! the destructor
|
||||
virtual ~StereoVar();
|
||||
|
||||
|
||||
//! the stereo correspondence operator that computes disparity map for the specified rectified stereo pair
|
||||
CV_WRAP_AS(compute) virtual void operator()(const Mat& left, const Mat& right, Mat& disp);
|
||||
|
||||
CV_PROP_RW int levels;
|
||||
CV_PROP_RW double pyrScale;
|
||||
CV_PROP_RW int nIt;
|
||||
CV_PROP_RW int minDisp;
|
||||
CV_PROP_RW int maxDisp;
|
||||
CV_PROP_RW int poly_n;
|
||||
CV_PROP_RW double poly_sigma;
|
||||
CV_PROP_RW float fi;
|
||||
CV_PROP_RW float lambda;
|
||||
CV_PROP_RW int penalization;
|
||||
CV_PROP_RW int cycle;
|
||||
CV_PROP_RW int flags;
|
||||
|
||||
|
||||
CV_PROP_RW int levels;
|
||||
CV_PROP_RW double pyrScale;
|
||||
CV_PROP_RW int nIt;
|
||||
CV_PROP_RW int minDisp;
|
||||
CV_PROP_RW int maxDisp;
|
||||
CV_PROP_RW int poly_n;
|
||||
CV_PROP_RW double poly_sigma;
|
||||
CV_PROP_RW float fi;
|
||||
CV_PROP_RW float lambda;
|
||||
CV_PROP_RW int penalization;
|
||||
CV_PROP_RW int cycle;
|
||||
CV_PROP_RW int flags;
|
||||
|
||||
private:
|
||||
void autoParams();
|
||||
void FMG(Mat &I1, Mat &I2, Mat &I2x, Mat &u, int level);
|
||||
void FMG(Mat &I1, Mat &I2, Mat &I2x, Mat &u, int level);
|
||||
void VCycle_MyFAS(Mat &I1_h, Mat &I2_h, Mat &I2x_h, Mat &u_h, int level);
|
||||
void VariationalSolver(Mat &I1_h, Mat &I2_h, Mat &I2x_h, Mat &u_h, int level);
|
||||
};
|
||||
|
||||
|
||||
CV_EXPORTS void polyfit(const Mat& srcx, const Mat& srcy, Mat& dst, int order);
|
||||
|
||||
class CV_EXPORTS Directory
|
||||
class CV_EXPORTS Directory
|
||||
{
|
||||
public:
|
||||
static std::vector<std::string> GetListFiles ( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
static std::vector<std::string> GetListFilesR ( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
static std::vector<std::string> GetListFolders( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
public:
|
||||
static std::vector<std::string> GetListFiles ( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
static std::vector<std::string> GetListFilesR ( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
static std::vector<std::string> GetListFolders( const std::string& path, const std::string & exten = "*", bool addPath = true );
|
||||
};
|
||||
|
||||
/*
|
||||
@ -654,7 +654,7 @@ namespace cv
|
||||
class CV_EXPORTS LogPolar_Interp
|
||||
{
|
||||
public:
|
||||
|
||||
|
||||
LogPolar_Interp() {}
|
||||
|
||||
/**
|
||||
@ -664,11 +664,11 @@ namespace cv
|
||||
*\param center the transformation center: where the output precision is maximal
|
||||
*\param R the number of rings of the cortical image (default value 70 pixel)
|
||||
*\param ro0 the radius of the blind spot (default value 3 pixel)
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
* \a 0 means that the retinal image is computed within the inscribed circle.
|
||||
*\param S the number of sectors of the cortical image (default value 70 pixel).
|
||||
* Its value is usually internally computed to obtain a pixel aspect ratio equals to 1.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
* \a 0 means that the parameter \a S is provided by the user.
|
||||
*/
|
||||
LogPolar_Interp(int w, int h, Point2i center, int R=70, double ro0=3.0,
|
||||
@ -689,9 +689,9 @@ namespace cv
|
||||
*Destructor
|
||||
*/
|
||||
~LogPolar_Interp();
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
Mat Rsri;
|
||||
Mat Csri;
|
||||
|
||||
@ -716,10 +716,10 @@ namespace cv
|
||||
*More details can be found in http://dx.doi.org/10.1007/978-3-642-23968-7_5
|
||||
*/
|
||||
class CV_EXPORTS LogPolar_Overlapping
|
||||
{
|
||||
{
|
||||
public:
|
||||
LogPolar_Overlapping() {}
|
||||
|
||||
|
||||
/**
|
||||
*Constructor
|
||||
*\param w the width of the input image
|
||||
@ -727,11 +727,11 @@ namespace cv
|
||||
*\param center the transformation center: where the output precision is maximal
|
||||
*\param R the number of rings of the cortical image (default value 70 pixel)
|
||||
*\param ro0 the radius of the blind spot (default value 3 pixel)
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
* \a 0 means that the retinal image is computed within the inscribed circle.
|
||||
*\param S the number of sectors of the cortical image (default value 70 pixel).
|
||||
* Its value is usually internally computed to obtain a pixel aspect ratio equals to 1.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
* \a 0 means that the parameter \a S is provided by the user.
|
||||
*/
|
||||
LogPolar_Overlapping(int w, int h, Point2i center, int R=70,
|
||||
@ -752,9 +752,9 @@ namespace cv
|
||||
*Destructor
|
||||
*/
|
||||
~LogPolar_Overlapping();
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
Mat Rsri;
|
||||
Mat Csri;
|
||||
vector<int> Rsr;
|
||||
@ -793,7 +793,7 @@ namespace cv
|
||||
{
|
||||
public:
|
||||
LogPolar_Adjacent() {}
|
||||
|
||||
|
||||
/**
|
||||
*Constructor
|
||||
*\param w the width of the input image
|
||||
@ -802,13 +802,13 @@ namespace cv
|
||||
*\param R the number of rings of the cortical image (default value 70 pixel)
|
||||
*\param ro0 the radius of the blind spot (default value 3 pixel)
|
||||
*\param smin the size of the subpixel (default value 0.25 pixel)
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
*\param full \a 1 (default value) means that the retinal image (the inverse transform) is computed within the circumscribing circle.
|
||||
* \a 0 means that the retinal image is computed within the inscribed circle.
|
||||
*\param S the number of sectors of the cortical image (default value 70 pixel).
|
||||
* Its value is usually internally computed to obtain a pixel aspect ratio equals to 1.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
*\param sp \a 1 (default value) means that the parameter \a S is internally computed.
|
||||
* \a 0 means that the parameter \a S is provided by the user.
|
||||
*/
|
||||
*/
|
||||
LogPolar_Adjacent(int w, int h, Point2i center, int R=70, double ro0=3.0, double smin=0.25, int full=1, int S=117, int sp=1);
|
||||
/**
|
||||
*Transformation from Cartesian image to cortical (log-polar) image.
|
||||
@ -845,10 +845,10 @@ namespace cv
|
||||
bool get_uv(double x, double y, int&u, int&v);
|
||||
void create_map(int M, int N, int R, int S, double ro0, double smin);
|
||||
};
|
||||
|
||||
|
||||
CV_EXPORTS Mat subspaceProject(InputArray W, InputArray mean, InputArray src);
|
||||
CV_EXPORTS Mat subspaceReconstruct(InputArray W, InputArray mean, InputArray src);
|
||||
|
||||
|
||||
class CV_EXPORTS LDA
|
||||
{
|
||||
public:
|
||||
@ -908,7 +908,7 @@ namespace cv
|
||||
|
||||
// Returns the eigenvalues of this LDA.
|
||||
Mat eigenvalues() const { return _eigenvalues; }
|
||||
|
||||
|
||||
protected:
|
||||
bool _dataAsRow;
|
||||
int _num_components;
|
||||
@ -917,7 +917,7 @@ namespace cv
|
||||
|
||||
void lda(InputArray src, InputArray labels);
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS FaceRecognizer : public Algorithm
|
||||
{
|
||||
public:
|
||||
@ -941,16 +941,16 @@ namespace cv
|
||||
|
||||
// Deserializes this object from a given cv::FileStorage.
|
||||
virtual void load(const FileStorage& fs) = 0;
|
||||
|
||||
|
||||
// Returns eigenvectors (if any)
|
||||
virtual Mat eigenvectors() const { return Mat(); }
|
||||
};
|
||||
|
||||
|
||||
CV_EXPORTS Ptr<FaceRecognizer> createEigenFaceRecognizer(int num_components = 0);
|
||||
CV_EXPORTS Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components = 0);
|
||||
CV_EXPORTS Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius=1, int neighbors=8,
|
||||
int grid_x=8, int grid_y=8);
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
COLORMAP_AUTUMN = 0,
|
||||
@ -968,9 +968,9 @@ namespace cv
|
||||
COLORMAP_MKPJ1 = 12,
|
||||
COLORMAP_MKPJ2 = 13
|
||||
};
|
||||
|
||||
|
||||
CV_EXPORTS void applyColorMap(InputArray src, OutputArray dst, int colormap);
|
||||
|
||||
|
||||
CV_EXPORTS bool initModule_contrib();
|
||||
}
|
||||
|
||||
|
@ -86,10 +86,10 @@ struct CV_EXPORTS CvMeanShiftTrackerParams
|
||||
struct CV_EXPORTS CvFeatureTrackerParams
|
||||
{
|
||||
enum { SIFT = 0, SURF = 1, OPTICAL_FLOW = 2 };
|
||||
CvFeatureTrackerParams(int feature_type = 0, int window_size = 0)
|
||||
CvFeatureTrackerParams(int featureType = 0, int windowSize = 0)
|
||||
{
|
||||
feature_type = 0;
|
||||
window_size = 0;
|
||||
featureType = 0;
|
||||
windowSize = 0;
|
||||
}
|
||||
|
||||
int feature_type; // Feature type to use
|
||||
|
@ -67,15 +67,15 @@ LevMarqSparse::LevMarqSparse(int npoints, // number of points
|
||||
// 1 - point is visible for the camera, 0 - invisible
|
||||
Mat& P0, // starting vector of parameters, first cameras then points
|
||||
Mat& X_, // measurements, in order of visibility. non visible cases are skipped
|
||||
TermCriteria criteria, // termination criteria
|
||||
TermCriteria _criteria, // termination criteria
|
||||
|
||||
// callback for estimation of Jacobian matrices
|
||||
void (CV_CDECL * fjac)(int i, int j, Mat& point_params,
|
||||
void (CV_CDECL * _fjac)(int i, int j, Mat& point_params,
|
||||
Mat& cam_params, Mat& A, Mat& B, void* data),
|
||||
// callback for estimation of backprojection errors
|
||||
void (CV_CDECL * func)(int i, int j, Mat& point_params,
|
||||
void (CV_CDECL * _func)(int i, int j, Mat& point_params,
|
||||
Mat& cam_params, Mat& estim, void* data),
|
||||
void* data, // user-specific data passed to the callbacks
|
||||
void* _data, // user-specific data passed to the callbacks
|
||||
BundleAdjustCallback _cb, void* _user_data
|
||||
) {
|
||||
Vis_index = X = prevP = P = deltaP = err = JtJ_diag = S = hX = NULL;
|
||||
@ -86,7 +86,7 @@ LevMarqSparse::LevMarqSparse(int npoints, // number of points
|
||||
user_data = _user_data;
|
||||
|
||||
run(npoints, ncameras, nPointParams, nCameraParams, nErrParams, visibility,
|
||||
P0, X_, criteria, fjac, func, data);
|
||||
P0, X_, _criteria, _fjac, _func, _data);
|
||||
}
|
||||
|
||||
void LevMarqSparse::clear() {
|
||||
@ -443,9 +443,11 @@ void LevMarqSparse::optimize(CvMat &_vis) { //main function that runs minimizati
|
||||
} //U_j and ea_j computed for all j
|
||||
|
||||
// if (!(iters%100))
|
||||
int nviz = X->rows / num_err_param;
|
||||
double e2 = prevErrNorm*prevErrNorm, e2n = e2 / nviz;
|
||||
std::cerr<<"Iteration: "<<iters<<", normError: "<<e2<<" ("<<e2n<<")"<<std::endl;
|
||||
{
|
||||
int nviz = X->rows / num_err_param;
|
||||
double e2 = prevErrNorm*prevErrNorm, e2n = e2 / nviz;
|
||||
std::cerr<<"Iteration: "<<iters<<", normError: "<<e2<<" ("<<e2n<<")"<<std::endl;
|
||||
}
|
||||
if (cb)
|
||||
cb(iters, prevErrNorm, user_data);
|
||||
//compute V_i and eb_i
|
||||
@ -676,10 +678,12 @@ void LevMarqSparse::optimize(CvMat &_vis) { //main function that runs minimizati
|
||||
errNorm > prevErrNorm ) { //step was not accepted
|
||||
//increase lambda and reject change
|
||||
lambda *= 10;
|
||||
int nviz = X->rows / num_err_param;
|
||||
double e2 = errNorm*errNorm, e2_prev = prevErrNorm*prevErrNorm;
|
||||
double e2n = e2/nviz, e2n_prev = e2_prev/nviz;
|
||||
std::cerr<<"move failed: lambda = "<<lambda<<", e2 = "<<e2<<" ("<<e2n<<") > "<<e2_prev<<" ("<<e2n_prev<<")"<<std::endl;
|
||||
{
|
||||
int nviz = X->rows / num_err_param;
|
||||
double e2 = errNorm*errNorm, e2_prev = prevErrNorm*prevErrNorm;
|
||||
double e2n = e2/nviz, e2n_prev = e2_prev/nviz;
|
||||
std::cerr<<"move failed: lambda = "<<lambda<<", e2 = "<<e2<<" ("<<e2n<<") > "<<e2_prev<<" ("<<e2n_prev<<")"<<std::endl;
|
||||
}
|
||||
|
||||
//restore diagonal from backup
|
||||
{
|
||||
@ -886,9 +890,9 @@ static void fjac(int /*i*/, int /*j*/, CvMat *point_params, CvMat* cam_params, C
|
||||
double c[4] = { g+2*p1*y_strike+4*p2*x_strike, 2*p1*x_strike,
|
||||
2*p2*y_strike, g+2*p2*x_strike + 4*p1*y_strike };
|
||||
|
||||
CvMat coeffmat = cvMat(2,2,CV_64F, c );
|
||||
CvMat coeffmat2 = cvMat(2,2,CV_64F, c );
|
||||
|
||||
cvMatMul(&coeffmat, dstrike_dbig, dstrike2_dbig );
|
||||
cvMatMul(&coeffmat2, dstrike_dbig, dstrike2_dbig );
|
||||
|
||||
cvGEMM( &strike, dg_dbig, 1, NULL, 0, tmp, CV_GEMM_A_T );
|
||||
cvAdd( dstrike2_dbig, tmp, dstrike2_dbig );
|
||||
|
@ -180,13 +180,13 @@ void BasicRetinaFilter::setLPfilterParameters(const float beta, const float tau,
|
||||
}
|
||||
|
||||
float _temp = (1.0f+_beta)/(2.0f*_mu*_alpha);
|
||||
float _a = _filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[1+tableOffset]=(1.0f-_a)*(1.0f-_a)*(1.0f-_a)*(1.0f-_a)/(1.0f+_beta);
|
||||
float a = _filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[1+tableOffset]=(1.0f-a)*(1.0f-a)*(1.0f-a)*(1.0f-a)/(1.0f+_beta);
|
||||
_filteringCoeficientsTable[2+tableOffset] =tau;
|
||||
|
||||
//std::cout<<"BasicRetinaFilter::normal:"<<(1.0-_a)*(1.0-_a)*(1.0-_a)*(1.0-_a)/(1.0+_beta)<<" -> old:"<<(1-_a)*(1-_a)*(1-_a)*(1-_a)/(1+_beta)<<std::endl;
|
||||
//std::cout<<"BasicRetinaFilter::normal:"<<(1.0-a)*(1.0-a)*(1.0-a)*(1.0-a)/(1.0+_beta)<<" -> old:"<<(1-a)*(1-a)*(1-a)*(1-a)/(1+_beta)<<std::endl;
|
||||
|
||||
//std::cout<<"BasicRetinaFilter::_a="<<_a<<", gain="<<_filteringCoeficientsTable[1+tableOffset]<<", tau="<<tau<<std::endl;
|
||||
//std::cout<<"BasicRetinaFilter::a="<<a<<", gain="<<_filteringCoeficientsTable[1+tableOffset]<<", tau="<<tau<<std::endl;
|
||||
}
|
||||
|
||||
void BasicRetinaFilter::setProgressiveFilterConstants_CentredAccuracy(const float beta, const float tau, const float alpha0, const unsigned int filterIndex)
|
||||
@ -210,8 +210,8 @@ void BasicRetinaFilter::setProgressiveFilterConstants_CentredAccuracy(const floa
|
||||
|
||||
float _alpha=0.8f;
|
||||
float _temp = (1.0f+_beta)/(2.0f*_mu*_alpha);
|
||||
float _a=_filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[tableOffset+1]=(1.0f-_a)*(1.0f-_a)*(1.0f-_a)*(1.0f-_a)/(1.0f+_beta);
|
||||
float a=_filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[tableOffset+1]=(1.0f-a)*(1.0f-a)*(1.0f-a)*(1.0f-a)/(1.0f+_beta);
|
||||
_filteringCoeficientsTable[tableOffset+2] =tau;
|
||||
|
||||
float commonFactor=alpha0/(float)sqrt(_halfNBcolumns*_halfNBcolumns+_halfNBrows*_halfNBrows+1.0f);
|
||||
@ -266,8 +266,8 @@ void BasicRetinaFilter::setProgressiveFilterConstants_CustomAccuracy(const float
|
||||
}
|
||||
unsigned int tableOffset=filterIndex*3;
|
||||
float _temp = (1.0f+_beta)/(2.0f*_mu*_alpha);
|
||||
float _a=_filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[tableOffset+1]=(1.0f-_a)*(1.0f-_a)*(1.0f-_a)*(1.0f-_a)/(1.0f+_beta);
|
||||
float a=_filteringCoeficientsTable[tableOffset] = 1.0f + _temp - (float)sqrt( (1.0f+_temp)*(1.0f+_temp) - 1.0f);
|
||||
_filteringCoeficientsTable[tableOffset+1]=(1.0f-a)*(1.0f-a)*(1.0f-a)*(1.0f-a)/(1.0f+_beta);
|
||||
_filteringCoeficientsTable[tableOffset+2] =tau;
|
||||
|
||||
//memset(_progressiveSpatialConstant, 255, _filterOutput.getNBpixels());
|
||||
|
@ -68,10 +68,10 @@ void CvMeanShiftTracker::newTrackingWindow(Mat image, Rect selection)
|
||||
mixChannels(&hsv, 1, &hue, 1, channels, 2);
|
||||
|
||||
Mat roi(hue, selection);
|
||||
Mat maskroi(mask, selection);
|
||||
Mat mskroi(mask, selection);
|
||||
int ch[] = {0, 1};
|
||||
int chsize[] = {32, 32};
|
||||
calcHist(&roi, 1, ch, maskroi, hist, 1, chsize, ranges);
|
||||
calcHist(&roi, 1, ch, mskroi, hist, 1, chsize, ranges);
|
||||
normalize(hist, hist, 0, 255, CV_MINMAX);
|
||||
|
||||
prev_trackwindow = selection;
|
||||
|
@ -22,7 +22,7 @@ namespace cv
|
||||
{
|
||||
|
||||
using std::set;
|
||||
|
||||
|
||||
// Reads a sequence from a FileNode::SEQ with type _Tp into a result vector.
|
||||
template<typename _Tp>
|
||||
inline void readFileNodeList(const FileNode& fn, vector<_Tp>& result) {
|
||||
@ -48,7 +48,7 @@ inline void writeFileNodeList(FileStorage& fs, const string& name,
|
||||
}
|
||||
fs << "]";
|
||||
}
|
||||
|
||||
|
||||
static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double beta=0)
|
||||
{
|
||||
// number of samples
|
||||
@ -67,7 +67,7 @@ static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
// Removes duplicate elements in a given vector.
|
||||
template<typename _Tp>
|
||||
inline vector<_Tp> remove_dups(const vector<_Tp>& src) {
|
||||
@ -82,7 +82,7 @@ inline vector<_Tp> remove_dups(const vector<_Tp>& src) {
|
||||
return elems;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Turk, M., and Pentland, A. "Eigenfaces for recognition.". Journal of
|
||||
// Cognitive Neuroscience 3 (1991), 71–86.
|
||||
class Eigenfaces : public FaceRecognizer
|
||||
@ -124,10 +124,10 @@ public:
|
||||
|
||||
// See FaceRecognizer::save.
|
||||
void save(FileStorage& fs) const;
|
||||
|
||||
|
||||
AlgorithmInfo* info() const;
|
||||
};
|
||||
|
||||
|
||||
// Belhumeur, P. N., Hespanha, J., and Kriegman, D. "Eigenfaces vs. Fisher-
|
||||
// faces: Recognition using class specific linear projection.". IEEE
|
||||
// Transactions on Pattern Analysis and Machine Intelligence 19, 7 (1997),
|
||||
@ -208,11 +208,11 @@ public:
|
||||
//
|
||||
// radius, neighbors are used in the local binary patterns creation.
|
||||
// grid_x, grid_y control the grid size of the spatial histograms.
|
||||
LBPH(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8) :
|
||||
_grid_x(grid_x),
|
||||
_grid_y(grid_y),
|
||||
_radius(radius),
|
||||
_neighbors(neighbors) {}
|
||||
LBPH(int radius_=1, int neighbors_=8, int grid_x_=8, int grid_y_=8) :
|
||||
_grid_x(grid_x_),
|
||||
_grid_y(grid_y_),
|
||||
_radius(radius_),
|
||||
_neighbors(neighbors_) {}
|
||||
|
||||
// Initializes and computes this LBPH Model. The current implementation is
|
||||
// rather fixed as it uses the Extended Local Binary Patterns per default.
|
||||
@ -221,12 +221,12 @@ public:
|
||||
// (grid_x=8), (grid_y=8) controls the grid size of the spatial histograms.
|
||||
LBPH(InputArray src,
|
||||
InputArray labels,
|
||||
int radius=1, int neighbors=8,
|
||||
int grid_x=8, int grid_y=8) :
|
||||
_grid_x(grid_x),
|
||||
_grid_y(grid_y),
|
||||
_radius(radius),
|
||||
_neighbors(neighbors) {
|
||||
int radius_=1, int neighbors_=8,
|
||||
int grid_x_=8, int grid_y_=8) :
|
||||
_grid_x(grid_x_),
|
||||
_grid_y(grid_y_),
|
||||
_radius(radius_),
|
||||
_neighbors(neighbors_) {
|
||||
train(src, labels);
|
||||
}
|
||||
|
||||
@ -359,9 +359,9 @@ void Fisherfaces::train(InputArray src, InputArray _lbls) {
|
||||
// get data
|
||||
Mat labels = _lbls.getMat();
|
||||
Mat data = asRowMatrix(src, CV_64FC1);
|
||||
|
||||
|
||||
CV_Assert( labels.type() == CV_32S && (labels.cols == 1 || labels.rows == 1));
|
||||
|
||||
|
||||
// dimensionality
|
||||
int N = data.rows; // number of samples
|
||||
//int D = data.cols; // dimension of samples
|
||||
@ -369,7 +369,7 @@ void Fisherfaces::train(InputArray src, InputArray _lbls) {
|
||||
if(labels.total() != (size_t)N)
|
||||
CV_Error(CV_StsUnsupportedFormat, "Labels must be given as integer (CV_32SC1).");
|
||||
// compute the Fisherfaces
|
||||
|
||||
|
||||
vector<int> ll;
|
||||
labels.copyTo(ll);
|
||||
int C = (int)remove_dups(ll).size(); // number of unique classes
|
||||
@ -570,7 +570,7 @@ static Mat histc(InputArray _src, int minVal, int maxVal, bool normed)
|
||||
return Mat();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static Mat spatial_histogram(InputArray _src, int numPatterns,
|
||||
int grid_x, int grid_y, bool normed)
|
||||
{
|
||||
@ -610,7 +610,7 @@ static Mat elbp(InputArray src, int radius, int neighbors) {
|
||||
elbp(src, dst, radius, neighbors);
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
void LBPH::load(const FileStorage& fs) {
|
||||
fs["radius"] >> _radius;
|
||||
fs["neighbors"] >> _neighbors;
|
||||
@ -684,24 +684,24 @@ int LBPH::predict(InputArray _src) const {
|
||||
}
|
||||
return minClass;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Ptr<FaceRecognizer> createEigenFaceRecognizer(int num_components)
|
||||
{
|
||||
return new Eigenfaces(num_components);
|
||||
}
|
||||
|
||||
|
||||
Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components)
|
||||
{
|
||||
return new Fisherfaces(num_components);
|
||||
}
|
||||
|
||||
|
||||
Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius, int neighbors,
|
||||
int grid_x, int grid_y)
|
||||
{
|
||||
return new LBPH(radius, neighbors, grid_x, grid_y);
|
||||
}
|
||||
|
||||
|
||||
CV_INIT_ALGORITHM(Eigenfaces, "FaceRecognizer.Eigenfaces",
|
||||
obj.info()->addParam(obj, "ncomponents", obj._num_components);
|
||||
obj.info()->addParam(obj, "projections", obj._projections, true);
|
||||
@ -716,8 +716,8 @@ CV_INIT_ALGORITHM(Fisherfaces, "FaceRecognizer.Fisherfaces",
|
||||
obj.info()->addParam(obj, "labels", obj._labels, true);
|
||||
obj.info()->addParam(obj, "eigenvectors", obj._eigenvectors, true);
|
||||
obj.info()->addParam(obj, "eigenvalues", obj._eigenvalues, true);
|
||||
obj.info()->addParam(obj, "mean", obj._mean, true));
|
||||
|
||||
obj.info()->addParam(obj, "mean", obj._mean, true));
|
||||
|
||||
CV_INIT_ALGORITHM(LBPH, "FaceRecognizer.LBPH",
|
||||
obj.info()->addParam(obj, "radius", obj._radius);
|
||||
obj.info()->addParam(obj, "neighbors", obj._neighbors);
|
||||
@ -725,7 +725,7 @@ CV_INIT_ALGORITHM(LBPH, "FaceRecognizer.LBPH",
|
||||
obj.info()->addParam(obj, "grid_y", obj._grid_y);
|
||||
obj.info()->addParam(obj, "histograms", obj._histograms, true);
|
||||
obj.info()->addParam(obj, "labels", obj._labels, true));
|
||||
|
||||
|
||||
bool initModule_contrib()
|
||||
{
|
||||
Ptr<Algorithm> efaces = createEigenfaces(), ffaces = createFisherfaces(), lbph = createLBPH();
|
||||
|
@ -235,19 +235,19 @@ private:
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp **alloc_2d(int m, int n) {
|
||||
_Tp **alloc_2d(int m, int _n) {
|
||||
_Tp **arr = new _Tp*[m];
|
||||
for (int i = 0; i < m; i++)
|
||||
arr[i] = new _Tp[n];
|
||||
arr[i] = new _Tp[_n];
|
||||
return arr;
|
||||
}
|
||||
|
||||
// Allocates memory.
|
||||
template<typename _Tp>
|
||||
_Tp **alloc_2d(int m, int n, _Tp val) {
|
||||
_Tp **arr = alloc_2d<_Tp> (m, n);
|
||||
_Tp **alloc_2d(int m, int _n, _Tp val) {
|
||||
_Tp **arr = alloc_2d<_Tp> (m, _n);
|
||||
for (int i = 0; i < m; i++) {
|
||||
for (int j = 0; j < n; j++) {
|
||||
for (int j = 0; j < _n; j++) {
|
||||
arr[i][j] = val;
|
||||
}
|
||||
}
|
||||
@ -255,17 +255,17 @@ private:
|
||||
}
|
||||
|
||||
void cdiv(double xr, double xi, double yr, double yi) {
|
||||
double r, d;
|
||||
double r, dv;
|
||||
if (std::abs(yr) > std::abs(yi)) {
|
||||
r = yi / yr;
|
||||
d = yr + r * yi;
|
||||
cdivr = (xr + r * xi) / d;
|
||||
cdivi = (xi - r * xr) / d;
|
||||
dv = yr + r * yi;
|
||||
cdivr = (xr + r * xi) / dv;
|
||||
cdivi = (xi - r * xr) / dv;
|
||||
} else {
|
||||
r = yr / yi;
|
||||
d = yi + r * yr;
|
||||
cdivr = (r * xr + xi) / d;
|
||||
cdivi = (r * xi - xr) / d;
|
||||
dv = yi + r * yr;
|
||||
cdivr = (r * xr + xi) / dv;
|
||||
cdivi = (r * xi - xr) / dv;
|
||||
}
|
||||
}
|
||||
|
||||
@ -280,7 +280,7 @@ private:
|
||||
|
||||
// Initialize
|
||||
int nn = this->n;
|
||||
int n = nn - 1;
|
||||
int n1 = nn - 1;
|
||||
int low = 0;
|
||||
int high = nn - 1;
|
||||
double eps = pow(2.0, -52.0);
|
||||
@ -302,10 +302,10 @@ private:
|
||||
|
||||
// Outer loop over eigenvalue index
|
||||
int iter = 0;
|
||||
while (n >= low) {
|
||||
while (n1 >= low) {
|
||||
|
||||
// Look for single small sub-diagonal element
|
||||
int l = n;
|
||||
int l = n1;
|
||||
while (l > low) {
|
||||
s = std::abs(H[l - 1][l - 1]) + std::abs(H[l][l]);
|
||||
if (s == 0.0) {
|
||||
@ -320,23 +320,23 @@ private:
|
||||
// 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--;
|
||||
if (l == n1) {
|
||||
H[n1][n1] = H[n1][n1] + exshift;
|
||||
d[n1] = H[n1][n1];
|
||||
e[n1] = 0.0;
|
||||
n1--;
|
||||
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;
|
||||
} else if (l == n1 - 1) {
|
||||
w = H[n1][n1 - 1] * H[n1 - 1][n1];
|
||||
p = (H[n1 - 1][n1 - 1] - H[n1][n1]) / 2.0;
|
||||
q = p * p + w;
|
||||
z = sqrt(std::abs(q));
|
||||
H[n][n] = H[n][n] + exshift;
|
||||
H[n - 1][n - 1] = H[n - 1][n - 1] + exshift;
|
||||
x = H[n][n];
|
||||
H[n1][n1] = H[n1][n1] + exshift;
|
||||
H[n1 - 1][n1 - 1] = H[n1 - 1][n1 - 1] + exshift;
|
||||
x = H[n1][n1];
|
||||
|
||||
// Real pair
|
||||
|
||||
@ -346,14 +346,14 @@ private:
|
||||
} else {
|
||||
z = p - z;
|
||||
}
|
||||
d[n - 1] = x + z;
|
||||
d[n] = d[n - 1];
|
||||
d[n1 - 1] = x + z;
|
||||
d[n1] = d[n1 - 1];
|
||||
if (z != 0.0) {
|
||||
d[n] = x - w / z;
|
||||
d[n1] = x - w / z;
|
||||
}
|
||||
e[n - 1] = 0.0;
|
||||
e[n] = 0.0;
|
||||
x = H[n][n - 1];
|
||||
e[n1 - 1] = 0.0;
|
||||
e[n1] = 0.0;
|
||||
x = H[n1][n1 - 1];
|
||||
s = std::abs(x) + std::abs(z);
|
||||
p = x / s;
|
||||
q = z / s;
|
||||
@ -363,37 +363,37 @@ private:
|
||||
|
||||
// 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;
|
||||
for (int j = n1 - 1; j < nn; j++) {
|
||||
z = H[n1 - 1][j];
|
||||
H[n1 - 1][j] = q * z + p * H[n1][j];
|
||||
H[n1][j] = q * H[n1][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;
|
||||
for (int i = 0; i <= n1; i++) {
|
||||
z = H[i][n1 - 1];
|
||||
H[i][n1 - 1] = q * z + p * H[i][n1];
|
||||
H[i][n1] = q * H[i][n1] - 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;
|
||||
z = V[i][n1 - 1];
|
||||
V[i][n1 - 1] = q * z + p * V[i][n1];
|
||||
V[i][n1] = q * V[i][n1] - p * z;
|
||||
}
|
||||
|
||||
// Complex pair
|
||||
|
||||
} else {
|
||||
d[n - 1] = x + p;
|
||||
d[n] = x + p;
|
||||
e[n - 1] = z;
|
||||
e[n] = -z;
|
||||
d[n1 - 1] = x + p;
|
||||
d[n1] = x + p;
|
||||
e[n1 - 1] = z;
|
||||
e[n1] = -z;
|
||||
}
|
||||
n = n - 2;
|
||||
n1 = n1 - 2;
|
||||
iter = 0;
|
||||
|
||||
// No convergence yet
|
||||
@ -402,22 +402,22 @@ private:
|
||||
|
||||
// Form shift
|
||||
|
||||
x = H[n][n];
|
||||
x = H[n1][n1];
|
||||
y = 0.0;
|
||||
w = 0.0;
|
||||
if (l < n) {
|
||||
y = H[n - 1][n - 1];
|
||||
w = H[n][n - 1] * H[n - 1][n];
|
||||
if (l < n1) {
|
||||
y = H[n1 - 1][n1 - 1];
|
||||
w = H[n1][n1 - 1] * H[n1 - 1][n1];
|
||||
}
|
||||
|
||||
// Wilkinson's original ad hoc shift
|
||||
|
||||
if (iter == 10) {
|
||||
exshift += x;
|
||||
for (int i = low; i <= n; i++) {
|
||||
for (int i = low; i <= n1; i++) {
|
||||
H[i][i] -= x;
|
||||
}
|
||||
s = std::abs(H[n][n - 1]) + std::abs(H[n - 1][n - 2]);
|
||||
s = std::abs(H[n1][n1 - 1]) + std::abs(H[n1 - 1][n1 - 2]);
|
||||
x = y = 0.75 * s;
|
||||
w = -0.4375 * s * s;
|
||||
}
|
||||
@ -433,7 +433,7 @@ private:
|
||||
s = -s;
|
||||
}
|
||||
s = x - w / ((y - x) / 2.0 + s);
|
||||
for (int i = low; i <= n; i++) {
|
||||
for (int i = low; i <= n1; i++) {
|
||||
H[i][i] -= s;
|
||||
}
|
||||
exshift += s;
|
||||
@ -444,7 +444,7 @@ private:
|
||||
iter = iter + 1; // (Could check iteration count here.)
|
||||
|
||||
// Look for two consecutive small sub-diagonal elements
|
||||
int m = n - 2;
|
||||
int m = n1 - 2;
|
||||
while (m >= l) {
|
||||
z = H[m][m];
|
||||
r = x - z;
|
||||
@ -467,7 +467,7 @@ private:
|
||||
m--;
|
||||
}
|
||||
|
||||
for (int i = m + 2; i <= n; i++) {
|
||||
for (int i = m + 2; i <= n1; i++) {
|
||||
H[i][i - 2] = 0.0;
|
||||
if (i > m + 2) {
|
||||
H[i][i - 3] = 0.0;
|
||||
@ -476,8 +476,8 @@ private:
|
||||
|
||||
// Double QR step involving rows l:n and columns m:n
|
||||
|
||||
for (int k = m; k <= n - 1; k++) {
|
||||
bool notlast = (k != n - 1);
|
||||
for (int k = m; k <= n1 - 1; k++) {
|
||||
bool notlast = (k != n1 - 1);
|
||||
if (k != m) {
|
||||
p = H[k][k - 1];
|
||||
q = H[k + 1][k - 1];
|
||||
@ -523,7 +523,7 @@ private:
|
||||
|
||||
// Column modification
|
||||
|
||||
for (int i = 0; i <= min(n, k + 3); i++) {
|
||||
for (int i = 0; i <= min(n1, k + 3); i++) {
|
||||
p = x * H[i][k] + y * H[i][k + 1];
|
||||
if (notlast) {
|
||||
p = p + z * H[i][k + 2];
|
||||
@ -547,7 +547,7 @@ private:
|
||||
} // (s != 0)
|
||||
} // k loop
|
||||
} // check convergence
|
||||
} // while (n >= low)
|
||||
} // while (n1 >= low)
|
||||
|
||||
// Backsubstitute to find vectors of upper triangular form
|
||||
|
||||
@ -555,20 +555,20 @@ private:
|
||||
return;
|
||||
}
|
||||
|
||||
for (n = nn - 1; n >= 0; n--) {
|
||||
p = d[n];
|
||||
q = e[n];
|
||||
for (n1 = nn - 1; n1 >= 0; n1--) {
|
||||
p = d[n1];
|
||||
q = e[n1];
|
||||
|
||||
// Real vector
|
||||
|
||||
if (q == 0) {
|
||||
int l = n;
|
||||
H[n][n] = 1.0;
|
||||
for (int i = n - 1; i >= 0; i--) {
|
||||
int l = n1;
|
||||
H[n1][n1] = 1.0;
|
||||
for (int i = n1 - 1; i >= 0; i--) {
|
||||
w = H[i][i] - p;
|
||||
r = 0.0;
|
||||
for (int j = l; j <= n; j++) {
|
||||
r = r + H[i][j] * H[j][n];
|
||||
for (int j = l; j <= n1; j++) {
|
||||
r = r + H[i][j] * H[j][n1];
|
||||
}
|
||||
if (e[i] < 0.0) {
|
||||
z = w;
|
||||
@ -577,9 +577,9 @@ private:
|
||||
l = i;
|
||||
if (e[i] == 0.0) {
|
||||
if (w != 0.0) {
|
||||
H[i][n] = -r / w;
|
||||
H[i][n1] = -r / w;
|
||||
} else {
|
||||
H[i][n] = -r / (eps * norm);
|
||||
H[i][n1] = -r / (eps * norm);
|
||||
}
|
||||
|
||||
// Solve real equations
|
||||
@ -589,20 +589,20 @@ private:
|
||||
y = H[i + 1][i];
|
||||
q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
|
||||
t = (x * s - z * r) / q;
|
||||
H[i][n] = t;
|
||||
H[i][n1] = t;
|
||||
if (std::abs(x) > std::abs(z)) {
|
||||
H[i + 1][n] = (-r - w * t) / x;
|
||||
H[i + 1][n1] = (-r - w * t) / x;
|
||||
} else {
|
||||
H[i + 1][n] = (-s - y * t) / z;
|
||||
H[i + 1][n1] = (-s - y * t) / z;
|
||||
}
|
||||
}
|
||||
|
||||
// Overflow control
|
||||
|
||||
t = std::abs(H[i][n]);
|
||||
t = std::abs(H[i][n1]);
|
||||
if ((eps * t) * t > 1) {
|
||||
for (int j = i; j <= n; j++) {
|
||||
H[j][n] = H[j][n] / t;
|
||||
for (int j = i; j <= n1; j++) {
|
||||
H[j][n1] = H[j][n1] / t;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -611,27 +611,27 @@ private:
|
||||
// Complex vector
|
||||
|
||||
} else if (q < 0) {
|
||||
int l = n - 1;
|
||||
int l = n1 - 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];
|
||||
if (std::abs(H[n1][n1 - 1]) > std::abs(H[n1 - 1][n1])) {
|
||||
H[n1 - 1][n1 - 1] = q / H[n1][n1 - 1];
|
||||
H[n1 - 1][n1] = -(H[n1][n1] - p) / H[n1][n1 - 1];
|
||||
} else {
|
||||
cdiv(0.0, -H[n - 1][n], H[n - 1][n - 1] - p, q);
|
||||
H[n - 1][n - 1] = cdivr;
|
||||
H[n - 1][n] = cdivi;
|
||||
cdiv(0.0, -H[n1 - 1][n1], H[n1 - 1][n1 - 1] - p, q);
|
||||
H[n1 - 1][n1 - 1] = cdivr;
|
||||
H[n1 - 1][n1] = cdivi;
|
||||
}
|
||||
H[n][n - 1] = 0.0;
|
||||
H[n][n] = 1.0;
|
||||
for (int i = n - 2; i >= 0; i--) {
|
||||
H[n1][n1 - 1] = 0.0;
|
||||
H[n1][n1] = 1.0;
|
||||
for (int i = n1 - 2; i >= 0; i--) {
|
||||
double ra, sa, vr, vi;
|
||||
ra = 0.0;
|
||||
sa = 0.0;
|
||||
for (int j = l; j <= n; j++) {
|
||||
ra = ra + H[i][j] * H[j][n - 1];
|
||||
sa = sa + H[i][j] * H[j][n];
|
||||
for (int j = l; j <= n1; j++) {
|
||||
ra = ra + H[i][j] * H[j][n1 - 1];
|
||||
sa = sa + H[i][j] * H[j][n1];
|
||||
}
|
||||
w = H[i][i] - p;
|
||||
|
||||
@ -643,8 +643,8 @@ private:
|
||||
l = i;
|
||||
if (e[i] == 0) {
|
||||
cdiv(-ra, -sa, w, q);
|
||||
H[i][n - 1] = cdivr;
|
||||
H[i][n] = cdivi;
|
||||
H[i][n1 - 1] = cdivr;
|
||||
H[i][n1] = cdivi;
|
||||
} else {
|
||||
|
||||
// Solve complex equations
|
||||
@ -659,28 +659,28 @@ private:
|
||||
}
|
||||
cdiv(x * r - z * ra + q * sa,
|
||||
x * s - z * sa - q * ra, vr, vi);
|
||||
H[i][n - 1] = cdivr;
|
||||
H[i][n] = cdivi;
|
||||
H[i][n1 - 1] = cdivr;
|
||||
H[i][n1] = cdivi;
|
||||
if (std::abs(x) > (std::abs(z) + std::abs(q))) {
|
||||
H[i + 1][n - 1] = (-ra - w * H[i][n - 1] + q
|
||||
* H[i][n]) / x;
|
||||
H[i + 1][n] = (-sa - w * H[i][n] - q * H[i][n
|
||||
H[i + 1][n1 - 1] = (-ra - w * H[i][n1 - 1] + q
|
||||
* H[i][n1]) / x;
|
||||
H[i + 1][n1] = (-sa - w * H[i][n1] - q * H[i][n1
|
||||
- 1]) / x;
|
||||
} else {
|
||||
cdiv(-r - y * H[i][n - 1], -s - y * H[i][n], z,
|
||||
cdiv(-r - y * H[i][n1 - 1], -s - y * H[i][n1], z,
|
||||
q);
|
||||
H[i + 1][n - 1] = cdivr;
|
||||
H[i + 1][n] = cdivi;
|
||||
H[i + 1][n1 - 1] = cdivr;
|
||||
H[i + 1][n1] = cdivi;
|
||||
}
|
||||
}
|
||||
|
||||
// Overflow control
|
||||
|
||||
t = max(std::abs(H[i][n - 1]), std::abs(H[i][n]));
|
||||
t = max(std::abs(H[i][n1 - 1]), std::abs(H[i][n1]));
|
||||
if ((eps * t) * t > 1) {
|
||||
for (int j = i; j <= n; j++) {
|
||||
H[j][n - 1] = H[j][n - 1] / t;
|
||||
H[j][n] = H[j][n] / t;
|
||||
for (int j = i; j <= n1; j++) {
|
||||
H[j][n1 - 1] = H[j][n1 - 1] / t;
|
||||
H[j][n1] = H[j][n1] / t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -60,9 +60,9 @@ ICVS 2011, Sophia Antipolis, France, September 20-22, 2011
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
//------------------------------------interp-------------------------------------------
|
||||
LogPolar_Interp::LogPolar_Interp(int w, int h, Point2i center, int R, double ro0, int interp, int full, int S, int sp)
|
||||
LogPolar_Interp::LogPolar_Interp(int w, int h, Point2i center, int _R, double _ro0, int _interp, int full, int _S, int sp)
|
||||
{
|
||||
if ( (center.x!=w/2 || center.y!=h/2) && full==0) full=1;
|
||||
|
||||
@ -97,23 +97,23 @@ LogPolar_Interp::LogPolar_Interp(int w, int h, Point2i center, int R, double ro0
|
||||
|
||||
if (sp){
|
||||
int jc=M/2-1, ic=N/2-1;
|
||||
int romax=min(ic, jc);
|
||||
double a=exp(log((double)(romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(a-1)+0.5);
|
||||
int _romax=min(ic, jc);
|
||||
double _a=exp(log((double)(_romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(_a-1)+0.5);
|
||||
}
|
||||
|
||||
this->interp=interp;
|
||||
interp=_interp;
|
||||
|
||||
create_map(M, N, R, S, ro0);
|
||||
create_map(M, N, _R, _S, _ro0);
|
||||
}
|
||||
|
||||
void LogPolar_Interp::create_map(int M, int N, int R, int S, double ro0)
|
||||
void LogPolar_Interp::create_map(int _M, int _N, int _R, int _S, double _ro0)
|
||||
{
|
||||
this->M=M;
|
||||
this->N=N;
|
||||
this->R=R;
|
||||
this->S=S;
|
||||
this->ro0=ro0;
|
||||
M=_M;
|
||||
N=_N;
|
||||
R=_R;
|
||||
S=_S;
|
||||
ro0=_ro0;
|
||||
|
||||
int jc=N/2-1, ic=M/2-1;
|
||||
romax=min(ic, jc);
|
||||
@ -130,7 +130,7 @@ void LogPolar_Interp::create_map(int M, int N, int R, int S, double ro0)
|
||||
for(int u=0; u<R; u++)
|
||||
{
|
||||
Rsri.at<float>(v,u)=(float)(ro0*pow(a,u)*sin(v/q)+jc);
|
||||
Csri.at<float>(v,u)=(float)(ro0*pow(a,u)*cos(v/q)+ic);
|
||||
Csri.at<float>(v,u)=(float)(ro0*pow(a,u)*cos(v/q)+ic);
|
||||
}
|
||||
}
|
||||
|
||||
@ -158,7 +158,7 @@ void LogPolar_Interp::create_map(int M, int N, int R, int S, double ro0)
|
||||
const Mat LogPolar_Interp::to_cortical(const Mat &source)
|
||||
{
|
||||
Mat out(S,R,CV_8UC1,Scalar(0));
|
||||
|
||||
|
||||
Mat source_border;
|
||||
copyMakeBorder(source,source_border,top,bottom,left,right,BORDER_CONSTANT,Scalar(0));
|
||||
|
||||
@ -173,7 +173,7 @@ const Mat LogPolar_Interp::to_cartesian(const Mat &source)
|
||||
Mat out(N,M,CV_8UC1,Scalar(0));
|
||||
|
||||
Mat source_border;
|
||||
|
||||
|
||||
if (interp==INTER_NEAREST || interp==INTER_LINEAR){
|
||||
copyMakeBorder(source,source_border,0,1,0,0,BORDER_CONSTANT,Scalar(0));
|
||||
Mat rowS0 = source_border.row(S);
|
||||
@ -208,7 +208,7 @@ LogPolar_Interp::~LogPolar_Interp()
|
||||
|
||||
//------------------------------------overlapping----------------------------------
|
||||
|
||||
LogPolar_Overlapping::LogPolar_Overlapping(int w, int h, Point2i center, int R, double ro0, int full, int S, int sp)
|
||||
LogPolar_Overlapping::LogPolar_Overlapping(int w, int h, Point2i center, int _R, double _ro0, int full, int _S, int sp)
|
||||
{
|
||||
if ( (center.x!=w/2 || center.y!=h/2) && full==0) full=1;
|
||||
|
||||
@ -244,21 +244,21 @@ LogPolar_Overlapping::LogPolar_Overlapping(int w, int h, Point2i center, int R,
|
||||
|
||||
if (sp){
|
||||
int jc=M/2-1, ic=N/2-1;
|
||||
int romax=min(ic, jc);
|
||||
double a=exp(log((double)(romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(a-1)+0.5);
|
||||
int _romax=min(ic, jc);
|
||||
double _a=exp(log((double)(_romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(_a-1)+0.5);
|
||||
}
|
||||
|
||||
create_map(M, N, R, S, ro0);
|
||||
create_map(M, N, _R, _S, _ro0);
|
||||
}
|
||||
|
||||
void LogPolar_Overlapping::create_map(int M, int N, int R, int S, double ro0)
|
||||
void LogPolar_Overlapping::create_map(int _M, int _N, int _R, int _S, double _ro0)
|
||||
{
|
||||
this->M=M;
|
||||
this->N=N;
|
||||
this->R=R;
|
||||
this->S=S;
|
||||
this->ro0=ro0;
|
||||
M=_M;
|
||||
N=_N;
|
||||
R=_R;
|
||||
S=_S;
|
||||
ro0=_ro0;
|
||||
|
||||
int jc=N/2-1, ic=M/2-1;
|
||||
romax=min(ic, jc);
|
||||
@ -280,14 +280,14 @@ void LogPolar_Overlapping::create_map(int M, int N, int R, int S, double ro0)
|
||||
for(int u=0; u<R; u++)
|
||||
{
|
||||
Rsri.at<float>(v,u)=(float)(ro0*pow(a,u)*sin(v/q)+jc);
|
||||
Csri.at<float>(v,u)=(float)(ro0*pow(a,u)*cos(v/q)+ic);
|
||||
Csri.at<float>(v,u)=(float)(ro0*pow(a,u)*cos(v/q)+ic);
|
||||
Rsr[v*R+u]=(int)floor(Rsri.at<float>(v,u));
|
||||
Csr[v*R+u]=(int)floor(Csri.at<float>(v,u));
|
||||
Csr[v*R+u]=(int)floor(Csri.at<float>(v,u));
|
||||
}
|
||||
}
|
||||
|
||||
bool done=false;
|
||||
|
||||
|
||||
for(int i=0; i<R; i++)
|
||||
{
|
||||
Wsr[i]=ro0*(a-1)*pow(a,i-1);
|
||||
@ -297,7 +297,7 @@ void LogPolar_Overlapping::create_map(int M, int N, int R, int S, double ro0)
|
||||
done =true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(int j=0; j<N; j++)
|
||||
{
|
||||
for(int i=0; i<M; i++)//mdf
|
||||
@ -312,7 +312,7 @@ void LogPolar_Overlapping::create_map(int M, int N, int R, int S, double ro0)
|
||||
theta+=2*CV_PI;
|
||||
|
||||
ETAyx.at<float>(j,i)=(float)(q*theta);
|
||||
|
||||
|
||||
double ro2=(j-jc)*(j-jc)+(i-ic)*(i-ic);
|
||||
CSIyx.at<float>(j,i)=(float)(0.5*log(ro2/(ro0*ro0))/log(a));
|
||||
}
|
||||
@ -387,7 +387,7 @@ const Mat LogPolar_Overlapping::to_cartesian(const Mat &source)
|
||||
remap(source_border,out,CSIyx,ETAyx,INTER_LINEAR);
|
||||
|
||||
int wm=w_ker_2D[R-1].w;
|
||||
|
||||
|
||||
vector<double> IMG((N+2*wm+1)*(M+2*wm+1), 0.);
|
||||
vector<double> NOR((N+2*wm+1)*(M+2*wm+1), 0.);
|
||||
|
||||
@ -426,14 +426,14 @@ const Mat LogPolar_Overlapping::to_cartesian(const Mat &source)
|
||||
Mat out_cropped=out(Range(top,N-1-bottom),Range(left,M-1-right));
|
||||
return out_cropped;
|
||||
}
|
||||
|
||||
|
||||
LogPolar_Overlapping::~LogPolar_Overlapping()
|
||||
{
|
||||
}
|
||||
|
||||
//----------------------------------------adjacent---------------------------------------
|
||||
|
||||
LogPolar_Adjacent::LogPolar_Adjacent(int w, int h, Point2i center, int R, double ro0, double smin, int full, int S, int sp)
|
||||
LogPolar_Adjacent::LogPolar_Adjacent(int w, int h, Point2i center, int _R, double _ro0, double smin, int full, int _S, int sp)
|
||||
{
|
||||
if ( (center.x!=w/2 || center.y!=h/2) && full==0) full=1;
|
||||
|
||||
@ -468,22 +468,22 @@ LogPolar_Adjacent::LogPolar_Adjacent(int w, int h, Point2i center, int R, double
|
||||
|
||||
if (sp){
|
||||
int jc=M/2-1, ic=N/2-1;
|
||||
int romax=min(ic, jc);
|
||||
double a=exp(log((double)(romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(a-1)+0.5);
|
||||
int _romax=min(ic, jc);
|
||||
double _a=exp(log((double)(_romax/2-1)/(double)ro0)/(double)R);
|
||||
S=(int) floor(2*CV_PI/(_a-1)+0.5);
|
||||
}
|
||||
|
||||
create_map(M, N, R, S, ro0, smin);
|
||||
create_map(M, N, _R, _S, _ro0, smin);
|
||||
}
|
||||
|
||||
|
||||
void LogPolar_Adjacent::create_map(int M, int N, int R, int S, double ro0, double smin)
|
||||
void LogPolar_Adjacent::create_map(int _M, int _N, int _R, int _S, double _ro0, double smin)
|
||||
{
|
||||
LogPolar_Adjacent::M=M;
|
||||
LogPolar_Adjacent::N=N;
|
||||
LogPolar_Adjacent::R=R;
|
||||
LogPolar_Adjacent::S=S;
|
||||
LogPolar_Adjacent::ro0=ro0;
|
||||
M=_M;
|
||||
N=_N;
|
||||
R=_R;
|
||||
S=_S;
|
||||
ro0=_ro0;
|
||||
romax=min(M/2.0, N/2.0);
|
||||
|
||||
a=exp(log(romax/ro0)/(double)R);
|
||||
@ -507,7 +507,7 @@ void LogPolar_Adjacent::create_map(int M, int N, int R, int S, double ro0, doubl
|
||||
|
||||
|
||||
void LogPolar_Adjacent::subdivide_recursively(double x, double y, int i, int j, double length, double smin)
|
||||
{
|
||||
{
|
||||
if(length<=smin)
|
||||
{
|
||||
int u, v;
|
||||
@ -576,7 +576,7 @@ const Mat LogPolar_Adjacent::to_cortical(const Mat &source)
|
||||
|
||||
for(int j=0; j<N; j++)
|
||||
for(int i=0; i<M; i++)
|
||||
{
|
||||
{
|
||||
for(size_t z=0; z<(L[M*j+i]).size(); z++)
|
||||
{
|
||||
map[R*((L[M*j+i])[z].v)+((L[M*j+i])[z].u)]+=((L[M*j+i])[z].a)*(source_border.at<uchar>(j,i));
|
||||
@ -641,7 +641,7 @@ bool LogPolar_Adjacent::get_uv(double x, double y, int&u, int&v)
|
||||
else
|
||||
v= (int) floor(q*(theta+2*CV_PI));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LogPolar_Adjacent::~LogPolar_Adjacent()
|
||||
|
@ -171,9 +171,9 @@ namespace cv
|
||||
{
|
||||
}
|
||||
|
||||
Octree::Octree(const vector<Point3f>& points3d, int maxLevels, int minPoints)
|
||||
Octree::Octree(const vector<Point3f>& points3d, int maxLevels, int _minPoints)
|
||||
{
|
||||
buildTree(points3d, maxLevels, minPoints);
|
||||
buildTree(points3d, maxLevels, _minPoints);
|
||||
}
|
||||
|
||||
Octree::~Octree()
|
||||
@ -256,12 +256,12 @@ namespace cv
|
||||
}
|
||||
}
|
||||
|
||||
void Octree::buildTree(const vector<Point3f>& points3d, int maxLevels, int minPoints)
|
||||
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;
|
||||
minPoints = _minPoints;
|
||||
|
||||
nodes.clear();
|
||||
nodes.push_back(Node());
|
||||
@ -275,7 +275,7 @@ namespace cv
|
||||
for (size_t i = 0; i < MAX_LEAFS; i++)
|
||||
root.children[i] = 0;
|
||||
|
||||
if (maxLevels != 1 && (root.end - root.begin) > minPoints)
|
||||
if (maxLevels != 1 && (root.end - root.begin) > _minPoints)
|
||||
{
|
||||
root.isLeaf = false;
|
||||
buildNext(0);
|
||||
|
@ -75,16 +75,16 @@
|
||||
namespace cv
|
||||
{
|
||||
|
||||
Retina::Retina(const cv::Size inputSize)
|
||||
Retina::Retina(const cv::Size inputSz)
|
||||
{
|
||||
_retinaFilter = 0;
|
||||
_init(inputSize, true, RETINA_COLOR_BAYER, false);
|
||||
_init(inputSz, true, RETINA_COLOR_BAYER, false);
|
||||
}
|
||||
|
||||
Retina::Retina(const cv::Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod, const bool useRetinaLogSampling, const double reductionFactor, const double samplingStrenght)
|
||||
Retina::Retina(const cv::Size inputSz, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod, const bool useRetinaLogSampling, const double reductionFactor, const double samplingStrenght)
|
||||
{
|
||||
_retinaFilter = 0;
|
||||
_init(inputSize, colorMode, colorSamplingMethod, useRetinaLogSampling, reductionFactor, samplingStrenght);
|
||||
_init(inputSz, colorMode, colorSamplingMethod, useRetinaLogSampling, reductionFactor, samplingStrenght);
|
||||
};
|
||||
|
||||
Retina::~Retina()
|
||||
@ -342,20 +342,20 @@ const std::valarray<float> & Retina::getMagno() const {return _retinaFilter->get
|
||||
const std::valarray<float> & Retina::getParvo() const {if (_retinaFilter->getColorMode())return _retinaFilter->getColorOutput(); /* implicite else */return _retinaFilter->getContours();}
|
||||
|
||||
// private method called by constructirs
|
||||
void Retina::_init(const cv::Size inputSize, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod, const bool useRetinaLogSampling, const double reductionFactor, const double samplingStrenght)
|
||||
void Retina::_init(const cv::Size inputSz, const bool colorMode, RETINA_COLORSAMPLINGMETHOD colorSamplingMethod, const bool useRetinaLogSampling, const double reductionFactor, const double samplingStrenght)
|
||||
{
|
||||
// basic error check
|
||||
if (inputSize.height*inputSize.width <= 0)
|
||||
if (inputSz.height*inputSz.width <= 0)
|
||||
throw cv::Exception(-1, "Bad retina size setup : size height and with must be superior to zero", "Retina::setup", "Retina.h", 0);
|
||||
|
||||
unsigned int nbPixels=inputSize.height*inputSize.width;
|
||||
unsigned int nbPixels=inputSz.height*inputSz.width;
|
||||
// resize buffers if size does not match
|
||||
_inputBuffer.resize(nbPixels*3); // buffer supports gray images but also 3 channels color buffers... (larger is better...)
|
||||
|
||||
// allocate the retina model
|
||||
if (_retinaFilter)
|
||||
delete _retinaFilter;
|
||||
_retinaFilter = new RetinaFilter(inputSize.height, inputSize.width, colorMode, colorSamplingMethod, useRetinaLogSampling, reductionFactor, samplingStrenght);
|
||||
_retinaFilter = new RetinaFilter(inputSz.height, inputSz.width, colorMode, colorSamplingMethod, useRetinaLogSampling, reductionFactor, samplingStrenght);
|
||||
|
||||
// prepare the default parameter XML file with default setup
|
||||
setup(_retinaParameters);
|
||||
|
@ -325,15 +325,15 @@ void RetinaColor::runColorDemultiplexing(const std::valarray<float> &multiplexed
|
||||
|
||||
}else
|
||||
{
|
||||
register const float *multiplexedColorFramePTR= get_data(multiplexedColorFrame);
|
||||
for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR)
|
||||
register const float *multiplexedColorFramePTR1= get_data(multiplexedColorFrame);
|
||||
for (unsigned int indexc=0; indexc<_filterOutput.getNBpixels() ; ++indexc, ++chrominancePTR, ++colorLocalDensityPTR, ++luminance, ++multiplexedColorFramePTR1)
|
||||
{
|
||||
// normalize by photoreceptors density
|
||||
float Cr=*(chrominancePTR)*_colorLocalDensity[indexc];
|
||||
float Cg=*(chrominancePTR+_filterOutput.getNBpixels())*_colorLocalDensity[indexc+_filterOutput.getNBpixels()];
|
||||
float Cb=*(chrominancePTR+_filterOutput.getDoubleNBpixels())*_colorLocalDensity[indexc+_filterOutput.getDoubleNBpixels()];
|
||||
*luminance=(Cr+Cg+Cb)*_pG;
|
||||
_demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR - *luminance;
|
||||
_demultiplexedTempBuffer[_colorSampling[indexc]] = *multiplexedColorFramePTR1 - *luminance;
|
||||
|
||||
}
|
||||
|
||||
|
@ -60,9 +60,9 @@ namespace cv
|
||||
using std::min;
|
||||
using std::sqrt;
|
||||
}
|
||||
namespace
|
||||
namespace
|
||||
{
|
||||
const static Scalar colors[] =
|
||||
const static Scalar colors[] =
|
||||
{
|
||||
CV_RGB(255, 0, 0),
|
||||
CV_RGB( 0, 255, 0),
|
||||
@ -87,21 +87,21 @@ namespace
|
||||
|
||||
template<class FwIt, class T> void iota(FwIt first, FwIt last, T value) { while(first != last) *first++ = value++; }
|
||||
|
||||
void computeNormals( const Octree& Octree, const vector<Point3f>& centers, vector<Point3f>& normals,
|
||||
void computeNormals( const Octree& Octree, const vector<Point3f>& centers, vector<Point3f>& normals,
|
||||
vector<uchar>& mask, float normalRadius, int minNeighbors = 20)
|
||||
{
|
||||
{
|
||||
size_t normals_size = centers.size();
|
||||
normals.resize(normals_size);
|
||||
|
||||
|
||||
if (mask.size() != normals_size)
|
||||
{
|
||||
size_t m = mask.size();
|
||||
size_t m = mask.size();
|
||||
mask.resize(normals_size);
|
||||
if (normals_size > m)
|
||||
for(; m < normals_size; ++m)
|
||||
mask[m] = 1;
|
||||
}
|
||||
|
||||
|
||||
vector<Point3f> buffer;
|
||||
buffer.reserve(128);
|
||||
SVD svd;
|
||||
@ -132,7 +132,7 @@ void computeNormals( const Octree& Octree, const vector<Point3f>& centers, vecto
|
||||
mean.x /= buf_size;
|
||||
mean.y /= buf_size;
|
||||
mean.z /= buf_size;
|
||||
|
||||
|
||||
double pxpx = 0;
|
||||
double pypy = 0;
|
||||
double pzpz = 0;
|
||||
@ -162,9 +162,9 @@ void computeNormals( const Octree& Octree, const vector<Point3f>& centers, vecto
|
||||
|
||||
/*normals[n] = Point3f( (float)((double*)svd.vt.data)[6],
|
||||
(float)((double*)svd.vt.data)[7],
|
||||
(float)((double*)svd.vt.data)[8] );*/
|
||||
normals[n] = reinterpret_cast<Point3d*>(svd.vt.data)[2];
|
||||
mask[n] = 1;
|
||||
(float)((double*)svd.vt.data)[8] );*/
|
||||
normals[n] = reinterpret_cast<Point3d*>(svd.vt.data)[2];
|
||||
mask[n] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -213,22 +213,22 @@ inline __m128 transformSSE(const __m128* matrix, const __m128& in)
|
||||
}
|
||||
|
||||
inline __m128i _mm_mullo_epi32_emul(const __m128i& a, __m128i& b)
|
||||
{
|
||||
{
|
||||
__m128i pack = _mm_packs_epi32(a, a);
|
||||
return _mm_unpacklo_epi16(_mm_mullo_epi16(pack, b), _mm_mulhi_epi16(pack, b));
|
||||
return _mm_unpacklo_epi16(_mm_mullo_epi16(pack, b), _mm_mulhi_epi16(pack, b));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, const vector<Point3f>& normals,
|
||||
void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, const vector<Point3f>& normals,
|
||||
vector<uchar>& mask, Mat& spinImages, int imageWidth, float binSize)
|
||||
{
|
||||
{
|
||||
float pixelsPerMeter = 1.f / binSize;
|
||||
float support = imageWidth * binSize;
|
||||
|
||||
float support = imageWidth * binSize;
|
||||
|
||||
assert(normals.size() == points.size());
|
||||
assert(mask.size() == points.size());
|
||||
|
||||
|
||||
size_t points_size = points.size();
|
||||
mask.resize(points_size);
|
||||
|
||||
@ -257,7 +257,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
|
||||
int t = cvGetThreadNum();
|
||||
vector<Point3f>& pointsInSphere = pointsInSpherePool[t];
|
||||
|
||||
|
||||
const Point3f& center = points[i];
|
||||
Octree.getPointsWithinSphere(center, searchRad, pointsInSphere);
|
||||
|
||||
@ -269,7 +269,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
}
|
||||
|
||||
const Point3f& normal = normals[i];
|
||||
|
||||
|
||||
float rotmat[9];
|
||||
initRotationMat(normal, rotmat);
|
||||
Point3f new_center;
|
||||
@ -287,7 +287,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
{
|
||||
__m128 rotmatSSE[3];
|
||||
convertTransformMatrix(rotmat, (float*)rotmatSSE);
|
||||
|
||||
|
||||
__m128 center_x4 = _mm_set1_ps(new_center.x);
|
||||
__m128 center_y4 = _mm_set1_ps(new_center.y);
|
||||
__m128 center_z4 = _mm_set1_ps(new_center.z + halfSuppport);
|
||||
@ -313,7 +313,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
__m128 z0 = _mm_unpackhi_ps(pt0, pt1); // z0 z1 . .
|
||||
__m128 z1 = _mm_unpackhi_ps(pt2, pt3); // z2 z3 . .
|
||||
__m128 beta4 = _mm_sub_ps(center_z4, _mm_movelh_ps(z0, z1)); // b0 b1 b2 b3
|
||||
|
||||
|
||||
__m128 xy0 = _mm_unpacklo_ps(pt0, pt1); // x0 x1 y0 y1
|
||||
__m128 xy1 = _mm_unpacklo_ps(pt2, pt3); // x2 x3 y2 y3
|
||||
__m128 x4 = _mm_movelh_ps(xy0, xy1); // x0 x1 x2 x3
|
||||
@ -322,7 +322,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
x4 = _mm_sub_ps(x4, center_x4);
|
||||
y4 = _mm_sub_ps(y4, center_y4);
|
||||
__m128 alpha4 = _mm_sqrt_ps(_mm_add_ps(_mm_mul_ps(x4,x4),_mm_mul_ps(y4,y4)));
|
||||
|
||||
|
||||
__m128 n1f4 = _mm_mul_ps( beta4, ppm4); /* beta4 float */
|
||||
__m128 n2f4 = _mm_mul_ps(alpha4, ppm4); /* alpha4 float */
|
||||
|
||||
@ -333,21 +333,21 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
__m128 f1 = _mm_sub_ps( n1f4, _mm_cvtepi32_ps(n1) ); /* { beta4 } */
|
||||
__m128 f2 = _mm_sub_ps( n2f4, _mm_cvtepi32_ps(n2) ); /* { alpha4 } */
|
||||
|
||||
__m128 f1f2 = _mm_mul_ps(f1, f2); // f1 * f2
|
||||
__m128 f1f2 = _mm_mul_ps(f1, f2); // f1 * f2
|
||||
__m128 omf1omf2 = _mm_add_ps(_mm_sub_ps(_mm_sub_ps(one4f, f2), f1), f1f2); // (1-f1) * (1-f2)
|
||||
|
||||
__m128i mask = _mm_and_si128(
|
||||
|
||||
__m128i _mask = _mm_and_si128(
|
||||
_mm_andnot_si128(_mm_cmpgt_epi32(zero4, n1), _mm_cmpgt_epi32(height4m1, n1)),
|
||||
_mm_andnot_si128(_mm_cmpgt_epi32(zero4, n2), _mm_cmpgt_epi32(width4m1, n2)));
|
||||
|
||||
__m128 maskf = _mm_cmpneq_ps(_mm_cvtepi32_ps(mask), zero4f);
|
||||
|
||||
__m128 maskf = _mm_cmpneq_ps(_mm_cvtepi32_ps(_mask), zero4f);
|
||||
|
||||
__m128 v00 = _mm_and_ps( omf1omf2 , maskf); // a00 b00 c00 d00
|
||||
__m128 v01 = _mm_and_ps( _mm_sub_ps( f2, f1f2 ), maskf); // a01 b01 c01 d01
|
||||
__m128 v10 = _mm_and_ps( _mm_sub_ps( f1, f1f2 ), maskf); // a10 b10 c10 d10
|
||||
__m128 v11 = _mm_and_ps( f1f2 , maskf); // a11 b11 c11 d11
|
||||
|
||||
__m128i ofs4 = _mm_and_si128(_mm_add_epi32(_mm_mullo_epi32_emul(n1, step4), n2), mask);
|
||||
__m128i ofs4 = _mm_and_si128(_mm_add_epi32(_mm_mullo_epi32_emul(n1, step4), n2), _mask);
|
||||
_mm_store_si128((__m128i*)o, ofs4);
|
||||
|
||||
__m128 t0 = _mm_unpacklo_ps(v00, v01); // a00 a01 b00 b01
|
||||
@ -395,9 +395,9 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
if (beta >= support || beta < 0)
|
||||
continue;
|
||||
|
||||
alpha = sqrt( (new_center.x - pt.x) * (new_center.x - pt.x) +
|
||||
(new_center.y - pt.y) * (new_center.y - pt.y) );
|
||||
|
||||
alpha = sqrt( (new_center.x - pt.x) * (new_center.x - pt.x) +
|
||||
(new_center.y - pt.y) * (new_center.y - pt.y) );
|
||||
|
||||
float n1f = beta * pixelsPerMeter;
|
||||
float n2f = alpha * pixelsPerMeter;
|
||||
|
||||
@ -407,7 +407,7 @@ void computeSpinImages( const Octree& Octree, const vector<Point3f>& points, con
|
||||
float f1 = n1f - n1;
|
||||
float f2 = n2f - n2;
|
||||
|
||||
if ((unsigned)n1 >= (unsigned)(spinImage.rows-1) ||
|
||||
if ((unsigned)n1 >= (unsigned)(spinImage.rows-1) ||
|
||||
(unsigned)n2 >= (unsigned)(spinImage.cols-1))
|
||||
continue;
|
||||
|
||||
@ -454,27 +454,27 @@ float cv::Mesh3D::estimateResolution(float /*tryRatio*/)
|
||||
|
||||
vector<double> dist(tryNum * neighbors);
|
||||
vector<int> inds(tryNum * neighbors);
|
||||
vector<Point3f> query;
|
||||
vector<Point3f> query;
|
||||
|
||||
RNG& rng = theRNG();
|
||||
RNG& rng = theRNG();
|
||||
for(int i = 0; i < tryNum; ++i)
|
||||
query.push_back(vtx[rng.next() % vtx.size()]);
|
||||
|
||||
|
||||
CvMat cvinds = cvMat( (int)tryNum, neighbors, CV_32S, &inds[0] );
|
||||
CvMat cvdist = cvMat( (int)tryNum, neighbors, CV_64F, &dist[0] );
|
||||
CvMat cvdist = cvMat( (int)tryNum, neighbors, CV_64F, &dist[0] );
|
||||
CvMat cvquery = cvMat( (int)tryNum, 3, CV_32F, &query[0] );
|
||||
cvFindFeatures(tr, &cvquery, &cvinds, &cvdist, neighbors, 50);
|
||||
cvFindFeatures(tr, &cvquery, &cvinds, &cvdist, neighbors, 50);
|
||||
cvReleaseFeatureTree(tr);
|
||||
|
||||
const int invalid_dist = -2;
|
||||
const int invalid_dist = -2;
|
||||
for(int i = 0; i < tryNum; ++i)
|
||||
if (inds[i] == -1)
|
||||
dist[i] = invalid_dist;
|
||||
|
||||
dist.resize(remove(dist.begin(), dist.end(), invalid_dist) - dist.begin());
|
||||
|
||||
|
||||
sort(dist, less<double>());
|
||||
|
||||
|
||||
return resolution = (float)dist[ dist.size() / 2 ];
|
||||
#else
|
||||
CV_Error(CV_StsNotImplemented, "");
|
||||
@ -494,7 +494,7 @@ void cv::Mesh3D::computeNormals(const vector<int>& subset, float normalRadius, i
|
||||
{
|
||||
buildOctree();
|
||||
vector<uchar> mask(vtx.size(), 0);
|
||||
for(size_t i = 0; i < subset.size(); ++i)
|
||||
for(size_t i = 0; i < subset.size(); ++i)
|
||||
mask[subset[i]] = 1;
|
||||
::computeNormals(octree, vtx, normals, mask, normalRadius, minNeighbors);
|
||||
}
|
||||
@ -504,31 +504,31 @@ void cv::Mesh3D::writeAsVrml(const String& file, const vector<Scalar>& _colors)
|
||||
ofstream ofs(file.c_str());
|
||||
|
||||
ofs << "#VRML V2.0 utf8" << endl;
|
||||
ofs << "Shape" << std::endl << "{" << endl;
|
||||
ofs << "geometry PointSet" << endl << "{" << endl;
|
||||
ofs << "coord Coordinate" << endl << "{" << endl;
|
||||
ofs << "point[" << endl;
|
||||
ofs << "Shape" << std::endl << "{" << endl;
|
||||
ofs << "geometry PointSet" << endl << "{" << endl;
|
||||
ofs << "coord Coordinate" << endl << "{" << endl;
|
||||
ofs << "point[" << endl;
|
||||
|
||||
for(size_t i = 0; i < vtx.size(); ++i)
|
||||
ofs << vtx[i].x << " " << vtx[i].y << " " << vtx[i].z << endl;
|
||||
|
||||
ofs << "]" << endl; //point[
|
||||
ofs << "}" << endl; //Coordinate{
|
||||
|
||||
ofs << "]" << endl; //point[
|
||||
ofs << "}" << endl; //Coordinate{
|
||||
|
||||
if (vtx.size() == _colors.size())
|
||||
{
|
||||
ofs << "color Color" << endl << "{" << endl;
|
||||
ofs << "color[" << endl;
|
||||
|
||||
|
||||
for(size_t i = 0; i < _colors.size(); ++i)
|
||||
ofs << (float)_colors[i][2] << " " << (float)_colors[i][1] << " " << (float)_colors[i][0] << endl;
|
||||
|
||||
|
||||
ofs << "]" << endl; //color[
|
||||
ofs << "}" << endl; //color Color{
|
||||
ofs << "}" << endl; //color Color{
|
||||
}
|
||||
|
||||
ofs << "}" << endl; //PointSet{
|
||||
ofs << "}" << endl; //Shape{
|
||||
ofs << "}" << endl; //PointSet{
|
||||
ofs << "}" << endl; //Shape{
|
||||
}
|
||||
|
||||
|
||||
@ -538,45 +538,45 @@ void cv::Mesh3D::writeAsVrml(const String& file, const vector<Scalar>& _colors)
|
||||
bool cv::SpinImageModel::spinCorrelation(const Mat& spin1, const Mat& spin2, float lambda, float& result)
|
||||
{
|
||||
struct Math { static double atanh(double x) { return 0.5 * std::log( (1 + x) / (1 - x) ); } };
|
||||
|
||||
|
||||
const float* s1 = spin1.ptr<float>();
|
||||
const float* s2 = spin2.ptr<float>();
|
||||
|
||||
int spin_sz = spin1.cols * spin1.rows;
|
||||
int spin_sz = spin1.cols * spin1.rows;
|
||||
double sum1 = 0.0, sum2 = 0.0, sum12 = 0.0, sum11 = 0.0, sum22 = 0.0;
|
||||
|
||||
int N = 0;
|
||||
int i = 0;
|
||||
#if CV_SSE2//____________TEMPORARY_DISABLED_____________
|
||||
float CV_DECL_ALIGNED(16) su1[4], su2[4], su11[4], su22[4], su12[4], n[4];
|
||||
|
||||
float CV_DECL_ALIGNED(16) su1[4], su2[4], su11[4], su22[4], su12[4], n[4];
|
||||
|
||||
__m128 zerof4 = _mm_setzero_ps();
|
||||
__m128 onef4 = _mm_set1_ps(1.f);
|
||||
__m128 Nf4 = zerof4;
|
||||
__m128 Nf4 = zerof4;
|
||||
__m128 sum1f4 = zerof4;
|
||||
__m128 sum2f4 = zerof4;
|
||||
__m128 sum11f4 = zerof4;
|
||||
__m128 sum22f4 = zerof4;
|
||||
__m128 sum12f4 = zerof4;
|
||||
__m128 sum12f4 = zerof4;
|
||||
for(; i < spin_sz - 5; i += 4)
|
||||
{
|
||||
__m128 v1f4 = _mm_loadu_ps(s1 + i);
|
||||
__m128 v2f4 = _mm_loadu_ps(s2 + i);
|
||||
__m128 v1f4 = _mm_loadu_ps(s1 + i);
|
||||
__m128 v2f4 = _mm_loadu_ps(s2 + i);
|
||||
|
||||
__m128 mskf4 = _mm_and_ps(_mm_cmpneq_ps(v1f4, zerof4), _mm_cmpneq_ps(v2f4, zerof4));
|
||||
if( !_mm_movemask_ps(mskf4) )
|
||||
if( !_mm_movemask_ps(mskf4) )
|
||||
continue;
|
||||
|
||||
|
||||
Nf4 = _mm_add_ps(Nf4, _mm_and_ps(onef4, mskf4));
|
||||
|
||||
v1f4 = _mm_and_ps(v1f4, mskf4);
|
||||
v2f4 = _mm_and_ps(v2f4, mskf4);
|
||||
|
||||
|
||||
sum1f4 = _mm_add_ps(sum1f4, v1f4);
|
||||
sum2f4 = _mm_add_ps(sum2f4, v2f4);
|
||||
sum11f4 = _mm_add_ps(sum11f4, _mm_mul_ps(v1f4, v1f4));
|
||||
sum22f4 = _mm_add_ps(sum22f4, _mm_mul_ps(v2f4, v2f4));
|
||||
sum12f4 = _mm_add_ps(sum12f4, _mm_mul_ps(v1f4, v2f4));
|
||||
sum12f4 = _mm_add_ps(sum12f4, _mm_mul_ps(v1f4, v2f4));
|
||||
}
|
||||
_mm_store_ps( su1, sum1f4 );
|
||||
_mm_store_ps( su2, sum2f4 );
|
||||
@ -601,11 +601,11 @@ bool cv::SpinImageModel::spinCorrelation(const Mat& spin1, const Mat& spin2, flo
|
||||
if( !v1 || !v2 )
|
||||
continue;
|
||||
N++;
|
||||
|
||||
sum1 += v1;
|
||||
sum2 += v2;
|
||||
sum11 += v1 * v1;
|
||||
sum22 += v2 * v2;
|
||||
|
||||
sum1 += v1;
|
||||
sum2 += v2;
|
||||
sum11 += v1 * v1;
|
||||
sum22 += v2 * v2;
|
||||
sum12 += v1 * v2;
|
||||
}
|
||||
if( N < 4 )
|
||||
@ -624,13 +624,13 @@ bool cv::SpinImageModel::spinCorrelation(const Mat& spin1, const Mat& spin2, flo
|
||||
double corr = (Nsum12 - sum1 * sum2) / sqrt( (Nsum11 - sum1sum1) * (Nsum22 - sum2sum2) );
|
||||
double atanh = Math::atanh(corr);
|
||||
result = (float)( atanh * atanh - lambda * ( 1.0 / (N - 3) ) );
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
inline Point2f cv::SpinImageModel::calcSpinMapCoo(const Point3f& p, const Point3f& v, const Point3f& n)
|
||||
{
|
||||
/*Point3f PmV(p.x - v.x, p.y - v.y, p.z - v.z);
|
||||
float normalNorm = (float)norm(n);
|
||||
{
|
||||
/*Point3f PmV(p.x - v.x, p.y - v.y, p.z - v.z);
|
||||
float normalNorm = (float)norm(n);
|
||||
float beta = PmV.dot(n) / normalNorm;
|
||||
float pmcNorm = (float)norm(PmV);
|
||||
float alpha = sqrt( pmcNorm * pmcNorm - beta * beta);
|
||||
@ -639,23 +639,23 @@ inline Point2f cv::SpinImageModel::calcSpinMapCoo(const Point3f& p, const Point3
|
||||
float pmv_x = p.x - v.x, pmv_y = p.y - v.y, pmv_z = p.z - v.z;
|
||||
|
||||
float beta = (pmv_x * n.x + pmv_y + n.y + pmv_z * n.z) / sqrt(n.x * n.x + n.y * n.y + n.z * n.z);
|
||||
float alpha = sqrt( pmv_x * pmv_x + pmv_y * pmv_y + pmv_z * pmv_z - beta * beta);
|
||||
float alpha = sqrt( pmv_x * pmv_x + pmv_y * pmv_y + pmv_z * pmv_z - beta * beta);
|
||||
return Point2f(alpha, beta);
|
||||
}
|
||||
|
||||
inline float cv::SpinImageModel::geometricConsistency(const Point3f& pointScene1, const Point3f& normalScene1,
|
||||
const Point3f& pointModel1, const Point3f& normalModel1,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
const Point3f& pointModel2, const Point3f& normalModel2)
|
||||
{
|
||||
{
|
||||
Point2f Sm2_to_m1, Ss2_to_s1;
|
||||
Point2f Sm1_to_m2, Ss1_to_s2;
|
||||
|
||||
double n_Sm2_to_m1 = norm(Sm2_to_m1 = calcSpinMapCoo(pointModel2, pointModel1, normalModel1));
|
||||
double n_Ss2_to_s1 = norm(Ss2_to_s1 = calcSpinMapCoo(pointScene2, pointScene1, normalScene1));
|
||||
double n_Ss2_to_s1 = norm(Ss2_to_s1 = calcSpinMapCoo(pointScene2, pointScene1, normalScene1));
|
||||
|
||||
double gc21 = 2 * norm(Sm2_to_m1 - Ss2_to_s1) / (n_Sm2_to_m1 + n_Ss2_to_s1 ) ;
|
||||
|
||||
|
||||
double n_Sm1_to_m2 = norm(Sm1_to_m2 = calcSpinMapCoo(pointModel1, pointModel2, normalModel2));
|
||||
double n_Ss1_to_s2 = norm(Ss1_to_s2 = calcSpinMapCoo(pointScene1, pointScene2, normalScene2));
|
||||
|
||||
@ -666,10 +666,10 @@ inline float cv::SpinImageModel::geometricConsistency(const Point3f& pointScene1
|
||||
|
||||
inline float cv::SpinImageModel::groupingCreteria(const Point3f& pointScene1, const Point3f& normalScene1,
|
||||
const Point3f& pointModel1, const Point3f& normalModel1,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
const Point3f& pointModel2, const Point3f& normalModel2,
|
||||
const Point3f& pointScene2, const Point3f& normalScene2,
|
||||
const Point3f& pointModel2, const Point3f& normalModel2,
|
||||
float gamma)
|
||||
{
|
||||
{
|
||||
Point2f Sm2_to_m1, Ss2_to_s1;
|
||||
Point2f Sm1_to_m2, Ss1_to_s2;
|
||||
|
||||
@ -680,7 +680,7 @@ inline float cv::SpinImageModel::groupingCreteria(const Point3f& pointScene1, co
|
||||
|
||||
double gc21 = 2 * norm(Sm2_to_m1 - Ss2_to_s1) / (n_Sm2_to_m1 + n_Ss2_to_s1 );
|
||||
double wgc21 = gc21 / (1 - exp( -(n_Sm2_to_m1 + n_Ss2_to_s1) * gamma05_inv ) );
|
||||
|
||||
|
||||
double n_Sm1_to_m2 = norm(Sm1_to_m2 = calcSpinMapCoo(pointModel1, pointModel2, normalModel2));
|
||||
double n_Ss1_to_s2 = norm(Ss1_to_s2 = calcSpinMapCoo(pointScene1, pointScene2, normalScene2));
|
||||
|
||||
@ -692,10 +692,10 @@ inline float cv::SpinImageModel::groupingCreteria(const Point3f& pointScene1, co
|
||||
|
||||
|
||||
cv::SpinImageModel::SpinImageModel(const Mesh3D& _mesh) : mesh(_mesh) , out(0)
|
||||
{
|
||||
{
|
||||
if (mesh.vtx.empty())
|
||||
throw Mesh3D::EmptyMeshException();
|
||||
defaultParams();
|
||||
defaultParams();
|
||||
}
|
||||
cv::SpinImageModel::SpinImageModel() : out(0) { defaultParams(); }
|
||||
cv::SpinImageModel::~SpinImageModel() {}
|
||||
@ -708,8 +708,8 @@ void cv::SpinImageModel::defaultParams()
|
||||
minNeighbors = 20;
|
||||
|
||||
binSize = 0.f; /* autodetect according to mesh resolution */
|
||||
imageWidth = 32;
|
||||
|
||||
imageWidth = 32;
|
||||
|
||||
lambda = 0.f; /* autodetect according to medan non zero images bin */
|
||||
gamma = 0.f; /* autodetect according to mesh resolution */
|
||||
|
||||
@ -725,28 +725,28 @@ Mat cv::SpinImageModel::packRandomScaledSpins(bool separateScale, size_t xCount,
|
||||
if (num == 0)
|
||||
return Mat();
|
||||
|
||||
RNG& rng = theRNG();
|
||||
RNG& rng = theRNG();
|
||||
|
||||
vector<Mat> spins;
|
||||
for(int i = 0; i < num; ++i)
|
||||
spins.push_back(getSpinImage( rng.next() % spinNum ).reshape(1, imageWidth));
|
||||
|
||||
spins.push_back(getSpinImage( rng.next() % spinNum ).reshape(1, imageWidth));
|
||||
|
||||
if (separateScale)
|
||||
for(int i = 0; i < num; ++i)
|
||||
{
|
||||
double max;
|
||||
Mat spin8u;
|
||||
minMaxLoc(spins[i], 0, &max);
|
||||
minMaxLoc(spins[i], 0, &max);
|
||||
spins[i].convertTo(spin8u, CV_8U, -255.0/max, 255.0);
|
||||
spins[i] = spin8u;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
double totalMax = 0;
|
||||
for(int i = 0; i < num; ++i)
|
||||
{
|
||||
double m;
|
||||
minMaxLoc(spins[i], 0, &m);
|
||||
minMaxLoc(spins[i], 0, &m);
|
||||
totalMax = max(m, totalMax);
|
||||
}
|
||||
|
||||
@ -760,12 +760,12 @@ Mat cv::SpinImageModel::packRandomScaledSpins(bool separateScale, size_t xCount,
|
||||
|
||||
int sz = spins.front().cols;
|
||||
|
||||
Mat result((int)(yCount * sz + (yCount - 1)), (int)(xCount * sz + (xCount - 1)), CV_8UC3);
|
||||
Mat result((int)(yCount * sz + (yCount - 1)), (int)(xCount * sz + (xCount - 1)), CV_8UC3);
|
||||
result = colors[(static_cast<int64>(cvGetTickCount()/cvGetTickFrequency())/1000) % colors_mum];
|
||||
|
||||
int pos = 0;
|
||||
for(int y = 0; y < (int)yCount; ++y)
|
||||
for(int x = 0; x < (int)xCount; ++x)
|
||||
for(int x = 0; x < (int)xCount; ++x)
|
||||
if (pos < num)
|
||||
{
|
||||
int starty = (y + 0) * sz + y;
|
||||
@ -778,7 +778,7 @@ Mat cv::SpinImageModel::packRandomScaledSpins(bool separateScale, size_t xCount,
|
||||
cvtColor(spins[pos++], color, CV_GRAY2BGR);
|
||||
Mat roi = result(Range(starty, endy), Range(startx, endx));
|
||||
color.copyTo(roi);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -811,8 +811,8 @@ void cv::SpinImageModel::selectRandomSubset(float ratio)
|
||||
int pos = rnd.next() % left.size();
|
||||
subset[i] = (int)left[pos];
|
||||
|
||||
left[pos] = left.back();
|
||||
left.resize(left.size() - 1);
|
||||
left[pos] = left.back();
|
||||
left.resize(left.size() - 1);
|
||||
}
|
||||
sort(subset, less<int>());
|
||||
}
|
||||
@ -823,21 +823,21 @@ void cv::SpinImageModel::setSubset(const vector<int>& ss)
|
||||
subset = ss;
|
||||
}
|
||||
|
||||
void cv::SpinImageModel::repackSpinImages(const vector<uchar>& mask, Mat& spinImages, bool reAlloc) const
|
||||
{
|
||||
void cv::SpinImageModel::repackSpinImages(const vector<uchar>& mask, Mat& _spinImages, bool reAlloc) const
|
||||
{
|
||||
if (reAlloc)
|
||||
{
|
||||
size_t spinCount = mask.size() - count(mask.begin(), mask.end(), (uchar)0);
|
||||
Mat newImgs((int)spinCount, spinImages.cols, spinImages.type());
|
||||
Mat newImgs((int)spinCount, _spinImages.cols, _spinImages.type());
|
||||
|
||||
int pos = 0;
|
||||
for(size_t t = 0; t < mask.size(); ++t)
|
||||
if (mask[t])
|
||||
{
|
||||
Mat row = newImgs.row(pos++);
|
||||
spinImages.row((int)t).copyTo(row);
|
||||
_spinImages.row((int)t).copyTo(row);
|
||||
}
|
||||
spinImages = newImgs;
|
||||
_spinImages = newImgs;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -849,13 +849,13 @@ void cv::SpinImageModel::repackSpinImages(const vector<uchar>& mask, Mat& spinIm
|
||||
|
||||
int first = dest + 1;
|
||||
for (; first != last; ++first)
|
||||
if (mask[first] != 0)
|
||||
if (mask[first] != 0)
|
||||
{
|
||||
Mat row = spinImages.row(dest);
|
||||
spinImages.row(first).copyTo(row);
|
||||
Mat row = _spinImages.row(dest);
|
||||
_spinImages.row(first).copyTo(row);
|
||||
++dest;
|
||||
}
|
||||
spinImages = spinImages.rowRange(0, dest);
|
||||
_spinImages = _spinImages.rowRange(0, dest);
|
||||
}
|
||||
}
|
||||
|
||||
@ -865,13 +865,13 @@ void cv::SpinImageModel::compute()
|
||||
if (binSize == 0.f)
|
||||
{
|
||||
if (mesh.resolution == -1.f)
|
||||
mesh.estimateResolution();
|
||||
mesh.estimateResolution();
|
||||
binSize = mesh.resolution;
|
||||
}
|
||||
/* estimate normalRadius */
|
||||
normalRadius = normalRadius != 0.f ? normalRadius : binSize * imageWidth / 2;
|
||||
/* estimate normalRadius */
|
||||
normalRadius = normalRadius != 0.f ? normalRadius : binSize * imageWidth / 2;
|
||||
|
||||
mesh.buildOctree();
|
||||
mesh.buildOctree();
|
||||
if (subset.empty())
|
||||
{
|
||||
mesh.computeNormals(normalRadius, minNeighbors);
|
||||
@ -881,16 +881,16 @@ void cv::SpinImageModel::compute()
|
||||
else
|
||||
mesh.computeNormals(subset, normalRadius, minNeighbors);
|
||||
|
||||
vector<uchar> mask(mesh.vtx.size(), 0);
|
||||
vector<uchar> mask(mesh.vtx.size(), 0);
|
||||
for(size_t i = 0; i < subset.size(); ++i)
|
||||
if (mesh.normals[subset[i]] == Mesh3D::allzero)
|
||||
subset[i] = -1;
|
||||
if (mesh.normals[subset[i]] == Mesh3D::allzero)
|
||||
subset[i] = -1;
|
||||
else
|
||||
mask[subset[i]] = 1;
|
||||
subset.resize( remove(subset.begin(), subset.end(), -1) - subset.begin() );
|
||||
|
||||
|
||||
vector<Point3f> vtx;
|
||||
vector<Point3f> normals;
|
||||
vector<Point3f> normals;
|
||||
for(size_t i = 0; i < mask.size(); ++i)
|
||||
if(mask[i])
|
||||
{
|
||||
@ -906,7 +906,7 @@ void cv::SpinImageModel::compute()
|
||||
for(size_t i = 0; i < mask.size(); ++i)
|
||||
if(mask[i])
|
||||
if (spinMask[mask_pos++] == 0)
|
||||
subset.resize( remove(subset.begin(), subset.end(), (int)i) - subset.begin() );
|
||||
subset.resize( remove(subset.begin(), subset.end(), (int)i) - subset.begin() );
|
||||
}
|
||||
|
||||
void cv::SpinImageModel::matchSpinToModel(const Mat& spin, vector<int>& indeces, vector<float>& corrCoeffs, bool useExtremeOutliers) const
|
||||
@ -920,46 +920,46 @@ void cv::SpinImageModel::matchSpinToModel(const Mat& spin, vector<int>& indeces,
|
||||
vector<uchar> masks(model.spinImages.rows);
|
||||
vector<float> cleanCorrs;
|
||||
cleanCorrs.reserve(model.spinImages.rows);
|
||||
|
||||
|
||||
for(int i = 0; i < model.spinImages.rows; ++i)
|
||||
{
|
||||
masks[i] = spinCorrelation(spin, model.spinImages.row(i), model.lambda, corrs[i]);
|
||||
masks[i] = spinCorrelation(spin, model.spinImages.row(i), model.lambda, corrs[i]);
|
||||
if (masks[i])
|
||||
cleanCorrs.push_back(corrs[i]);
|
||||
}
|
||||
|
||||
|
||||
/* Filtering by measure histogram */
|
||||
size_t total = cleanCorrs.size();
|
||||
if(total < 5)
|
||||
return;
|
||||
|
||||
sort(cleanCorrs, less<float>());
|
||||
|
||||
|
||||
float lower_fourth = cleanCorrs[(1 * total) / 4 - 1];
|
||||
float upper_fourth = cleanCorrs[(3 * total) / 4 - 0];
|
||||
float fourth_spread = upper_fourth - lower_fourth;
|
||||
|
||||
//extreme or moderate?
|
||||
float coef = useExtremeOutliers ? 3.0f : 1.5f;
|
||||
float coef = useExtremeOutliers ? 3.0f : 1.5f;
|
||||
|
||||
float histThresHi = upper_fourth + coef * fourth_spread;
|
||||
//float histThresLo = lower_fourth - coef * fourth_spread;
|
||||
|
||||
float histThresHi = upper_fourth + coef * fourth_spread;
|
||||
//float histThresLo = lower_fourth - coef * fourth_spread;
|
||||
|
||||
for(size_t i = 0; i < corrs.size(); ++i)
|
||||
if (masks[i])
|
||||
if (/* corrs[i] < histThresLo || */ corrs[i] > histThresHi)
|
||||
{
|
||||
indeces.push_back((int)i);
|
||||
corrCoeffs.push_back(corrs[i]);
|
||||
corrCoeffs.push_back(corrs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace
|
||||
namespace
|
||||
{
|
||||
|
||||
struct Match
|
||||
{
|
||||
int sceneInd;
|
||||
int sceneInd;
|
||||
int modelInd;
|
||||
float measure;
|
||||
|
||||
@ -984,7 +984,7 @@ struct WgcHelper
|
||||
{
|
||||
const float* wgcLine = mat.ptr<float>((int)corespInd);
|
||||
float maximum = numeric_limits<float>::min();
|
||||
|
||||
|
||||
for(citer pos = group.begin(); pos != group.end(); ++pos)
|
||||
maximum = max(wgcLine[*pos], maximum);
|
||||
|
||||
@ -997,7 +997,7 @@ private:
|
||||
}
|
||||
|
||||
void cv::SpinImageModel::match(const SpinImageModel& scene, vector< vector<Vec2i> >& result)
|
||||
{
|
||||
{
|
||||
if (mesh.vtx.empty())
|
||||
throw Mesh3D::EmptyMeshException();
|
||||
|
||||
@ -1006,25 +1006,25 @@ private:
|
||||
SpinImageModel& model = *this;
|
||||
const float infinity = numeric_limits<float>::infinity();
|
||||
const float float_max = numeric_limits<float>::max();
|
||||
|
||||
|
||||
/* estimate gamma */
|
||||
if (model.gamma == 0.f)
|
||||
{
|
||||
if (model.mesh.resolution == -1.f)
|
||||
model.mesh.estimateResolution();
|
||||
model.mesh.estimateResolution();
|
||||
model.gamma = 4 * model.mesh.resolution;
|
||||
}
|
||||
|
||||
/* estimate lambda */
|
||||
if (model.lambda == 0.f)
|
||||
{
|
||||
vector<int> nonzero(model.spinImages.rows);
|
||||
vector<int> nonzero(model.spinImages.rows);
|
||||
for(int i = 0; i < model.spinImages.rows; ++i)
|
||||
nonzero[i] = countNonZero(model.spinImages.row(i));
|
||||
sort(nonzero, less<int>());
|
||||
model.lambda = static_cast<float>( nonzero[ nonzero.size()/2 ] ) / 2;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
TickMeter corr_timer;
|
||||
corr_timer.start();
|
||||
vector<Match> allMatches;
|
||||
@ -1032,37 +1032,37 @@ private:
|
||||
{
|
||||
vector<int> indeces;
|
||||
vector<float> coeffs;
|
||||
matchSpinToModel(scene.spinImages.row(i), indeces, coeffs);
|
||||
matchSpinToModel(scene.spinImages.row(i), indeces, coeffs);
|
||||
for(size_t t = 0; t < indeces.size(); ++t)
|
||||
allMatches.push_back(Match(i, indeces[t], coeffs[t]));
|
||||
allMatches.push_back(Match(i, indeces[t], coeffs[t]));
|
||||
|
||||
if (out) if (i % 100 == 0) *out << "Comparing scene spinimage " << i << " of " << scene.spinImages.rows << endl;
|
||||
if (out) if (i % 100 == 0) *out << "Comparing scene spinimage " << i << " of " << scene.spinImages.rows << endl;
|
||||
}
|
||||
corr_timer.stop();
|
||||
if (out) *out << "Spin correlation time = " << corr_timer << endl;
|
||||
if (out) *out << "Matches number = " << allMatches.size() << endl;
|
||||
|
||||
if(allMatches.empty())
|
||||
if(allMatches.empty())
|
||||
return;
|
||||
|
||||
|
||||
/* filtering by similarity measure */
|
||||
const float fraction = 0.5f;
|
||||
float maxMeasure = max_element(allMatches.begin(), allMatches.end(), less<float>())->measure;
|
||||
float maxMeasure = max_element(allMatches.begin(), allMatches.end(), less<float>())->measure;
|
||||
allMatches.erase(
|
||||
remove_if(allMatches.begin(), allMatches.end(), bind2nd(less<float>(), maxMeasure * fraction)),
|
||||
remove_if(allMatches.begin(), allMatches.end(), bind2nd(less<float>(), maxMeasure * fraction)),
|
||||
allMatches.end());
|
||||
if (out) *out << "Matches number [filtered by similarity measure] = " << allMatches.size() << endl;
|
||||
|
||||
int matchesSize = (int)allMatches.size();
|
||||
if(matchesSize == 0)
|
||||
return;
|
||||
|
||||
/* filtering by geometric consistency */
|
||||
|
||||
/* filtering by geometric consistency */
|
||||
for(int i = 0; i < matchesSize; ++i)
|
||||
{
|
||||
int consistNum = 1;
|
||||
float gc = float_max;
|
||||
|
||||
|
||||
for(int j = 0; j < matchesSize; ++j)
|
||||
if (i != j)
|
||||
{
|
||||
@ -1075,31 +1075,31 @@ private:
|
||||
{
|
||||
const Point3f& pointSceneI = scene.getSpinVertex(mi.sceneInd);
|
||||
const Point3f& normalSceneI = scene.getSpinNormal(mi.sceneInd);
|
||||
|
||||
|
||||
const Point3f& pointModelI = model.getSpinVertex(mi.modelInd);
|
||||
const Point3f& normalModelI = model.getSpinNormal(mi.modelInd);
|
||||
|
||||
|
||||
const Point3f& pointSceneJ = scene.getSpinVertex(mj.sceneInd);
|
||||
const Point3f& normalSceneJ = scene.getSpinNormal(mj.sceneInd);
|
||||
|
||||
|
||||
const Point3f& pointModelJ = model.getSpinVertex(mj.modelInd);
|
||||
const Point3f& normalModelJ = model.getSpinNormal(mj.modelInd);
|
||||
|
||||
|
||||
gc = geometricConsistency(pointSceneI, normalSceneI, pointModelI, normalModelI,
|
||||
pointSceneJ, normalSceneJ, pointModelJ, normalModelJ);
|
||||
pointSceneJ, normalSceneJ, pointModelJ, normalModelJ);
|
||||
}
|
||||
|
||||
if (gc < model.T_GeometriccConsistency)
|
||||
++consistNum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (consistNum < matchesSize / 4) /* failed consistensy test */
|
||||
allMatches[i].measure = infinity;
|
||||
allMatches[i].measure = infinity;
|
||||
}
|
||||
allMatches.erase(
|
||||
remove_if(allMatches.begin(), allMatches.end(), bind2nd(equal_to<float>(), infinity)),
|
||||
allMatches.end());
|
||||
remove_if(allMatches.begin(), allMatches.end(), bind2nd(equal_to<float>(), infinity)),
|
||||
allMatches.end());
|
||||
if (out) *out << "Matches number [filtered by geometric consistency] = " << allMatches.size() << endl;
|
||||
|
||||
|
||||
@ -1110,11 +1110,11 @@ private:
|
||||
if (out) *out << "grouping ..." << endl;
|
||||
|
||||
Mat groupingMat((int)matchesSize, (int)matchesSize, CV_32F);
|
||||
groupingMat = Scalar(0);
|
||||
|
||||
groupingMat = Scalar(0);
|
||||
|
||||
/* grouping */
|
||||
for(int j = 0; j < matchesSize; ++j)
|
||||
for(int i = j + 1; i < matchesSize; ++i)
|
||||
for(int i = j + 1; i < matchesSize; ++i)
|
||||
{
|
||||
const Match& mi = allMatches[i];
|
||||
const Match& mj = allMatches[j];
|
||||
@ -1128,20 +1128,20 @@ private:
|
||||
|
||||
const Point3f& pointSceneI = scene.getSpinVertex(mi.sceneInd);
|
||||
const Point3f& normalSceneI = scene.getSpinNormal(mi.sceneInd);
|
||||
|
||||
|
||||
const Point3f& pointModelI = model.getSpinVertex(mi.modelInd);
|
||||
const Point3f& normalModelI = model.getSpinNormal(mi.modelInd);
|
||||
|
||||
|
||||
const Point3f& pointSceneJ = scene.getSpinVertex(mj.sceneInd);
|
||||
const Point3f& normalSceneJ = scene.getSpinNormal(mj.sceneInd);
|
||||
|
||||
|
||||
const Point3f& pointModelJ = model.getSpinVertex(mj.modelInd);
|
||||
const Point3f& normalModelJ = model.getSpinNormal(mj.modelInd);
|
||||
|
||||
float wgc = groupingCreteria(pointSceneI, normalSceneI, pointModelI, normalModelI,
|
||||
pointSceneJ, normalSceneJ, pointModelJ, normalModelJ,
|
||||
model.gamma);
|
||||
|
||||
model.gamma);
|
||||
|
||||
groupingMat.ptr<float>(i)[j] = wgc;
|
||||
groupingMat.ptr<float>(j)[i] = wgc;
|
||||
}
|
||||
@ -1149,35 +1149,35 @@ private:
|
||||
group_t allMatchesInds;
|
||||
for(int i = 0; i < matchesSize; ++i)
|
||||
allMatchesInds.insert(i);
|
||||
|
||||
|
||||
vector<float> buf(matchesSize);
|
||||
float *buf_beg = &buf[0];
|
||||
vector<group_t> groups;
|
||||
|
||||
|
||||
for(int g = 0; g < matchesSize; ++g)
|
||||
{
|
||||
{
|
||||
if (out) if (g % 100 == 0) *out << "G = " << g << endl;
|
||||
|
||||
group_t left = allMatchesInds;
|
||||
group_t group;
|
||||
|
||||
|
||||
left.erase(g);
|
||||
group.insert(g);
|
||||
|
||||
|
||||
for(;;)
|
||||
{
|
||||
size_t left_size = left.size();
|
||||
if (left_size == 0)
|
||||
break;
|
||||
|
||||
|
||||
std::transform(left.begin(), left.end(), buf_beg, WgcHelper(group, groupingMat));
|
||||
size_t minInd = min_element(buf_beg, buf_beg + left_size) - buf_beg;
|
||||
|
||||
|
||||
if (buf[minInd] < model.T_GroupingCorespondances) /* can add corespondance to group */
|
||||
{
|
||||
iter pos = left.begin();
|
||||
advance(pos, minInd);
|
||||
|
||||
|
||||
group.insert(*pos);
|
||||
left.erase(pos);
|
||||
}
|
||||
@ -1199,16 +1199,16 @@ private:
|
||||
{
|
||||
const Match& m = allMatches[*pos];
|
||||
outgrp.push_back(Vec2i(subset[m.modelInd], scene.subset[m.sceneInd]));
|
||||
}
|
||||
}
|
||||
result.push_back(outgrp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cv::TickMeter::TickMeter() { reset(); }
|
||||
int64 cv::TickMeter::getTimeTicks() const { return sumTime; }
|
||||
double cv::TickMeter::getTimeMicro() const { return (double)getTimeTicks()/cvGetTickFrequency(); }
|
||||
double cv::TickMeter::getTimeMilli() const { return getTimeMicro()*1e-3; }
|
||||
double cv::TickMeter::getTimeSec() const { return getTimeMilli()*1e-3; }
|
||||
double cv::TickMeter::getTimeSec() const { return getTimeMilli()*1e-3; }
|
||||
int64 cv::TickMeter::getCounter() const { return counter; }
|
||||
void cv::TickMeter::reset() {startTime = 0; sumTime = 0; counter = 0; }
|
||||
|
||||
|
@ -46,14 +46,14 @@
|
||||
Proceedings of the 5th International Symposium on Visual Computing, Vegas, USA
|
||||
|
||||
This code is written by Sergey G. Kosov for "Visir PX" application as part of Project X (www.project-10.de)
|
||||
*/
|
||||
*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
#include <limits.h>
|
||||
|
||||
namespace cv
|
||||
namespace cv
|
||||
{
|
||||
StereoVar::StereoVar() : levels(3), pyrScale(0.5), nIt(5), minDisp(0), maxDisp(16), poly_n(3), poly_sigma(0), fi(25.0f), lambda(0.03f), penalization(PENALIZATION_TICHONOV), cycle(CYCLE_V), flags(USE_SMART_ID | USE_AUTO_PARAMS)
|
||||
StereoVar::StereoVar() : levels(3), pyrScale(0.5), nIt(5), minDisp(0), maxDisp(16), poly_n(3), poly_sigma(0), fi(25.0f), lambda(0.03f), penalization(PENALIZATION_TICHONOV), cycle(CYCLE_V), flags(USE_SMART_ID | USE_AUTO_PARAMS)
|
||||
{
|
||||
}
|
||||
|
||||
@ -67,9 +67,9 @@ StereoVar::~StereoVar()
|
||||
|
||||
static Mat diffX(Mat &src)
|
||||
{
|
||||
register int x, y, cols = src.cols - 1;
|
||||
Mat dst(src.size(), src.type());
|
||||
for(y = 0; y < src.rows; y++){
|
||||
register int x, y, cols = src.cols - 1;
|
||||
Mat dst(src.size(), src.type());
|
||||
for(y = 0; y < src.rows; y++){
|
||||
const float* pSrc = src.ptr<float>(y);
|
||||
float* pDst = dst.ptr<float>(y);
|
||||
#if CV_SSE2
|
||||
@ -92,319 +92,319 @@ static Mat diffX(Mat &src)
|
||||
|
||||
static Mat getGradient(Mat &src)
|
||||
{
|
||||
register int x, y;
|
||||
Mat dst(src.size(), src.type());
|
||||
dst.setTo(0);
|
||||
for (y = 0; y < src.rows - 1; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pSrcF = src.ptr<float>(y + 1);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (x = 0; x < src.cols - 1; x++)
|
||||
pDst[x] = fabs(pSrc[x + 1] - pSrc[x]) + fabs(pSrcF[x] - pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
register int x, y;
|
||||
Mat dst(src.size(), src.type());
|
||||
dst.setTo(0);
|
||||
for (y = 0; y < src.rows - 1; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pSrcF = src.ptr<float>(y + 1);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (x = 0; x < src.cols - 1; x++)
|
||||
pDst[x] = fabs(pSrc[x + 1] - pSrc[x]) + fabs(pSrcF[x] - pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
static Mat getG_c(Mat &src, float l)
|
||||
{
|
||||
Mat dst(src.size(), src.type());
|
||||
for (register int y = 0; y < src.rows; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (register int x = 0; x < src.cols; x++)
|
||||
pDst[x] = 0.5f*l / sqrtf(l*l + pSrc[x]*pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
Mat dst(src.size(), src.type());
|
||||
for (register int y = 0; y < src.rows; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (register int x = 0; x < src.cols; x++)
|
||||
pDst[x] = 0.5f*l / sqrtf(l*l + pSrc[x]*pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
static Mat getG_p(Mat &src, float l)
|
||||
{
|
||||
Mat dst(src.size(), src.type());
|
||||
for (register int y = 0; y < src.rows; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (register int x = 0; x < src.cols; x++)
|
||||
pDst[x] = 0.5f*l*l / (l*l + pSrc[x]*pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
Mat dst(src.size(), src.type());
|
||||
for (register int y = 0; y < src.rows; y++) {
|
||||
float *pSrc = src.ptr<float>(y);
|
||||
float *pDst = dst.ptr<float>(y);
|
||||
for (register int x = 0; x < src.cols; x++)
|
||||
pDst[x] = 0.5f*l*l / (l*l + pSrc[x]*pSrc[x]);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
void StereoVar::VariationalSolver(Mat &I1, Mat &I2, Mat &I2x, Mat &u, int level)
|
||||
{
|
||||
register int n, x, y;
|
||||
float gl = 1, gr = 1, gu = 1, gd = 1, gc = 4;
|
||||
Mat g_c, g_p;
|
||||
Mat U;
|
||||
u.copyTo(U);
|
||||
register int n, x, y;
|
||||
float gl = 1, gr = 1, gu = 1, gd = 1, gc = 4;
|
||||
Mat g_c, g_p;
|
||||
Mat U;
|
||||
u.copyTo(U);
|
||||
|
||||
int N = nIt;
|
||||
float l = lambda;
|
||||
float Fi = fi;
|
||||
int N = nIt;
|
||||
float l = lambda;
|
||||
float Fi = fi;
|
||||
|
||||
|
||||
if (flags & USE_SMART_ID) {
|
||||
double scale = pow(pyrScale, (double) level) * (1 + pyrScale);
|
||||
N = (int) (N / scale);
|
||||
}
|
||||
|
||||
double scale = pow(pyrScale, (double) level);
|
||||
Fi /= (float) scale;
|
||||
l *= (float) scale;
|
||||
if (flags & USE_SMART_ID) {
|
||||
double scale = pow(pyrScale, (double) level) * (1 + pyrScale);
|
||||
N = (int) (N / scale);
|
||||
}
|
||||
|
||||
int width = u.cols - 1;
|
||||
int height = u.rows - 1;
|
||||
for (n = 0; n < N; n++) {
|
||||
if (penalization != PENALIZATION_TICHONOV) {
|
||||
Mat gradient = getGradient(U);
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER: g_c = getG_c(gradient, l); break;
|
||||
case PENALIZATION_PERONA_MALIK: g_p = getG_p(gradient, l); break;
|
||||
}
|
||||
gradient.release();
|
||||
}
|
||||
for (y = 1 ; y < height; y++) {
|
||||
float *pU = U.ptr<float>(y);
|
||||
float *pUu = U.ptr<float>(y + 1);
|
||||
float *pUd = U.ptr<float>(y - 1);
|
||||
float *pu = u.ptr<float>(y);
|
||||
float *pI1 = I1.ptr<float>(y);
|
||||
float *pI2 = I2.ptr<float>(y);
|
||||
float *pI2x = I2x.ptr<float>(y);
|
||||
float *pG_c = NULL, *pG_cu = NULL, *pG_cd = NULL;
|
||||
float *pG_p = NULL, *pG_pu = NULL, *pG_pd = NULL;
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER:
|
||||
pG_c = g_c.ptr<float>(y);
|
||||
pG_cu = g_c.ptr<float>(y + 1);
|
||||
pG_cd = g_c.ptr<float>(y - 1);
|
||||
break;
|
||||
case PENALIZATION_PERONA_MALIK:
|
||||
pG_p = g_p.ptr<float>(y);
|
||||
pG_pu = g_p.ptr<float>(y + 1);
|
||||
pG_pd = g_p.ptr<float>(y - 1);
|
||||
break;
|
||||
}
|
||||
for (x = 1; x < width; x++) {
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER:
|
||||
gc = pG_c[x];
|
||||
gl = gc + pG_c[x - 1];
|
||||
gr = gc + pG_c[x + 1];
|
||||
gu = gc + pG_cu[x];
|
||||
gd = gc + pG_cd[x];
|
||||
gc = gl + gr + gu + gd;
|
||||
break;
|
||||
case PENALIZATION_PERONA_MALIK:
|
||||
gc = pG_p[x];
|
||||
gl = gc + pG_p[x - 1];
|
||||
gr = gc + pG_p[x + 1];
|
||||
gu = gc + pG_pu[x];
|
||||
gd = gc + pG_pd[x];
|
||||
gc = gl + gr + gu + gd;
|
||||
break;
|
||||
}
|
||||
double scale = pow(pyrScale, (double) level);
|
||||
Fi /= (float) scale;
|
||||
l *= (float) scale;
|
||||
|
||||
float fi = Fi;
|
||||
if (maxDisp > minDisp) {
|
||||
if (pU[x] > maxDisp * scale) {fi *= 1000; pU[x] = static_cast<float>(maxDisp * scale);}
|
||||
if (pU[x] < minDisp * scale) {fi *= 1000; pU[x] = static_cast<float>(minDisp * scale);}
|
||||
}
|
||||
int width = u.cols - 1;
|
||||
int height = u.rows - 1;
|
||||
for (n = 0; n < N; n++) {
|
||||
if (penalization != PENALIZATION_TICHONOV) {
|
||||
Mat gradient = getGradient(U);
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER: g_c = getG_c(gradient, l); break;
|
||||
case PENALIZATION_PERONA_MALIK: g_p = getG_p(gradient, l); break;
|
||||
}
|
||||
gradient.release();
|
||||
}
|
||||
for (y = 1 ; y < height; y++) {
|
||||
float *pU = U.ptr<float>(y);
|
||||
float *pUu = U.ptr<float>(y + 1);
|
||||
float *pUd = U.ptr<float>(y - 1);
|
||||
float *pu = u.ptr<float>(y);
|
||||
float *pI1 = I1.ptr<float>(y);
|
||||
float *pI2 = I2.ptr<float>(y);
|
||||
float *pI2x = I2x.ptr<float>(y);
|
||||
float *pG_c = NULL, *pG_cu = NULL, *pG_cd = NULL;
|
||||
float *pG_p = NULL, *pG_pu = NULL, *pG_pd = NULL;
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER:
|
||||
pG_c = g_c.ptr<float>(y);
|
||||
pG_cu = g_c.ptr<float>(y + 1);
|
||||
pG_cd = g_c.ptr<float>(y - 1);
|
||||
break;
|
||||
case PENALIZATION_PERONA_MALIK:
|
||||
pG_p = g_p.ptr<float>(y);
|
||||
pG_pu = g_p.ptr<float>(y + 1);
|
||||
pG_pd = g_p.ptr<float>(y - 1);
|
||||
break;
|
||||
}
|
||||
for (x = 1; x < width; x++) {
|
||||
switch (penalization) {
|
||||
case PENALIZATION_CHARBONNIER:
|
||||
gc = pG_c[x];
|
||||
gl = gc + pG_c[x - 1];
|
||||
gr = gc + pG_c[x + 1];
|
||||
gu = gc + pG_cu[x];
|
||||
gd = gc + pG_cd[x];
|
||||
gc = gl + gr + gu + gd;
|
||||
break;
|
||||
case PENALIZATION_PERONA_MALIK:
|
||||
gc = pG_p[x];
|
||||
gl = gc + pG_p[x - 1];
|
||||
gr = gc + pG_p[x + 1];
|
||||
gu = gc + pG_pu[x];
|
||||
gd = gc + pG_pd[x];
|
||||
gc = gl + gr + gu + gd;
|
||||
break;
|
||||
}
|
||||
|
||||
int A = static_cast<int>(pU[x]);
|
||||
int neg = 0; if (pU[x] <= 0) neg = -1;
|
||||
float _fi = Fi;
|
||||
if (maxDisp > minDisp) {
|
||||
if (pU[x] > maxDisp * scale) {_fi *= 1000; pU[x] = static_cast<float>(maxDisp * scale);}
|
||||
if (pU[x] < minDisp * scale) {_fi *= 1000; pU[x] = static_cast<float>(minDisp * scale);}
|
||||
}
|
||||
|
||||
if (x + A > width)
|
||||
pu[x] = pU[width - A];
|
||||
else if (x + A + neg < 0)
|
||||
pu[x] = pU[- A + 2];
|
||||
else {
|
||||
pu[x] = A + (pI2x[x + A + neg] * (pI1[x] - pI2[x + A])
|
||||
+ fi * (gr * pU[x + 1] + gl * pU[x - 1] + gu * pUu[x] + gd * pUd[x] - gc * A))
|
||||
/ (pI2x[x + A + neg] * pI2x[x + A + neg] + gc * fi) ;
|
||||
}
|
||||
}// x
|
||||
pu[0] = pu[1];
|
||||
pu[width] = pu[width - 1];
|
||||
}// y
|
||||
for (x = 0; x <= width; x++) {
|
||||
u.at<float>(0, x) = u.at<float>(1, x);
|
||||
u.at<float>(height, x) = u.at<float>(height - 1, x);
|
||||
}
|
||||
u.copyTo(U);
|
||||
if (!g_c.empty()) g_c.release();
|
||||
if (!g_p.empty()) g_p.release();
|
||||
}//n
|
||||
int A = static_cast<int>(pU[x]);
|
||||
int neg = 0; if (pU[x] <= 0) neg = -1;
|
||||
|
||||
if (x + A > width)
|
||||
pu[x] = pU[width - A];
|
||||
else if (x + A + neg < 0)
|
||||
pu[x] = pU[- A + 2];
|
||||
else {
|
||||
pu[x] = A + (pI2x[x + A + neg] * (pI1[x] - pI2[x + A])
|
||||
+ _fi * (gr * pU[x + 1] + gl * pU[x - 1] + gu * pUu[x] + gd * pUd[x] - gc * A))
|
||||
/ (pI2x[x + A + neg] * pI2x[x + A + neg] + gc * _fi) ;
|
||||
}
|
||||
}// x
|
||||
pu[0] = pu[1];
|
||||
pu[width] = pu[width - 1];
|
||||
}// y
|
||||
for (x = 0; x <= width; x++) {
|
||||
u.at<float>(0, x) = u.at<float>(1, x);
|
||||
u.at<float>(height, x) = u.at<float>(height - 1, x);
|
||||
}
|
||||
u.copyTo(U);
|
||||
if (!g_c.empty()) g_c.release();
|
||||
if (!g_p.empty()) g_p.release();
|
||||
}//n
|
||||
}
|
||||
|
||||
void StereoVar::VCycle_MyFAS(Mat &I1, Mat &I2, Mat &I2x, Mat &_u, int level)
|
||||
{
|
||||
CvSize imgSize = _u.size();
|
||||
CvSize frmSize = cvSize((int) (imgSize.width * pyrScale + 0.5), (int) (imgSize.height * pyrScale + 0.5));
|
||||
Mat I1_h, I2_h, I2x_h, u_h, U, U_h;
|
||||
CvSize imgSize = _u.size();
|
||||
CvSize frmSize = cvSize((int) (imgSize.width * pyrScale + 0.5), (int) (imgSize.height * pyrScale + 0.5));
|
||||
Mat I1_h, I2_h, I2x_h, u_h, U, U_h;
|
||||
|
||||
//PRE relaxation
|
||||
VariationalSolver(I1, I2, I2x, _u, level);
|
||||
//PRE relaxation
|
||||
VariationalSolver(I1, I2, I2x, _u, level);
|
||||
|
||||
if (level >= levels - 1) return;
|
||||
level ++;
|
||||
if (level >= levels - 1) return;
|
||||
level ++;
|
||||
|
||||
//scaling DOWN
|
||||
resize(I1, I1_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(I2, I2_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(_u, u_h, frmSize, 0, 0, INTER_AREA);
|
||||
u_h.convertTo(u_h, u_h.type(), pyrScale);
|
||||
I2x_h = diffX(I2_h);
|
||||
//scaling DOWN
|
||||
resize(I1, I1_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(I2, I2_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(_u, u_h, frmSize, 0, 0, INTER_AREA);
|
||||
u_h.convertTo(u_h, u_h.type(), pyrScale);
|
||||
I2x_h = diffX(I2_h);
|
||||
|
||||
//Next level
|
||||
U_h = u_h.clone();
|
||||
VCycle_MyFAS(I1_h, I2_h, I2x_h, U_h, level);
|
||||
//Next level
|
||||
U_h = u_h.clone();
|
||||
VCycle_MyFAS(I1_h, I2_h, I2x_h, U_h, level);
|
||||
|
||||
subtract(U_h, u_h, U_h);
|
||||
U_h.convertTo(U_h, U_h.type(), 1.0 / pyrScale);
|
||||
subtract(U_h, u_h, U_h);
|
||||
U_h.convertTo(U_h, U_h.type(), 1.0 / pyrScale);
|
||||
|
||||
//scaling UP
|
||||
resize(U_h, U, imgSize);
|
||||
//scaling UP
|
||||
resize(U_h, U, imgSize);
|
||||
|
||||
//correcting the solution
|
||||
add(_u, U, _u);
|
||||
//correcting the solution
|
||||
add(_u, U, _u);
|
||||
|
||||
//POST relaxation
|
||||
VariationalSolver(I1, I2, I2x, _u, level - 1);
|
||||
//POST relaxation
|
||||
VariationalSolver(I1, I2, I2x, _u, level - 1);
|
||||
|
||||
if (flags & USE_MEDIAN_FILTERING) medianBlur(_u, _u, 3);
|
||||
if (flags & USE_MEDIAN_FILTERING) medianBlur(_u, _u, 3);
|
||||
|
||||
I1_h.release();
|
||||
I2_h.release();
|
||||
I2x_h.release();
|
||||
u_h.release();
|
||||
U.release();
|
||||
U_h.release();
|
||||
I1_h.release();
|
||||
I2_h.release();
|
||||
I2x_h.release();
|
||||
u_h.release();
|
||||
U.release();
|
||||
U_h.release();
|
||||
}
|
||||
|
||||
void StereoVar::FMG(Mat &I1, Mat &I2, Mat &I2x, Mat &u, int level)
|
||||
{
|
||||
double scale = pow(pyrScale, (double) level);
|
||||
CvSize frmSize = cvSize((int) (u.cols * scale + 0.5), (int) (u.rows * scale + 0.5));
|
||||
Mat I1_h, I2_h, I2x_h, u_h;
|
||||
double scale = pow(pyrScale, (double) level);
|
||||
CvSize frmSize = cvSize((int) (u.cols * scale + 0.5), (int) (u.rows * scale + 0.5));
|
||||
Mat I1_h, I2_h, I2x_h, u_h;
|
||||
|
||||
//scaling DOWN
|
||||
resize(I1, I1_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(I2, I2_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(u, u_h, frmSize, 0, 0, INTER_AREA);
|
||||
u_h.convertTo(u_h, u_h.type(), scale);
|
||||
I2x_h = diffX(I2_h);
|
||||
//scaling DOWN
|
||||
resize(I1, I1_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(I2, I2_h, frmSize, 0, 0, INTER_AREA);
|
||||
resize(u, u_h, frmSize, 0, 0, INTER_AREA);
|
||||
u_h.convertTo(u_h, u_h.type(), scale);
|
||||
I2x_h = diffX(I2_h);
|
||||
|
||||
switch (cycle) {
|
||||
case CYCLE_O:
|
||||
VariationalSolver(I1_h, I2_h, I2x_h, u_h, level);
|
||||
break;
|
||||
case CYCLE_V:
|
||||
VCycle_MyFAS(I1_h, I2_h, I2x_h, u_h, level);
|
||||
break;
|
||||
}
|
||||
switch (cycle) {
|
||||
case CYCLE_O:
|
||||
VariationalSolver(I1_h, I2_h, I2x_h, u_h, level);
|
||||
break;
|
||||
case CYCLE_V:
|
||||
VCycle_MyFAS(I1_h, I2_h, I2x_h, u_h, level);
|
||||
break;
|
||||
}
|
||||
|
||||
u_h.convertTo(u_h, u_h.type(), 1.0 / scale);
|
||||
u_h.convertTo(u_h, u_h.type(), 1.0 / scale);
|
||||
|
||||
//scaling UP
|
||||
resize(u_h, u, u.size(), 0, 0, INTER_CUBIC);
|
||||
//scaling UP
|
||||
resize(u_h, u, u.size(), 0, 0, INTER_CUBIC);
|
||||
|
||||
I1_h.release();
|
||||
I2_h.release();
|
||||
I2x_h.release();
|
||||
u_h.release();
|
||||
I1_h.release();
|
||||
I2_h.release();
|
||||
I2x_h.release();
|
||||
u_h.release();
|
||||
|
||||
level--;
|
||||
if ((flags & USE_AUTO_PARAMS) && (level < levels / 3)) {
|
||||
penalization = PENALIZATION_PERONA_MALIK;
|
||||
fi *= 100;
|
||||
flags -= USE_AUTO_PARAMS;
|
||||
autoParams();
|
||||
}
|
||||
if (flags & USE_MEDIAN_FILTERING) medianBlur(u, u, 3);
|
||||
if (level >= 0) FMG(I1, I2, I2x, u, level);
|
||||
level--;
|
||||
if ((flags & USE_AUTO_PARAMS) && (level < levels / 3)) {
|
||||
penalization = PENALIZATION_PERONA_MALIK;
|
||||
fi *= 100;
|
||||
flags -= USE_AUTO_PARAMS;
|
||||
autoParams();
|
||||
}
|
||||
if (flags & USE_MEDIAN_FILTERING) medianBlur(u, u, 3);
|
||||
if (level >= 0) FMG(I1, I2, I2x, u, level);
|
||||
}
|
||||
|
||||
void StereoVar::autoParams()
|
||||
{
|
||||
int maxD = MAX(labs(maxDisp), labs(minDisp));
|
||||
|
||||
if (!maxD) pyrScale = 0.85;
|
||||
else if (maxD < 8) pyrScale = 0.5;
|
||||
else if (maxD < 64) pyrScale = 0.5 + static_cast<double>(maxD - 8) * 0.00625;
|
||||
else pyrScale = 0.85;
|
||||
|
||||
if (maxD) {
|
||||
levels = 0;
|
||||
while ( pow(pyrScale, levels) * maxD > 1.5) levels ++;
|
||||
levels++;
|
||||
}
|
||||
{
|
||||
int maxD = MAX(labs(maxDisp), labs(minDisp));
|
||||
|
||||
switch(penalization) {
|
||||
case PENALIZATION_TICHONOV: cycle = CYCLE_V; break;
|
||||
case PENALIZATION_CHARBONNIER: cycle = CYCLE_O; break;
|
||||
case PENALIZATION_PERONA_MALIK: cycle = CYCLE_O; break;
|
||||
}
|
||||
if (!maxD) pyrScale = 0.85;
|
||||
else if (maxD < 8) pyrScale = 0.5;
|
||||
else if (maxD < 64) pyrScale = 0.5 + static_cast<double>(maxD - 8) * 0.00625;
|
||||
else pyrScale = 0.85;
|
||||
|
||||
if (maxD) {
|
||||
levels = 0;
|
||||
while ( pow(pyrScale, levels) * maxD > 1.5) levels ++;
|
||||
levels++;
|
||||
}
|
||||
|
||||
switch(penalization) {
|
||||
case PENALIZATION_TICHONOV: cycle = CYCLE_V; break;
|
||||
case PENALIZATION_CHARBONNIER: cycle = CYCLE_O; break;
|
||||
case PENALIZATION_PERONA_MALIK: cycle = CYCLE_O; break;
|
||||
}
|
||||
}
|
||||
|
||||
void StereoVar::operator ()( const Mat& left, const Mat& right, Mat& disp )
|
||||
{
|
||||
CV_Assert(left.size() == right.size() && left.type() == right.type());
|
||||
CvSize imgSize = left.size();
|
||||
int MaxD = MAX(labs(minDisp), labs(maxDisp));
|
||||
int SignD = 1; if (MIN(minDisp, maxDisp) < 0) SignD = -1;
|
||||
if (minDisp >= maxDisp) {MaxD = 256; SignD = 1;}
|
||||
|
||||
Mat u;
|
||||
if ((flags & USE_INITIAL_DISPARITY) && (!disp.empty())) {
|
||||
CV_Assert(disp.size() == left.size() && disp.type() == CV_8UC1);
|
||||
disp.convertTo(u, CV_32FC1, static_cast<double>(SignD * MaxD) / 256);
|
||||
} else {
|
||||
u.create(imgSize, CV_32FC1);
|
||||
u.setTo(0);
|
||||
}
|
||||
CV_Assert(left.size() == right.size() && left.type() == right.type());
|
||||
CvSize imgSize = left.size();
|
||||
int MaxD = MAX(labs(minDisp), labs(maxDisp));
|
||||
int SignD = 1; if (MIN(minDisp, maxDisp) < 0) SignD = -1;
|
||||
if (minDisp >= maxDisp) {MaxD = 256; SignD = 1;}
|
||||
|
||||
// Preprocessing
|
||||
Mat leftgray, rightgray;
|
||||
if (left.type() != CV_8UC1) {
|
||||
cvtColor(left, leftgray, CV_BGR2GRAY);
|
||||
cvtColor(right, rightgray, CV_BGR2GRAY);
|
||||
} else {
|
||||
left.copyTo(leftgray);
|
||||
right.copyTo(rightgray);
|
||||
}
|
||||
if (flags & USE_EQUALIZE_HIST) {
|
||||
equalizeHist(leftgray, leftgray);
|
||||
equalizeHist(rightgray, rightgray);
|
||||
}
|
||||
if (poly_sigma > 0.0001) {
|
||||
GaussianBlur(leftgray, leftgray, cvSize(poly_n, poly_n), poly_sigma);
|
||||
GaussianBlur(rightgray, rightgray, cvSize(poly_n, poly_n), poly_sigma);
|
||||
}
|
||||
|
||||
if (flags & USE_AUTO_PARAMS) {
|
||||
penalization = PENALIZATION_TICHONOV;
|
||||
autoParams();
|
||||
}
|
||||
Mat u;
|
||||
if ((flags & USE_INITIAL_DISPARITY) && (!disp.empty())) {
|
||||
CV_Assert(disp.size() == left.size() && disp.type() == CV_8UC1);
|
||||
disp.convertTo(u, CV_32FC1, static_cast<double>(SignD * MaxD) / 256);
|
||||
} else {
|
||||
u.create(imgSize, CV_32FC1);
|
||||
u.setTo(0);
|
||||
}
|
||||
|
||||
Mat I1, I2;
|
||||
leftgray.convertTo(I1, CV_32FC1);
|
||||
rightgray.convertTo(I2, CV_32FC1);
|
||||
leftgray.release();
|
||||
rightgray.release();
|
||||
// Preprocessing
|
||||
Mat leftgray, rightgray;
|
||||
if (left.type() != CV_8UC1) {
|
||||
cvtColor(left, leftgray, CV_BGR2GRAY);
|
||||
cvtColor(right, rightgray, CV_BGR2GRAY);
|
||||
} else {
|
||||
left.copyTo(leftgray);
|
||||
right.copyTo(rightgray);
|
||||
}
|
||||
if (flags & USE_EQUALIZE_HIST) {
|
||||
equalizeHist(leftgray, leftgray);
|
||||
equalizeHist(rightgray, rightgray);
|
||||
}
|
||||
if (poly_sigma > 0.0001) {
|
||||
GaussianBlur(leftgray, leftgray, cvSize(poly_n, poly_n), poly_sigma);
|
||||
GaussianBlur(rightgray, rightgray, cvSize(poly_n, poly_n), poly_sigma);
|
||||
}
|
||||
|
||||
Mat I2x = diffX(I2);
|
||||
|
||||
FMG(I1, I2, I2x, u, levels - 1);
|
||||
|
||||
I1.release();
|
||||
I2.release();
|
||||
I2x.release();
|
||||
|
||||
|
||||
disp.create( left.size(), CV_8UC1 );
|
||||
u = abs(u);
|
||||
u.convertTo(disp, disp.type(), 256 / MaxD, 0);
|
||||
if (flags & USE_AUTO_PARAMS) {
|
||||
penalization = PENALIZATION_TICHONOV;
|
||||
autoParams();
|
||||
}
|
||||
|
||||
u.release();
|
||||
Mat I1, I2;
|
||||
leftgray.convertTo(I1, CV_32FC1);
|
||||
rightgray.convertTo(I2, CV_32FC1);
|
||||
leftgray.release();
|
||||
rightgray.release();
|
||||
|
||||
Mat I2x = diffX(I2);
|
||||
|
||||
FMG(I1, I2, I2x, u, levels - 1);
|
||||
|
||||
I1.release();
|
||||
I2.release();
|
||||
I2x.release();
|
||||
|
||||
|
||||
disp.create( left.size(), CV_8UC1 );
|
||||
u = abs(u);
|
||||
u.convertTo(disp, disp.type(), 256 / MaxD, 0);
|
||||
|
||||
u.release();
|
||||
}
|
||||
} // namespace
|
@ -5,13 +5,11 @@ ocv_module_include_directories(${ZLIB_INCLUDE_DIR})
|
||||
if(HAVE_CUDA)
|
||||
file(GLOB lib_cuda "src/cuda/*.cu")
|
||||
source_group("Cuda" FILES "${lib_cuda}")
|
||||
include_directories(AFTER SYSTEM ${CUDA_INCLUDE_DIRS})
|
||||
ocv_include_directories("${OpenCV_SOURCE_DIR}/modules/gpu/src" "${OpenCV_SOURCE_DIR}/modules/gpu/src/cuda")
|
||||
|
||||
ocv_include_directories("${OpenCV_SOURCE_DIR}/modules/gpu/src" "${OpenCV_SOURCE_DIR}/modules/gpu/src/cuda" ${CUDA_INCLUDE_DIRS})
|
||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
|
||||
ocv_cuda_compile(cuda_objs ${lib_cuda})
|
||||
|
||||
OCV_CUDA_COMPILE(cuda_objs ${lib_cuda})
|
||||
|
||||
set(cuda_link_libs ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
|
||||
else()
|
||||
set(lib_cuda "")
|
||||
|
@ -366,12 +366,12 @@ namespace cv { namespace gpu
|
||||
return m;
|
||||
}
|
||||
|
||||
inline void GpuMat::assignTo(GpuMat& m, int type) const
|
||||
inline void GpuMat::assignTo(GpuMat& m, int _type) const
|
||||
{
|
||||
if (type < 0)
|
||||
if (_type < 0)
|
||||
m = *this;
|
||||
else
|
||||
convertTo(m, type);
|
||||
convertTo(m, _type);
|
||||
}
|
||||
|
||||
inline size_t GpuMat::step1() const
|
||||
@ -434,9 +434,9 @@ namespace cv { namespace gpu
|
||||
create(size_.height, size_.width, type_);
|
||||
}
|
||||
|
||||
inline GpuMat GpuMat::operator()(Range rowRange, Range colRange) const
|
||||
inline GpuMat GpuMat::operator()(Range _rowRange, Range _colRange) const
|
||||
{
|
||||
return GpuMat(*this, rowRange, colRange);
|
||||
return GpuMat(*this, _rowRange, _colRange);
|
||||
}
|
||||
|
||||
inline GpuMat GpuMat::operator()(Rect roi) const
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -47,282 +47,287 @@
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
|
||||
namespace cv
|
||||
namespace cv
|
||||
{
|
||||
//! Smart pointer for OpenGL buffer memory with reference counting.
|
||||
class CV_EXPORTS GlBuffer
|
||||
//! Smart pointer for OpenGL buffer memory with reference counting.
|
||||
class CV_EXPORTS GlBuffer
|
||||
{
|
||||
public:
|
||||
enum Usage
|
||||
{
|
||||
public:
|
||||
enum Usage
|
||||
{
|
||||
ARRAY_BUFFER = 0x8892, // buffer will use for OpenGL arrays (vertices, colors, normals, etc)
|
||||
TEXTURE_BUFFER = 0x88EC // buffer will ise for OpenGL textures
|
||||
};
|
||||
|
||||
//! create empty buffer
|
||||
explicit GlBuffer(Usage usage);
|
||||
|
||||
//! create buffer
|
||||
GlBuffer(int rows, int cols, int type, Usage usage);
|
||||
GlBuffer(Size size, int type, Usage usage);
|
||||
|
||||
//! copy from host/device memory
|
||||
GlBuffer(InputArray mat, Usage usage);
|
||||
|
||||
void create(int rows, int cols, int type, Usage usage);
|
||||
inline void create(Size size, int type, Usage usage) { create(size.height, size.width, type, usage); }
|
||||
inline void create(int rows, int cols, int type) { create(rows, cols, type, usage()); }
|
||||
inline void create(Size size, int type) { create(size.height, size.width, type, usage()); }
|
||||
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
//! map to host memory
|
||||
Mat mapHost();
|
||||
void unmapHost();
|
||||
|
||||
//! map to device memory
|
||||
gpu::GpuMat mapDevice();
|
||||
void unmapDevice();
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
inline Usage usage() const { return usage_; }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
Usage usage_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
ARRAY_BUFFER = 0x8892, // buffer will use for OpenGL arrays (vertices, colors, normals, etc)
|
||||
TEXTURE_BUFFER = 0x88EC // buffer will ise for OpenGL textures
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlBuffer::Impl>::delete_obj();
|
||||
//! create empty buffer
|
||||
explicit GlBuffer(Usage usage);
|
||||
|
||||
//! Smart pointer for OpenGL 2d texture memory with reference counting.
|
||||
class CV_EXPORTS GlTexture
|
||||
//! create buffer
|
||||
GlBuffer(int rows, int cols, int type, Usage usage);
|
||||
GlBuffer(Size size, int type, Usage usage);
|
||||
|
||||
//! copy from host/device memory
|
||||
GlBuffer(InputArray mat, Usage usage);
|
||||
|
||||
void create(int rows, int cols, int type, Usage usage);
|
||||
void create(Size size, int type, Usage usage);
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
//! map to host memory
|
||||
Mat mapHost();
|
||||
void unmapHost();
|
||||
|
||||
//! map to device memory
|
||||
gpu::GpuMat mapDevice();
|
||||
void unmapDevice();
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
inline Usage usage() const { return usage_; }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
Usage usage_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlBuffer::Impl>::delete_obj();
|
||||
|
||||
//! Smart pointer for OpenGL 2d texture memory with reference counting.
|
||||
class CV_EXPORTS GlTexture
|
||||
{
|
||||
public:
|
||||
//! create empty texture
|
||||
GlTexture();
|
||||
|
||||
//! create texture
|
||||
GlTexture(int rows, int cols, int type);
|
||||
GlTexture(Size size, int type);
|
||||
|
||||
//! copy from host/device memory
|
||||
explicit GlTexture(InputArray mat, bool bgra = true);
|
||||
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat, bool bgra = true);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
GlBuffer buf_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlTexture::Impl>::delete_obj();
|
||||
|
||||
//! OpenGL Arrays
|
||||
class CV_EXPORTS GlArrays
|
||||
{
|
||||
public:
|
||||
inline GlArrays()
|
||||
: vertex_(GlBuffer::ARRAY_BUFFER), color_(GlBuffer::ARRAY_BUFFER), bgra_(true), normal_(GlBuffer::ARRAY_BUFFER), texCoord_(GlBuffer::ARRAY_BUFFER)
|
||||
{
|
||||
public:
|
||||
//! create empty texture
|
||||
GlTexture();
|
||||
|
||||
//! create texture
|
||||
GlTexture(int rows, int cols, int type);
|
||||
GlTexture(Size size, int type);
|
||||
|
||||
//! copy from host/device memory
|
||||
explicit GlTexture(InputArray mat, bool bgra = true);
|
||||
|
||||
void create(int rows, int cols, int type);
|
||||
inline void create(Size size, int type) { create(size.height, size.width, type); }
|
||||
void release();
|
||||
|
||||
//! copy from host/device memory
|
||||
void copyFrom(InputArray mat, bool bgra = true);
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return rows_; }
|
||||
inline int cols() const { return cols_; }
|
||||
inline Size size() const { return Size(cols_, rows_); }
|
||||
inline bool empty() const { return rows_ == 0 || cols_ == 0; }
|
||||
|
||||
inline int type() const { return type_; }
|
||||
inline int depth() const { return CV_MAT_DEPTH(type_); }
|
||||
inline int channels() const { return CV_MAT_CN(type_); }
|
||||
inline int elemSize() const { return CV_ELEM_SIZE(type_); }
|
||||
inline int elemSize1() const { return CV_ELEM_SIZE1(type_); }
|
||||
|
||||
class Impl;
|
||||
private:
|
||||
int rows_;
|
||||
int cols_;
|
||||
int type_;
|
||||
|
||||
Ptr<Impl> impl_;
|
||||
GlBuffer buf_;
|
||||
};
|
||||
|
||||
template <> CV_EXPORTS void Ptr<GlTexture::Impl>::delete_obj();
|
||||
|
||||
//! OpenGL Arrays
|
||||
class CV_EXPORTS GlArrays
|
||||
{
|
||||
public:
|
||||
inline GlArrays()
|
||||
: vertex_(GlBuffer::ARRAY_BUFFER), color_(GlBuffer::ARRAY_BUFFER), bgra_(true), normal_(GlBuffer::ARRAY_BUFFER), texCoord_(GlBuffer::ARRAY_BUFFER)
|
||||
{
|
||||
}
|
||||
|
||||
void setVertexArray(InputArray vertex);
|
||||
inline void resetVertexArray() { vertex_.release(); }
|
||||
|
||||
void setColorArray(InputArray color, bool bgra = true);
|
||||
inline void resetColorArray() { color_.release(); }
|
||||
|
||||
void setNormalArray(InputArray normal);
|
||||
inline void resetNormalArray() { normal_.release(); }
|
||||
|
||||
void setTexCoordArray(InputArray texCoord);
|
||||
inline void resetTexCoordArray() { texCoord_.release(); }
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return vertex_.rows(); }
|
||||
inline int cols() const { return vertex_.cols(); }
|
||||
inline Size size() const { return vertex_.size(); }
|
||||
inline bool empty() const { return vertex_.empty(); }
|
||||
|
||||
private:
|
||||
GlBuffer vertex_;
|
||||
GlBuffer color_;
|
||||
bool bgra_;
|
||||
GlBuffer normal_;
|
||||
GlBuffer texCoord_;
|
||||
};
|
||||
|
||||
//! OpenGL Font
|
||||
class CV_EXPORTS GlFont
|
||||
{
|
||||
public:
|
||||
enum Weight
|
||||
{
|
||||
WEIGHT_LIGHT = 300,
|
||||
WEIGHT_NORMAL = 400,
|
||||
WEIGHT_SEMIBOLD = 600,
|
||||
WEIGHT_BOLD = 700,
|
||||
WEIGHT_BLACK = 900
|
||||
};
|
||||
|
||||
enum Style
|
||||
{
|
||||
STYLE_NORMAL = 0,
|
||||
STYLE_ITALIC = 1,
|
||||
STYLE_UNDERLINE = 2
|
||||
};
|
||||
|
||||
static Ptr<GlFont> get(const std::string& family, int height = 12, Weight weight = WEIGHT_NORMAL, Style style = STYLE_NORMAL);
|
||||
|
||||
void draw(const char* str, size_t len) const;
|
||||
|
||||
inline const std::string& family() const { return family_; }
|
||||
inline int height() const { return height_; }
|
||||
inline Weight weight() const { return weight_; }
|
||||
inline Style style() const { return style_; }
|
||||
|
||||
private:
|
||||
GlFont(const std::string& family, int height, Weight weight, Style style);
|
||||
|
||||
std::string family_;
|
||||
int height_;
|
||||
Weight weight_;
|
||||
Style style_;
|
||||
|
||||
unsigned int base_;
|
||||
|
||||
GlFont(const GlFont&);
|
||||
GlFont& operator =(const GlFont&);
|
||||
};
|
||||
|
||||
//! render functions
|
||||
|
||||
//! render texture rectangle in window
|
||||
CV_EXPORTS void render(const GlTexture& tex,
|
||||
Rect_<double> wndRect = Rect_<double>(0.0, 0.0, 1.0, 1.0),
|
||||
Rect_<double> texRect = Rect_<double>(0.0, 0.0, 1.0, 1.0));
|
||||
|
||||
//! render mode
|
||||
namespace RenderMode {
|
||||
enum {
|
||||
POINTS = 0x0000,
|
||||
LINES = 0x0001,
|
||||
LINE_LOOP = 0x0002,
|
||||
LINE_STRIP = 0x0003,
|
||||
TRIANGLES = 0x0004,
|
||||
TRIANGLE_STRIP = 0x0005,
|
||||
TRIANGLE_FAN = 0x0006,
|
||||
QUADS = 0x0007,
|
||||
QUAD_STRIP = 0x0008,
|
||||
POLYGON = 0x0009
|
||||
};
|
||||
}
|
||||
|
||||
//! render OpenGL arrays
|
||||
CV_EXPORTS void render(const GlArrays& arr, int mode = RenderMode::POINTS, Scalar color = Scalar::all(255));
|
||||
void setVertexArray(InputArray vertex);
|
||||
inline void resetVertexArray() { vertex_.release(); }
|
||||
|
||||
CV_EXPORTS void render(const std::string& str, const Ptr<GlFont>& font, Scalar color, Point2d pos);
|
||||
void setColorArray(InputArray color, bool bgra = true);
|
||||
inline void resetColorArray() { color_.release(); }
|
||||
|
||||
//! OpenGL camera
|
||||
class CV_EXPORTS GlCamera
|
||||
void setNormalArray(InputArray normal);
|
||||
inline void resetNormalArray() { normal_.release(); }
|
||||
|
||||
void setTexCoordArray(InputArray texCoord);
|
||||
inline void resetTexCoordArray() { texCoord_.release(); }
|
||||
|
||||
void bind() const;
|
||||
void unbind() const;
|
||||
|
||||
inline int rows() const { return vertex_.rows(); }
|
||||
inline int cols() const { return vertex_.cols(); }
|
||||
inline Size size() const { return vertex_.size(); }
|
||||
inline bool empty() const { return vertex_.empty(); }
|
||||
|
||||
private:
|
||||
GlBuffer vertex_;
|
||||
GlBuffer color_;
|
||||
bool bgra_;
|
||||
GlBuffer normal_;
|
||||
GlBuffer texCoord_;
|
||||
};
|
||||
|
||||
//! OpenGL Font
|
||||
class CV_EXPORTS GlFont
|
||||
{
|
||||
public:
|
||||
enum Weight
|
||||
{
|
||||
public:
|
||||
GlCamera();
|
||||
|
||||
void lookAt(Point3d eye, Point3d center, Point3d up);
|
||||
void setCameraPos(Point3d pos, double yaw, double pitch, double roll);
|
||||
|
||||
void setScale(Point3d scale);
|
||||
|
||||
void setProjectionMatrix(const Mat& projectionMatrix, bool transpose = true);
|
||||
void setPerspectiveProjection(double fov, double aspect, double zNear, double zFar);
|
||||
void setOrthoProjection(double left, double right, double bottom, double top, double zNear, double zFar);
|
||||
|
||||
void setupProjectionMatrix() const;
|
||||
void setupModelViewMatrix() const;
|
||||
|
||||
private:
|
||||
Point3d eye_;
|
||||
Point3d center_;
|
||||
Point3d up_;
|
||||
|
||||
Point3d pos_;
|
||||
double yaw_;
|
||||
double pitch_;
|
||||
double roll_;
|
||||
|
||||
bool useLookAtParams_;
|
||||
|
||||
Point3d scale_;
|
||||
|
||||
Mat projectionMatrix_;
|
||||
|
||||
double fov_;
|
||||
double aspect_;
|
||||
|
||||
double left_;
|
||||
double right_;
|
||||
double bottom_;
|
||||
double top_;
|
||||
|
||||
double zNear_;
|
||||
double zFar_;
|
||||
|
||||
bool perspectiveProjection_;
|
||||
WEIGHT_LIGHT = 300,
|
||||
WEIGHT_NORMAL = 400,
|
||||
WEIGHT_SEMIBOLD = 600,
|
||||
WEIGHT_BOLD = 700,
|
||||
WEIGHT_BLACK = 900
|
||||
};
|
||||
|
||||
namespace gpu
|
||||
enum Style
|
||||
{
|
||||
//! set a CUDA device to use OpenGL interoperability
|
||||
CV_EXPORTS void setGlDevice(int device = 0);
|
||||
}
|
||||
STYLE_NORMAL = 0,
|
||||
STYLE_ITALIC = 1,
|
||||
STYLE_UNDERLINE = 2
|
||||
};
|
||||
|
||||
static Ptr<GlFont> get(const std::string& family, int height = 12, Weight weight = WEIGHT_NORMAL, Style style = STYLE_NORMAL);
|
||||
|
||||
void draw(const char* str, size_t len) const;
|
||||
|
||||
inline const std::string& family() const { return family_; }
|
||||
inline int height() const { return height_; }
|
||||
inline Weight weight() const { return weight_; }
|
||||
inline Style style() const { return style_; }
|
||||
|
||||
private:
|
||||
GlFont(const std::string& family, int height, Weight weight, Style style);
|
||||
|
||||
std::string family_;
|
||||
int height_;
|
||||
Weight weight_;
|
||||
Style style_;
|
||||
|
||||
unsigned int base_;
|
||||
|
||||
GlFont(const GlFont&);
|
||||
GlFont& operator =(const GlFont&);
|
||||
};
|
||||
|
||||
//! render functions
|
||||
|
||||
//! render texture rectangle in window
|
||||
CV_EXPORTS void render(const GlTexture& tex,
|
||||
Rect_<double> wndRect = Rect_<double>(0.0, 0.0, 1.0, 1.0),
|
||||
Rect_<double> texRect = Rect_<double>(0.0, 0.0, 1.0, 1.0));
|
||||
|
||||
//! render mode
|
||||
namespace RenderMode {
|
||||
enum {
|
||||
POINTS = 0x0000,
|
||||
LINES = 0x0001,
|
||||
LINE_LOOP = 0x0002,
|
||||
LINE_STRIP = 0x0003,
|
||||
TRIANGLES = 0x0004,
|
||||
TRIANGLE_STRIP = 0x0005,
|
||||
TRIANGLE_FAN = 0x0006,
|
||||
QUADS = 0x0007,
|
||||
QUAD_STRIP = 0x0008,
|
||||
POLYGON = 0x0009
|
||||
};
|
||||
}
|
||||
|
||||
//! render OpenGL arrays
|
||||
CV_EXPORTS void render(const GlArrays& arr, int mode = RenderMode::POINTS, Scalar color = Scalar::all(255));
|
||||
|
||||
CV_EXPORTS void render(const std::string& str, const Ptr<GlFont>& font, Scalar color, Point2d pos);
|
||||
|
||||
//! OpenGL camera
|
||||
class CV_EXPORTS GlCamera
|
||||
{
|
||||
public:
|
||||
GlCamera();
|
||||
|
||||
void lookAt(Point3d eye, Point3d center, Point3d up);
|
||||
void setCameraPos(Point3d pos, double yaw, double pitch, double roll);
|
||||
|
||||
void setScale(Point3d scale);
|
||||
|
||||
void setProjectionMatrix(const Mat& projectionMatrix, bool transpose = true);
|
||||
void setPerspectiveProjection(double fov, double aspect, double zNear, double zFar);
|
||||
void setOrthoProjection(double left, double right, double bottom, double top, double zNear, double zFar);
|
||||
|
||||
void setupProjectionMatrix() const;
|
||||
void setupModelViewMatrix() const;
|
||||
|
||||
private:
|
||||
Point3d eye_;
|
||||
Point3d center_;
|
||||
Point3d up_;
|
||||
|
||||
Point3d pos_;
|
||||
double yaw_;
|
||||
double pitch_;
|
||||
double roll_;
|
||||
|
||||
bool useLookAtParams_;
|
||||
|
||||
Point3d scale_;
|
||||
|
||||
Mat projectionMatrix_;
|
||||
|
||||
double fov_;
|
||||
double aspect_;
|
||||
|
||||
double left_;
|
||||
double right_;
|
||||
double bottom_;
|
||||
double top_;
|
||||
|
||||
double zNear_;
|
||||
double zFar_;
|
||||
|
||||
bool perspectiveProjection_;
|
||||
};
|
||||
|
||||
inline void GlBuffer::create(Size _size, int _type, Usage _usage) { create(_size.height, _size.width, _type, _usage); }
|
||||
inline void GlBuffer::create(int _rows, int _cols, int _type) { create(_rows, _cols, _type, usage()); }
|
||||
inline void GlBuffer::create(Size _size, int _type) { create(_size.height, _size.width, _type, usage()); }
|
||||
inline void GlTexture::create(Size _size, int _type) { create(_size.height, _size.width, _type); }
|
||||
|
||||
namespace gpu
|
||||
{
|
||||
//! set a CUDA device to use OpenGL interoperability
|
||||
CV_EXPORTS void setGlDevice(int device = 0);
|
||||
}
|
||||
} // namespace cv
|
||||
|
||||
#endif // __cplusplus
|
||||
|
@ -2616,20 +2616,20 @@ template<typename _Tp> inline void Ptr<_Tp>::delete_obj()
|
||||
|
||||
template<typename _Tp> inline Ptr<_Tp>::~Ptr() { release(); }
|
||||
|
||||
template<typename _Tp> inline Ptr<_Tp>::Ptr(const Ptr<_Tp>& ptr)
|
||||
template<typename _Tp> inline Ptr<_Tp>::Ptr(const Ptr<_Tp>& _ptr)
|
||||
{
|
||||
obj = ptr.obj;
|
||||
refcount = ptr.refcount;
|
||||
obj = _ptr.obj;
|
||||
refcount = _ptr.refcount;
|
||||
addref();
|
||||
}
|
||||
|
||||
template<typename _Tp> inline Ptr<_Tp>& Ptr<_Tp>::operator = (const Ptr<_Tp>& ptr)
|
||||
template<typename _Tp> inline Ptr<_Tp>& Ptr<_Tp>::operator = (const Ptr<_Tp>& _ptr)
|
||||
{
|
||||
int* _refcount = ptr.refcount;
|
||||
int* _refcount = _ptr.refcount;
|
||||
if( _refcount )
|
||||
CV_XADD(_refcount, 1);
|
||||
release();
|
||||
obj = ptr.obj;
|
||||
obj = _ptr.obj;
|
||||
refcount = _refcount;
|
||||
return *this;
|
||||
}
|
||||
@ -3593,10 +3593,10 @@ template<typename _Tp> inline Seq<_Tp>::operator vector<_Tp>() const
|
||||
template<typename _Tp> inline SeqIterator<_Tp>::SeqIterator()
|
||||
{ memset(this, 0, sizeof(*this)); }
|
||||
|
||||
template<typename _Tp> inline SeqIterator<_Tp>::SeqIterator(const Seq<_Tp>& seq, bool seekEnd)
|
||||
template<typename _Tp> inline SeqIterator<_Tp>::SeqIterator(const Seq<_Tp>& _seq, bool seekEnd)
|
||||
{
|
||||
cvStartReadSeq(seq.seq, this);
|
||||
index = seekEnd ? seq.seq->total : 0;
|
||||
cvStartReadSeq(_seq.seq, this);
|
||||
index = seekEnd ? _seq.seq->total : 0;
|
||||
}
|
||||
|
||||
template<typename _Tp> inline void SeqIterator<_Tp>::seek(size_t pos)
|
||||
@ -3842,17 +3842,17 @@ template<typename _Tp> inline Ptr<_Tp> Algorithm::create(const string& name)
|
||||
return _create(name).ptr<_Tp>();
|
||||
}
|
||||
|
||||
template<typename _Tp> inline typename ParamType<_Tp>::member_type Algorithm::get(const string& name) const
|
||||
template<typename _Tp> inline typename ParamType<_Tp>::member_type Algorithm::get(const string& _name) const
|
||||
{
|
||||
typename ParamType<_Tp>::member_type value;
|
||||
info()->get(this, name.c_str(), ParamType<_Tp>::type, &value);
|
||||
info()->get(this, _name.c_str(), ParamType<_Tp>::type, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
template<typename _Tp> inline typename ParamType<_Tp>::member_type Algorithm::get(const char* name) const
|
||||
template<typename _Tp> inline typename ParamType<_Tp>::member_type Algorithm::get(const char* _name) const
|
||||
{
|
||||
typename ParamType<_Tp>::member_type value;
|
||||
info()->get(this, name, ParamType<_Tp>::type, &value);
|
||||
info()->get(this, _name, ParamType<_Tp>::type, &value);
|
||||
return value;
|
||||
}
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
@ -46,7 +46,7 @@ namespace cv
|
||||
{
|
||||
|
||||
using std::pair;
|
||||
|
||||
|
||||
template<typename _KeyTp, typename _ValueTp> struct sorted_vector
|
||||
{
|
||||
sorted_vector() {}
|
||||
@ -54,7 +54,7 @@ template<typename _KeyTp, typename _ValueTp> struct sorted_vector
|
||||
size_t size() const { return vec.size(); }
|
||||
_ValueTp& operator [](size_t idx) { return vec[idx]; }
|
||||
const _ValueTp& operator [](size_t idx) const { return vec[idx]; }
|
||||
|
||||
|
||||
void add(const _KeyTp& k, const _ValueTp& val)
|
||||
{
|
||||
pair<_KeyTp, _ValueTp> p(k, val);
|
||||
@ -64,7 +64,7 @@ template<typename _KeyTp, typename _ValueTp> struct sorted_vector
|
||||
std::swap(vec[i-1], vec[i]);
|
||||
CV_Assert( i == 0 || vec[i].first != vec[i-1].first );
|
||||
}
|
||||
|
||||
|
||||
bool find(const _KeyTp& key, _ValueTp& value) const
|
||||
{
|
||||
size_t a = 0, b = vec.size();
|
||||
@ -76,7 +76,7 @@ template<typename _KeyTp, typename _ValueTp> struct sorted_vector
|
||||
else
|
||||
b = c;
|
||||
}
|
||||
|
||||
|
||||
if( a < vec.size() && vec[a].first == key )
|
||||
{
|
||||
value = vec[a].second;
|
||||
@ -84,26 +84,26 @@ template<typename _KeyTp, typename _ValueTp> struct sorted_vector
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void get_keys(vector<_KeyTp>& keys) const
|
||||
{
|
||||
size_t i = 0, n = vec.size();
|
||||
keys.resize(n);
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
keys[i] = vec[i].first;
|
||||
}
|
||||
|
||||
|
||||
vector<pair<_KeyTp, _ValueTp> > vec;
|
||||
};
|
||||
|
||||
|
||||
|
||||
template<typename _ValueTp> inline const _ValueTp* findstr(const sorted_vector<string, _ValueTp>& vec,
|
||||
const char* key)
|
||||
{
|
||||
if( !key )
|
||||
return 0;
|
||||
|
||||
|
||||
size_t a = 0, b = vec.vec.size();
|
||||
while( b > a )
|
||||
{
|
||||
@ -113,13 +113,13 @@ template<typename _ValueTp> inline const _ValueTp* findstr(const sorted_vector<s
|
||||
else
|
||||
b = c;
|
||||
}
|
||||
|
||||
|
||||
if( strcmp(vec.vec[a].first.c_str(), key) == 0 )
|
||||
return &vec.vec[a].second;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Param::Param()
|
||||
{
|
||||
type = 0;
|
||||
@ -129,7 +129,7 @@ Param::Param()
|
||||
setter = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Param::Param(int _type, bool _readonly, int _offset,
|
||||
Algorithm::Getter _getter, Algorithm::Setter _setter,
|
||||
const string& _help)
|
||||
@ -148,7 +148,7 @@ struct CV_EXPORTS AlgorithmInfoData
|
||||
string _name;
|
||||
};
|
||||
|
||||
|
||||
|
||||
static sorted_vector<string, Algorithm::Constructor>& alglist()
|
||||
{
|
||||
static sorted_vector<string, Algorithm::Constructor> alglist_var;
|
||||
@ -171,152 +171,152 @@ Ptr<Algorithm> Algorithm::_create(const string& name)
|
||||
Algorithm::Algorithm()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
Algorithm::~Algorithm()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
string Algorithm::name() const
|
||||
{
|
||||
return info()->name();
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, int value)
|
||||
|
||||
void Algorithm::set(const string& parameter, int value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<int>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<int>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, double value)
|
||||
void Algorithm::set(const string& parameter, double value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<double>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<double>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, bool value)
|
||||
void Algorithm::set(const string& parameter, bool value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<bool>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<bool>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, const string& value)
|
||||
void Algorithm::set(const string& parameter, const string& value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<string>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<string>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, const Mat& value)
|
||||
void Algorithm::set(const string& parameter, const Mat& value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<Mat>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<Mat>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, const vector<Mat>& value)
|
||||
void Algorithm::set(const string& parameter, const vector<Mat>& value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<vector<Mat> >::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const string& name, const Ptr<Algorithm>& value)
|
||||
{
|
||||
info()->set(this, name.c_str(), ParamType<Algorithm>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<vector<Mat> >::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, int value)
|
||||
void Algorithm::set(const string& parameter, const Ptr<Algorithm>& value)
|
||||
{
|
||||
info()->set(this, name, ParamType<int>::type, &value);
|
||||
info()->set(this, parameter.c_str(), ParamType<Algorithm>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, double value)
|
||||
void Algorithm::set(const char* parameter, int value)
|
||||
{
|
||||
info()->set(this, name, ParamType<double>::type, &value);
|
||||
info()->set(this, parameter, ParamType<int>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, bool value)
|
||||
void Algorithm::set(const char* parameter, double value)
|
||||
{
|
||||
info()->set(this, name, ParamType<bool>::type, &value);
|
||||
info()->set(this, parameter, ParamType<double>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, const string& value)
|
||||
void Algorithm::set(const char* parameter, bool value)
|
||||
{
|
||||
info()->set(this, name, ParamType<string>::type, &value);
|
||||
info()->set(this, parameter, ParamType<bool>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, const Mat& value)
|
||||
void Algorithm::set(const char* parameter, const string& value)
|
||||
{
|
||||
info()->set(this, name, ParamType<Mat>::type, &value);
|
||||
info()->set(this, parameter, ParamType<string>::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, const vector<Mat>& value)
|
||||
void Algorithm::set(const char* parameter, const Mat& value)
|
||||
{
|
||||
info()->set(this, name, ParamType<vector<Mat> >::type, &value);
|
||||
}
|
||||
|
||||
void Algorithm::set(const char* name, const Ptr<Algorithm>& value)
|
||||
{
|
||||
info()->set(this, name, ParamType<Algorithm>::type, &value);
|
||||
}
|
||||
|
||||
int Algorithm::getInt(const string& name) const
|
||||
{
|
||||
return get<int>(name);
|
||||
}
|
||||
|
||||
double Algorithm::getDouble(const string& name) const
|
||||
{
|
||||
return get<double>(name);
|
||||
info()->set(this, parameter, ParamType<Mat>::type, &value);
|
||||
}
|
||||
|
||||
bool Algorithm::getBool(const string& name) const
|
||||
void Algorithm::set(const char* parameter, const vector<Mat>& value)
|
||||
{
|
||||
return get<bool>(name);
|
||||
info()->set(this, parameter, ParamType<vector<Mat> >::type, &value);
|
||||
}
|
||||
|
||||
string Algorithm::getString(const string& name) const
|
||||
void Algorithm::set(const char* parameter, const Ptr<Algorithm>& value)
|
||||
{
|
||||
return get<string>(name);
|
||||
info()->set(this, parameter, ParamType<Algorithm>::type, &value);
|
||||
}
|
||||
|
||||
Mat Algorithm::getMat(const string& name) const
|
||||
int Algorithm::getInt(const string& parameter) const
|
||||
{
|
||||
return get<Mat>(name);
|
||||
return get<int>(parameter);
|
||||
}
|
||||
|
||||
vector<Mat> Algorithm::getMatVector(const string& name) const
|
||||
double Algorithm::getDouble(const string& parameter) const
|
||||
{
|
||||
return get<vector<Mat> >(name);
|
||||
return get<double>(parameter);
|
||||
}
|
||||
|
||||
Ptr<Algorithm> Algorithm::getAlgorithm(const string& name) const
|
||||
bool Algorithm::getBool(const string& parameter) const
|
||||
{
|
||||
return get<Algorithm>(name);
|
||||
}
|
||||
|
||||
string Algorithm::paramHelp(const string& name) const
|
||||
{
|
||||
return info()->paramHelp(name.c_str());
|
||||
}
|
||||
|
||||
int Algorithm::paramType(const string& name) const
|
||||
{
|
||||
return info()->paramType(name.c_str());
|
||||
return get<bool>(parameter);
|
||||
}
|
||||
|
||||
int Algorithm::paramType(const char* name) const
|
||||
string Algorithm::getString(const string& parameter) const
|
||||
{
|
||||
return info()->paramType(name);
|
||||
}
|
||||
|
||||
return get<string>(parameter);
|
||||
}
|
||||
|
||||
Mat Algorithm::getMat(const string& parameter) const
|
||||
{
|
||||
return get<Mat>(parameter);
|
||||
}
|
||||
|
||||
vector<Mat> Algorithm::getMatVector(const string& parameter) const
|
||||
{
|
||||
return get<vector<Mat> >(parameter);
|
||||
}
|
||||
|
||||
Ptr<Algorithm> Algorithm::getAlgorithm(const string& parameter) const
|
||||
{
|
||||
return get<Algorithm>(parameter);
|
||||
}
|
||||
|
||||
string Algorithm::paramHelp(const string& parameter) const
|
||||
{
|
||||
return info()->paramHelp(parameter.c_str());
|
||||
}
|
||||
|
||||
int Algorithm::paramType(const string& parameter) const
|
||||
{
|
||||
return info()->paramType(parameter.c_str());
|
||||
}
|
||||
|
||||
int Algorithm::paramType(const char* parameter) const
|
||||
{
|
||||
return info()->paramType(parameter);
|
||||
}
|
||||
|
||||
void Algorithm::getParams(vector<string>& names) const
|
||||
{
|
||||
info()->getParams(names);
|
||||
}
|
||||
|
||||
|
||||
void Algorithm::write(FileStorage& fs) const
|
||||
{
|
||||
info()->write(this, fs);
|
||||
}
|
||||
|
||||
|
||||
void Algorithm::read(const FileNode& fn)
|
||||
{
|
||||
info()->read(this, fn);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
AlgorithmInfo::AlgorithmInfo(const string& _name, Algorithm::Constructor create)
|
||||
{
|
||||
data = new AlgorithmInfoData;
|
||||
@ -327,8 +327,8 @@ AlgorithmInfo::AlgorithmInfo(const string& _name, Algorithm::Constructor create)
|
||||
AlgorithmInfo::~AlgorithmInfo()
|
||||
{
|
||||
delete data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void AlgorithmInfo::write(const Algorithm* algo, FileStorage& fs) const
|
||||
{
|
||||
size_t i = 0, nparams = data->params.vec.size();
|
||||
@ -364,7 +364,7 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const
|
||||
{
|
||||
size_t i = 0, nparams = data->params.vec.size();
|
||||
AlgorithmInfo* info = algo->info();
|
||||
|
||||
|
||||
for( i = 0; i < nparams; i++ )
|
||||
{
|
||||
const Param& p = data->params.vec[i].second;
|
||||
@ -414,13 +414,13 @@ void AlgorithmInfo::read(Algorithm* algo, const FileNode& fn) const
|
||||
else
|
||||
CV_Error( CV_StsUnsupportedFormat, "unknown/unsupported parameter type");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string AlgorithmInfo::name() const
|
||||
{
|
||||
return data->_name;
|
||||
}
|
||||
|
||||
|
||||
union GetSetParam
|
||||
{
|
||||
int (Algorithm::*get_int)() const;
|
||||
@ -430,7 +430,7 @@ union GetSetParam
|
||||
Mat (Algorithm::*get_mat)() const;
|
||||
vector<Mat> (Algorithm::*get_mat_vector)() const;
|
||||
Ptr<Algorithm> (Algorithm::*get_algo)() const;
|
||||
|
||||
|
||||
void (Algorithm::*set_int)(int);
|
||||
void (Algorithm::*set_bool)(bool);
|
||||
void (Algorithm::*set_double)(double);
|
||||
@ -440,15 +440,15 @@ union GetSetParam
|
||||
void (Algorithm::*set_algo)(const Ptr<Algorithm>&);
|
||||
};
|
||||
|
||||
void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const void* value, bool force) const
|
||||
void AlgorithmInfo::set(Algorithm* algo, const char* parameter, int argType, const void* value, bool force) const
|
||||
{
|
||||
const Param* p = findstr(data->params, name);
|
||||
const Param* p = findstr(data->params, parameter);
|
||||
|
||||
if( !p )
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") );
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", parameter ? parameter : "<NULL>") );
|
||||
|
||||
if( !force && p->readonly )
|
||||
CV_Error_( CV_StsError, ("Parameter '%s' is readonly", name));
|
||||
CV_Error_( CV_StsError, ("Parameter '%s' is readonly", parameter));
|
||||
|
||||
GetSetParam f;
|
||||
f.set_int = p->setter;
|
||||
@ -531,23 +531,23 @@ void AlgorithmInfo::set(Algorithm* algo, const char* name, int argType, const vo
|
||||
else
|
||||
CV_Error(CV_StsBadArg, "Unknown/unsupported parameter type");
|
||||
}
|
||||
|
||||
void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, void* value) const
|
||||
|
||||
void AlgorithmInfo::get(const Algorithm* algo, const char* parameter, int argType, void* value) const
|
||||
{
|
||||
const Param* p = findstr(data->params, name);
|
||||
const Param* p = findstr(data->params, parameter);
|
||||
if( !p )
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") );
|
||||
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", parameter ? parameter : "<NULL>") );
|
||||
|
||||
GetSetParam f;
|
||||
f.get_int = p->getter;
|
||||
|
||||
|
||||
if( argType == Param::INT || argType == Param::BOOLEAN || argType == Param::REAL )
|
||||
{
|
||||
if( p->type == Param::INT )
|
||||
{
|
||||
CV_Assert( argType == Param::INT || argType == Param::REAL );
|
||||
int val = p->getter ? (algo->*f.get_int)() : *(int*)((uchar*)algo + p->offset);
|
||||
|
||||
|
||||
if( argType == Param::INT )
|
||||
*(int*)value = val;
|
||||
else
|
||||
@ -557,7 +557,7 @@ void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, vo
|
||||
{
|
||||
CV_Assert( argType == Param::INT || argType == Param::BOOLEAN || argType == Param::REAL );
|
||||
bool val = p->getter ? (algo->*f.get_bool)() : *(bool*)((uchar*)algo + p->offset);
|
||||
|
||||
|
||||
if( argType == Param::INT )
|
||||
*(int*)value = (int)val;
|
||||
else if( argType == Param::BOOLEAN )
|
||||
@ -569,35 +569,35 @@ void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, vo
|
||||
{
|
||||
CV_Assert( argType == Param::REAL );
|
||||
double val = p->getter ? (algo->*f.get_double)() : *(double*)((uchar*)algo + p->offset);
|
||||
|
||||
|
||||
*(double*)value = val;
|
||||
}
|
||||
}
|
||||
else if( argType == Param::STRING )
|
||||
{
|
||||
CV_Assert( p->type == Param::STRING );
|
||||
|
||||
|
||||
*(string*)value = p->getter ? (algo->*f.get_string)() :
|
||||
*(string*)((uchar*)algo + p->offset);
|
||||
}
|
||||
else if( argType == Param::MAT )
|
||||
{
|
||||
CV_Assert( p->type == Param::MAT );
|
||||
|
||||
|
||||
*(Mat*)value = p->getter ? (algo->*f.get_mat)() :
|
||||
*(Mat*)((uchar*)algo + p->offset);
|
||||
}
|
||||
else if( argType == Param::MAT_VECTOR )
|
||||
{
|
||||
CV_Assert( p->type == Param::MAT_VECTOR );
|
||||
|
||||
|
||||
*(vector<Mat>*)value = p->getter ? (algo->*f.get_mat_vector)() :
|
||||
*(vector<Mat>*)((uchar*)algo + p->offset);
|
||||
}
|
||||
else if( argType == Param::ALGORITHM )
|
||||
{
|
||||
CV_Assert( p->type == Param::ALGORITHM );
|
||||
|
||||
|
||||
*(Ptr<Algorithm>*)value = p->getter ? (algo->*f.get_algo)() :
|
||||
*(Ptr<Algorithm>*)((uchar*)algo + p->offset);
|
||||
}
|
||||
@ -605,21 +605,21 @@ void AlgorithmInfo::get(const Algorithm* algo, const char* name, int argType, vo
|
||||
CV_Error(CV_StsBadArg, "Unknown/unsupported parameter type");
|
||||
}
|
||||
|
||||
|
||||
int AlgorithmInfo::paramType(const char* name) const
|
||||
|
||||
int AlgorithmInfo::paramType(const char* parameter) const
|
||||
{
|
||||
const Param* p = findstr(data->params, name);
|
||||
const Param* p = findstr(data->params, parameter);
|
||||
if( !p )
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") );
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", parameter ? parameter : "<NULL>") );
|
||||
return p->type;
|
||||
}
|
||||
|
||||
|
||||
string AlgorithmInfo::paramHelp(const char* name) const
|
||||
|
||||
|
||||
string AlgorithmInfo::paramHelp(const char* parameter) const
|
||||
{
|
||||
const Param* p = findstr(data->params, name);
|
||||
const Param* p = findstr(data->params, parameter);
|
||||
if( !p )
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", name ? name : "<NULL>") );
|
||||
CV_Error_( CV_StsBadArg, ("No parameter '%s' is found", parameter ? parameter : "<NULL>") );
|
||||
return p->help;
|
||||
}
|
||||
|
||||
@ -628,10 +628,10 @@ void AlgorithmInfo::getParams(vector<string>& names) const
|
||||
{
|
||||
data->params.get_keys(names);
|
||||
}
|
||||
|
||||
|
||||
void AlgorithmInfo::addParam_(Algorithm& algo, const char* name, int argType,
|
||||
void* value, bool readOnly,
|
||||
|
||||
|
||||
void AlgorithmInfo::addParam_(Algorithm& algo, const char* parameter, int argType,
|
||||
void* value, bool readOnly,
|
||||
Algorithm::Getter getter, Algorithm::Setter setter,
|
||||
const string& help)
|
||||
{
|
||||
@ -639,82 +639,82 @@ void AlgorithmInfo::addParam_(Algorithm& algo, const char* name, int argType,
|
||||
argType == Param::REAL || argType == Param::STRING ||
|
||||
argType == Param::MAT || argType == Param::MAT_VECTOR ||
|
||||
argType == Param::ALGORITHM );
|
||||
data->params.add(string(name), Param(argType, readOnly,
|
||||
data->params.add(string(parameter), Param(argType, readOnly,
|
||||
(int)((size_t)value - (size_t)(void*)&algo),
|
||||
getter, setter, help));
|
||||
}
|
||||
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
int& value, bool readOnly,
|
||||
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
int& value, bool readOnly,
|
||||
int (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(int),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<int>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<int>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
bool& value, bool readOnly,
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
bool& value, bool readOnly,
|
||||
int (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(int),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<bool>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<bool>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
double& value, bool readOnly,
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
double& value, bool readOnly,
|
||||
double (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(double),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<double>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<double>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
string& value, bool readOnly,
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
string& value, bool readOnly,
|
||||
string (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(const string&),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<string>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<string>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
Mat& value, bool readOnly,
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
Mat& value, bool readOnly,
|
||||
Mat (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(const Mat&),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<Mat>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<Mat>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
vector<Mat>& value, bool readOnly,
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
vector<Mat>& value, bool readOnly,
|
||||
vector<Mat> (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(const vector<Mat>&),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<vector<Mat> >::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<vector<Mat> >::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* name,
|
||||
Ptr<Algorithm>& value, bool readOnly,
|
||||
}
|
||||
|
||||
void AlgorithmInfo::addParam(Algorithm& algo, const char* parameter,
|
||||
Ptr<Algorithm>& value, bool readOnly,
|
||||
Ptr<Algorithm> (Algorithm::*getter)(),
|
||||
void (Algorithm::*setter)(const Ptr<Algorithm>&),
|
||||
const string& help)
|
||||
{
|
||||
addParam_(algo, name, ParamType<Algorithm>::type, &value, readOnly,
|
||||
addParam_(algo, parameter, ParamType<Algorithm>::type, &value, readOnly,
|
||||
(Algorithm::Getter)getter, (Algorithm::Setter)setter, help);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* End of file. */
|
||||
|
@ -88,7 +88,7 @@ split_( const T* src, T** dst, int len, int cn )
|
||||
dst2[i] = src[j+2]; dst3[i] = src[j+3];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( ; k < cn; k += 4 )
|
||||
{
|
||||
T *dst0 = dst[k], *dst1 = dst[k+1], *dst2 = dst[k+2], *dst3 = dst[k+3];
|
||||
@ -99,7 +99,7 @@ split_( const T* src, T** dst, int len, int cn )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<typename T> static void
|
||||
merge_( const T** src, T* dst, int len, int cn )
|
||||
{
|
||||
@ -139,7 +139,7 @@ merge_( const T** src, T* dst, int len, int cn )
|
||||
dst[j+2] = src2[i]; dst[j+3] = src3[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( ; k < cn; k += 4 )
|
||||
{
|
||||
const T *src0 = src[k], *src1 = src[k+1], *src2 = src[k+2], *src3 = src[k+3];
|
||||
@ -165,7 +165,7 @@ static void split32s(const int* src, int** dst, int len, int cn )
|
||||
{
|
||||
split_(src, dst, len, cn);
|
||||
}
|
||||
|
||||
|
||||
static void split64s(const int64* src, int64** dst, int len, int cn )
|
||||
{
|
||||
split_(src, dst, len, cn);
|
||||
@ -189,7 +189,7 @@ static void merge32s(const int** src, int* dst, int len, int cn )
|
||||
static void merge64s(const int64** src, int64* dst, int len, int cn )
|
||||
{
|
||||
merge_(src, dst, len, cn);
|
||||
}
|
||||
}
|
||||
|
||||
typedef void (*SplitFunc)(const uchar* src, uchar** dst, int len, int cn);
|
||||
typedef void (*MergeFunc)(const uchar** src, uchar* dst, int len, int cn);
|
||||
@ -205,9 +205,9 @@ static MergeFunc mergeTab[] =
|
||||
(MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge16u), (MergeFunc)GET_OPTIMIZED(merge16u),
|
||||
(MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge64s), 0
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void cv::split(const Mat& src, Mat* mv)
|
||||
{
|
||||
int k, depth = src.depth(), cn = src.channels();
|
||||
@ -219,30 +219,30 @@ void cv::split(const Mat& src, Mat* mv)
|
||||
|
||||
SplitFunc func = splitTab[depth];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
|
||||
int esz = (int)src.elemSize(), esz1 = (int)src.elemSize1();
|
||||
int blocksize0 = (BLOCK_SIZE + esz-1)/esz;
|
||||
AutoBuffer<uchar> _buf((cn+1)*(sizeof(Mat*) + sizeof(uchar*)) + 16);
|
||||
const Mat** arrays = (const Mat**)(uchar*)_buf;
|
||||
uchar** ptrs = (uchar**)alignPtr(arrays + cn + 1, 16);
|
||||
|
||||
|
||||
arrays[0] = &src;
|
||||
for( k = 0; k < cn; k++ )
|
||||
{
|
||||
mv[k].create(src.dims, src.size, depth);
|
||||
arrays[k+1] = &mv[k];
|
||||
}
|
||||
|
||||
|
||||
NAryMatIterator it(arrays, ptrs, cn+1);
|
||||
int total = (int)it.size, blocksize = cn <= 4 ? total : std::min(total, blocksize0);
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
for( int j = 0; j < total; j += blocksize )
|
||||
{
|
||||
int bsz = std::min(total - j, blocksize);
|
||||
func( ptrs[0], &ptrs[1], bsz, cn );
|
||||
|
||||
|
||||
if( j + blocksize < total )
|
||||
{
|
||||
ptrs[0] += bsz*esz;
|
||||
@ -252,7 +252,7 @@ void cv::split(const Mat& src, Mat* mv)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void cv::split(InputArray _m, OutputArrayOfArrays _mv)
|
||||
{
|
||||
Mat m = _m.getMat();
|
||||
@ -266,38 +266,38 @@ void cv::split(InputArray _m, OutputArrayOfArrays _mv)
|
||||
Mat* dst = &_mv.getMatRef(0);
|
||||
split(m, dst);
|
||||
}
|
||||
|
||||
|
||||
void cv::merge(const Mat* mv, size_t n, OutputArray _dst)
|
||||
{
|
||||
CV_Assert( mv && n > 0 );
|
||||
|
||||
|
||||
int depth = mv[0].depth();
|
||||
bool allch1 = true;
|
||||
int k, cn = 0;
|
||||
size_t i;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
CV_Assert(mv[i].size == mv[0].size && mv[i].depth() == depth);
|
||||
allch1 = allch1 && mv[i].channels() == 1;
|
||||
cn += mv[i].channels();
|
||||
}
|
||||
|
||||
|
||||
CV_Assert( 0 < cn && cn <= CV_CN_MAX );
|
||||
_dst.create(mv[0].dims, mv[0].size, CV_MAKETYPE(depth, cn));
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
if( n == 1 )
|
||||
{
|
||||
mv[0].copyTo(dst);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( !allch1 )
|
||||
{
|
||||
AutoBuffer<int> pairs(cn*2);
|
||||
int j, ni=0;
|
||||
|
||||
|
||||
for( i = 0, j = 0; i < n; i++, j += ni )
|
||||
{
|
||||
ni = mv[i].channels();
|
||||
@ -310,33 +310,33 @@ void cv::merge(const Mat* mv, size_t n, OutputArray _dst)
|
||||
mixChannels( mv, n, &dst, 1, &pairs[0], cn );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
size_t esz = dst.elemSize(), esz1 = dst.elemSize1();
|
||||
int blocksize0 = (int)((BLOCK_SIZE + esz-1)/esz);
|
||||
AutoBuffer<uchar> _buf((cn+1)*(sizeof(Mat*) + sizeof(uchar*)) + 16);
|
||||
const Mat** arrays = (const Mat**)(uchar*)_buf;
|
||||
uchar** ptrs = (uchar**)alignPtr(arrays + cn + 1, 16);
|
||||
|
||||
|
||||
arrays[0] = &dst;
|
||||
for( k = 0; k < cn; k++ )
|
||||
arrays[k+1] = &mv[k];
|
||||
|
||||
|
||||
NAryMatIterator it(arrays, ptrs, cn+1);
|
||||
int total = (int)it.size, blocksize = cn <= 4 ? total : std::min(total, blocksize0);
|
||||
MergeFunc func = mergeTab[depth];
|
||||
|
||||
|
||||
for( i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
for( int j = 0; j < total; j += blocksize )
|
||||
{
|
||||
int bsz = std::min(total - j, blocksize);
|
||||
func( (const uchar**)&ptrs[1], ptrs[0], bsz, cn );
|
||||
|
||||
|
||||
if( j + blocksize < total )
|
||||
{
|
||||
ptrs[0] += bsz*esz;
|
||||
for( int k = 0; k < cn; k++ )
|
||||
ptrs[k+1] += bsz*esz1;
|
||||
for( int t = 0; t < cn; t++ )
|
||||
ptrs[t+1] += bsz*esz1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -347,7 +347,7 @@ void cv::merge(InputArrayOfArrays _mv, OutputArray _dst)
|
||||
vector<Mat> mv;
|
||||
_mv.getMatVector(mv);
|
||||
merge(!mv.empty() ? &mv[0] : 0, mv.size(), _dst);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************************\
|
||||
* Generalized split/merge: mixing channels *
|
||||
@ -387,7 +387,7 @@ mixChannels_( const T** src, const int* sdelta,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void mixChannels8u( const uchar** src, const int* sdelta,
|
||||
uchar** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
@ -408,14 +408,14 @@ static void mixChannels32s( const int** src, const int* sdelta,
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
|
||||
static void mixChannels64s( const int64** src, const int* sdelta,
|
||||
int64** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
|
||||
typedef void (*MixChannelsFunc)( const uchar** src, const int* sdelta,
|
||||
uchar** dst, const int* ddelta, int len, int npairs );
|
||||
|
||||
@ -423,17 +423,17 @@ static MixChannelsFunc mixchTab[] =
|
||||
{
|
||||
(MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels16u,
|
||||
(MixChannelsFunc)mixChannels16u, (MixChannelsFunc)mixChannels32s, (MixChannelsFunc)mixChannels32s,
|
||||
(MixChannelsFunc)mixChannels64s, 0
|
||||
(MixChannelsFunc)mixChannels64s, 0
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs )
|
||||
{
|
||||
if( npairs == 0 )
|
||||
return;
|
||||
CV_Assert( src && nsrcs > 0 && dst && ndsts > 0 && fromTo && npairs > 0 );
|
||||
|
||||
|
||||
size_t i, j, k, esz1 = dst[0].elemSize1();
|
||||
int depth = dst[0].depth();
|
||||
|
||||
@ -444,13 +444,13 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
uchar** dsts = (uchar**)(srcs + npairs);
|
||||
int* tab = (int*)(dsts + npairs);
|
||||
int *sdelta = (int*)(tab + npairs*4), *ddelta = sdelta + npairs;
|
||||
|
||||
|
||||
for( i = 0; i < nsrcs; i++ )
|
||||
arrays[i] = &src[i];
|
||||
for( i = 0; i < ndsts; i++ )
|
||||
arrays[i + nsrcs] = &dst[i];
|
||||
ptrs[nsrcs + ndsts] = 0;
|
||||
|
||||
|
||||
for( i = 0; i < npairs; i++ )
|
||||
{
|
||||
int i0 = fromTo[i*2], i1 = fromTo[i*2+1];
|
||||
@ -468,7 +468,7 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
tab[i*4] = (int)(nsrcs + ndsts); tab[i*4+1] = 0;
|
||||
sdelta[i] = 0;
|
||||
}
|
||||
|
||||
|
||||
for( j = 0; j < ndsts; i1 -= dst[j].channels(), j++ )
|
||||
if( i1 < dst[j].channels() )
|
||||
break;
|
||||
@ -480,7 +480,7 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
NAryMatIterator it(arrays, ptrs, (int)(nsrcs + ndsts));
|
||||
int total = (int)it.size, blocksize = std::min(total, (int)((BLOCK_SIZE + esz1-1)/esz1));
|
||||
MixChannelsFunc func = mixchTab[depth];
|
||||
|
||||
|
||||
for( i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
for( k = 0; k < npairs; k++ )
|
||||
@ -488,13 +488,13 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
srcs[k] = ptrs[tab[k*4]] + tab[k*4+1];
|
||||
dsts[k] = ptrs[tab[k*4+2]] + tab[k*4+3];
|
||||
}
|
||||
|
||||
for( int j = 0; j < total; j += blocksize )
|
||||
|
||||
for( int t = 0; t < total; t += blocksize )
|
||||
{
|
||||
int bsz = std::min(total - j, blocksize);
|
||||
int bsz = std::min(total - t, blocksize);
|
||||
func( srcs, sdelta, dsts, ddelta, bsz, (int)npairs );
|
||||
|
||||
if( j + blocksize < total )
|
||||
|
||||
if( t + blocksize < total )
|
||||
for( k = 0; k < npairs; k++ )
|
||||
{
|
||||
srcs[k] += blocksize*sdelta[k]*esz1;
|
||||
@ -524,7 +524,7 @@ void cv::mixChannels(InputArrayOfArrays src, InputArrayOfArrays dst,
|
||||
int i;
|
||||
int nsrc = src_is_mat ? 1 : (int)src.total();
|
||||
int ndst = dst_is_mat ? 1 : (int)dst.total();
|
||||
|
||||
|
||||
CV_Assert(fromTo.size()%2 == 0 && nsrc > 0 && ndst > 0);
|
||||
cv::AutoBuffer<Mat> _buf(nsrc + ndst);
|
||||
Mat* buf = _buf;
|
||||
@ -568,7 +568,7 @@ cvtScaleAbs_( const T* src, size_t sstep,
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
{
|
||||
int x = 0;
|
||||
@ -583,11 +583,11 @@ cvtScaleAbs_( const T* src, size_t sstep,
|
||||
t1 = saturate_cast<DT>(std::abs(src[x+3]*scale + shift));
|
||||
dst[x+2] = t0; dst[x+3] = t1;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = saturate_cast<DT>(std::abs(src[x]*scale + shift));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<typename T, typename DT, typename WT> static void
|
||||
@ -597,7 +597,7 @@ cvtScale_( const T* src, size_t sstep,
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
{
|
||||
int x = 0;
|
||||
@ -623,38 +623,38 @@ cvtScale_( const T* src, size_t sstep,
|
||||
template<> void
|
||||
cvtScale_<short, short, float>( const short* src, size_t sstep,
|
||||
short* dst, size_t dstep, Size size,
|
||||
float scale, float shift )
|
||||
float scale, float shift )
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_SSE2
|
||||
if(USE_SSE2)
|
||||
#if CV_SSE2
|
||||
if(USE_SSE2)
|
||||
{
|
||||
__m128 scale128 = _mm_set1_ps (scale);
|
||||
__m128 shift128 = _mm_set1_ps (shift);
|
||||
for(; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m128i r0 = _mm_loadl_epi64((const __m128i*)(src + x));
|
||||
for(; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m128i r0 = _mm_loadl_epi64((const __m128i*)(src + x));
|
||||
__m128i r1 = _mm_loadl_epi64((const __m128i*)(src + x + 4));
|
||||
__m128 rf0 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r0, r0), 16));
|
||||
__m128 rf0 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r0, r0), 16));
|
||||
__m128 rf1 =_mm_cvtepi32_ps(_mm_srai_epi32(_mm_unpacklo_epi16(r1, r1), 16));
|
||||
rf0 = _mm_add_ps(_mm_mul_ps(rf0, scale128), shift128);
|
||||
rf1 = _mm_add_ps(_mm_mul_ps(rf1, scale128), shift128);
|
||||
r0 = _mm_cvtps_epi32(rf0);
|
||||
r1 = _mm_cvtps_epi32(rf1);
|
||||
r0 = _mm_packs_epi32(r0, r1);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r0);
|
||||
}
|
||||
}
|
||||
r0 = _mm_cvtps_epi32(rf0);
|
||||
r1 = _mm_cvtps_epi32(rf1);
|
||||
r0 = _mm_packs_epi32(r0, r1);
|
||||
_mm_storeu_si128((__m128i*)(dst + x), r0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
for(; x < size.width; x++ )
|
||||
dst[x] = saturate_cast<short>(src[x]*scale + shift);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -664,21 +664,21 @@ cvt_( const T* src, size_t sstep,
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
DT t0, t1;
|
||||
t0 = saturate_cast<DT>(src[x]);
|
||||
t1 = saturate_cast<DT>(src[x+1]);
|
||||
dst[x] = t0; dst[x+1] = t1;
|
||||
t0 = saturate_cast<DT>(src[x+2]);
|
||||
t1 = saturate_cast<DT>(src[x+3]);
|
||||
dst[x+2] = t0; dst[x+3] = t1;
|
||||
}
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
DT t0, t1;
|
||||
t0 = saturate_cast<DT>(src[x]);
|
||||
t1 = saturate_cast<DT>(src[x+1]);
|
||||
dst[x] = t0; dst[x+1] = t1;
|
||||
t0 = saturate_cast<DT>(src[x+2]);
|
||||
t1 = saturate_cast<DT>(src[x+3]);
|
||||
dst[x+2] = t0; dst[x+3] = t1;
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = saturate_cast<DT>(src[x]);
|
||||
@ -692,24 +692,24 @@ cvt_<float, short>( const float* src, size_t sstep,
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
{
|
||||
int x = 0;
|
||||
#if CV_SSE2
|
||||
if(USE_SSE2){
|
||||
for( ; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m128 src128 = _mm_loadu_ps (src + x);
|
||||
__m128i src_int128 = _mm_cvtps_epi32 (src128);
|
||||
|
||||
src128 = _mm_loadu_ps (src + x + 4);
|
||||
__m128i src1_int128 = _mm_cvtps_epi32 (src128);
|
||||
|
||||
src1_int128 = _mm_packs_epi32(src_int128, src1_int128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x),src1_int128);
|
||||
}
|
||||
}
|
||||
#if CV_SSE2
|
||||
if(USE_SSE2){
|
||||
for( ; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m128 src128 = _mm_loadu_ps (src + x);
|
||||
__m128i src_int128 = _mm_cvtps_epi32 (src128);
|
||||
|
||||
src128 = _mm_loadu_ps (src + x + 4);
|
||||
__m128i src1_int128 = _mm_cvtps_epi32 (src128);
|
||||
|
||||
src1_int128 = _mm_packs_epi32(src_int128, src1_int128);
|
||||
_mm_storeu_si128((__m128i*)(dst + x),src1_int128);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for( ; x < size.width; x++ )
|
||||
dst[x] = saturate_cast<short>(src[x]);
|
||||
@ -723,11 +723,11 @@ cpy_( const T* src, size_t sstep, T* dst, size_t dstep, Size size )
|
||||
{
|
||||
sstep /= sizeof(src[0]);
|
||||
dstep /= sizeof(dst[0]);
|
||||
|
||||
|
||||
for( ; size.height--; src += sstep, dst += dstep )
|
||||
memcpy(dst, src, size.width*sizeof(src[0]));
|
||||
}
|
||||
|
||||
|
||||
#define DEF_CVT_SCALE_ABS_FUNC(suffix, tfunc, stype, dtype, wtype) \
|
||||
static void cvtScaleAbs##suffix( const stype* src, size_t sstep, const uchar*, size_t, \
|
||||
dtype* dst, size_t dstep, Size size, double* scale) \
|
||||
@ -741,8 +741,8 @@ dtype* dst, size_t dstep, Size size, double* scale) \
|
||||
{ \
|
||||
cvtScale_(src, sstep, dst, dstep, size, (wtype)scale[0], (wtype)scale[1]); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#define DEF_CVT_FUNC(suffix, stype, dtype) \
|
||||
static void cvt##suffix( const stype* src, size_t sstep, const uchar*, size_t, \
|
||||
dtype* dst, size_t dstep, Size size, double*) \
|
||||
@ -756,15 +756,15 @@ stype* dst, size_t dstep, Size size, double*) \
|
||||
{ \
|
||||
cpy_(src, sstep, dst, dstep, size); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
DEF_CVT_SCALE_ABS_FUNC(8u, cvtScaleAbs_, uchar, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(8s8u, cvtScaleAbs_, schar, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(16u8u, cvtScaleAbs_, ushort, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(16s8u, cvtScaleAbs_, short, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(32s8u, cvtScaleAbs_, int, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(32f8u, cvtScaleAbs_, float, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(64f8u, cvtScaleAbs_, double, uchar, float);
|
||||
DEF_CVT_SCALE_ABS_FUNC(64f8u, cvtScaleAbs_, double, uchar, float);
|
||||
|
||||
DEF_CVT_SCALE_FUNC(8u, uchar, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(8s8u, schar, uchar, float);
|
||||
@ -772,7 +772,7 @@ DEF_CVT_SCALE_FUNC(16u8u, ushort, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(16s8u, short, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(32s8u, int, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(32f8u, float, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(64f8u, double, uchar, float);
|
||||
DEF_CVT_SCALE_FUNC(64f8u, double, uchar, float);
|
||||
|
||||
DEF_CVT_SCALE_FUNC(8u8s, uchar, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(8s, schar, schar, float);
|
||||
@ -780,7 +780,7 @@ DEF_CVT_SCALE_FUNC(16u8s, ushort, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(16s8s, short, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(32s8s, int, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(32f8s, float, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(64f8s, double, schar, float);
|
||||
DEF_CVT_SCALE_FUNC(64f8s, double, schar, float);
|
||||
|
||||
DEF_CVT_SCALE_FUNC(8u16u, uchar, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(8s16u, schar, ushort, float);
|
||||
@ -788,7 +788,7 @@ DEF_CVT_SCALE_FUNC(16u, ushort, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(16s16u, short, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(32s16u, int, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(32f16u, float, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(64f16u, double, ushort, float);
|
||||
DEF_CVT_SCALE_FUNC(64f16u, double, ushort, float);
|
||||
|
||||
DEF_CVT_SCALE_FUNC(8u16s, uchar, short, float);
|
||||
DEF_CVT_SCALE_FUNC(8s16s, schar, short, float);
|
||||
@ -797,7 +797,7 @@ DEF_CVT_SCALE_FUNC(16s, short, short, float);
|
||||
DEF_CVT_SCALE_FUNC(32s16s, int, short, float);
|
||||
DEF_CVT_SCALE_FUNC(32f16s, float, short, float);
|
||||
DEF_CVT_SCALE_FUNC(64f16s, double, short, float);
|
||||
|
||||
|
||||
DEF_CVT_SCALE_FUNC(8u32s, uchar, int, float);
|
||||
DEF_CVT_SCALE_FUNC(8s32s, schar, int, float);
|
||||
DEF_CVT_SCALE_FUNC(16u32s, ushort, int, float);
|
||||
@ -874,7 +874,7 @@ DEF_CVT_FUNC(16s64f, short, double);
|
||||
DEF_CVT_FUNC(32s64f, int, double);
|
||||
DEF_CVT_FUNC(32f64f, float, double);
|
||||
DEF_CPY_FUNC(64s, int64);
|
||||
|
||||
|
||||
static BinaryFunc cvtScaleAbsTab[] =
|
||||
{
|
||||
(BinaryFunc)cvtScaleAbs8u, (BinaryFunc)cvtScaleAbs8s8u, (BinaryFunc)cvtScaleAbs16u8u,
|
||||
@ -965,7 +965,7 @@ static BinaryFunc cvtTab[][8] =
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
BinaryFunc getConvertFunc(int sdepth, int ddepth)
|
||||
{
|
||||
return cvtTab[CV_MAT_DEPTH(ddepth)][CV_MAT_DEPTH(sdepth)];
|
||||
@ -974,10 +974,10 @@ BinaryFunc getConvertFunc(int sdepth, int ddepth)
|
||||
BinaryFunc getConvertScaleFunc(int sdepth, int ddepth)
|
||||
{
|
||||
return cvtScaleTab[CV_MAT_DEPTH(ddepth)][CV_MAT_DEPTH(sdepth)];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void cv::convertScaleAbs( InputArray _src, OutputArray _dst, double alpha, double beta )
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
@ -987,7 +987,7 @@ void cv::convertScaleAbs( InputArray _src, OutputArray _dst, double alpha, doubl
|
||||
Mat dst = _dst.getMat();
|
||||
BinaryFunc func = cvtScaleAbsTab[src.depth()];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
|
||||
if( src.dims <= 2 )
|
||||
{
|
||||
Size sz = getContinuousSize(src, dst, cn);
|
||||
@ -999,7 +999,7 @@ void cv::convertScaleAbs( InputArray _src, OutputArray _dst, double alpha, doubl
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs);
|
||||
Size sz((int)it.size*cn, 1);
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
func( ptrs[0], 0, 0, 0, ptrs[1], 0, sz, scale );
|
||||
}
|
||||
@ -1022,12 +1022,12 @@ void cv::Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta)
|
||||
}
|
||||
|
||||
Mat src = *this;
|
||||
|
||||
|
||||
BinaryFunc func = noScale ? getConvertFunc(sdepth, ddepth) : getConvertScaleFunc(sdepth, ddepth);
|
||||
double scale[] = {alpha, beta};
|
||||
int cn = channels();
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
|
||||
if( dims <= 2 )
|
||||
{
|
||||
_dst.create( size(), _type );
|
||||
@ -1043,7 +1043,7 @@ void cv::Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta)
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs);
|
||||
Size sz((int)(it.size*cn), 1);
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
func(ptrs[0], 0, 0, 0, ptrs[1], 0, sz, scale);
|
||||
}
|
||||
@ -1105,10 +1105,10 @@ static void LUT8u_32f( const uchar* src, const float* lut, float* dst, int len,
|
||||
static void LUT8u_64f( const uchar* src, const double* lut, double* dst, int len, int cn, int lutcn )
|
||||
{
|
||||
LUT8u_( src, lut, dst, len, cn, lutcn );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
typedef void (*LUTFunc)( const uchar* src, const uchar* lut, uchar* dst, int len, int cn, int lutcn );
|
||||
|
||||
|
||||
static LUTFunc lutTab[] =
|
||||
{
|
||||
(LUTFunc)LUT8u_8u, (LUTFunc)LUT8u_8s, (LUTFunc)LUT8u_16u, (LUTFunc)LUT8u_16s,
|
||||
@ -1116,7 +1116,7 @@ static LUTFunc lutTab[] =
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
void cv::LUT( InputArray _src, InputArray _lut, OutputArray _dst, int interpolation )
|
||||
{
|
||||
Mat src = _src.getMat(), lut = _lut.getMat();
|
||||
@ -1132,12 +1132,12 @@ void cv::LUT( InputArray _src, InputArray _lut, OutputArray _dst, int interpolat
|
||||
|
||||
LUTFunc func = lutTab[lut.depth()];
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
|
||||
const Mat* arrays[] = {&src, &dst, 0};
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs);
|
||||
int len = (int)it.size;
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
func(ptrs[0], lut.data, ptrs[1], len, cn, lutcn);
|
||||
}
|
||||
@ -1147,7 +1147,7 @@ void cv::normalize( InputArray _src, OutputArray _dst, double a, double b,
|
||||
int norm_type, int rtype, InputArray _mask )
|
||||
{
|
||||
Mat src = _src.getMat(), mask = _mask.getMat();
|
||||
|
||||
|
||||
double scale = 1, shift = 0;
|
||||
if( norm_type == CV_MINMAX )
|
||||
{
|
||||
@ -1165,13 +1165,13 @@ void cv::normalize( InputArray _src, OutputArray _dst, double a, double b,
|
||||
}
|
||||
else
|
||||
CV_Error( CV_StsBadArg, "Unknown/unsupported norm type" );
|
||||
|
||||
|
||||
if( rtype < 0 )
|
||||
rtype = _dst.fixedType() ? _dst.depth() : src.depth();
|
||||
|
||||
|
||||
_dst.create(src.dims, src.size, CV_MAKETYPE(rtype, src.channels()));
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
if( !mask.data )
|
||||
src.convertTo( dst, rtype, scale, shift );
|
||||
else
|
||||
@ -1282,7 +1282,7 @@ cvConvertScale( const void* srcarr, void* dstarr,
|
||||
double scale, double shift )
|
||||
{
|
||||
cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);
|
||||
|
||||
|
||||
CV_Assert( src.size == dst.size && src.channels() == dst.channels() );
|
||||
src.convertTo(dst, dst.type(), scale, shift);
|
||||
}
|
||||
|
@ -59,7 +59,7 @@ copyMask_(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep, ucha
|
||||
const T* src = (const T*)_src;
|
||||
T* dst = (T*)_dst;
|
||||
int x = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; x <= size.width - 4; x += 4 )
|
||||
{
|
||||
if( mask[x] )
|
||||
@ -96,16 +96,16 @@ copyMaskGeneric(const uchar* _src, size_t sstep, const uchar* mask, size_t mstep
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#define DEF_COPY_MASK(suffix, type) \
|
||||
static void copyMask##suffix(const uchar* src, size_t sstep, const uchar* mask, size_t mstep, \
|
||||
uchar* dst, size_t dstep, Size size, void*) \
|
||||
{ \
|
||||
copyMask_<type>(src, sstep, mask, mstep, dst, dstep, size); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
DEF_COPY_MASK(8u, uchar);
|
||||
DEF_COPY_MASK(16u, ushort);
|
||||
DEF_COPY_MASK(8uC3, Vec3b);
|
||||
@ -116,7 +116,7 @@ DEF_COPY_MASK(32sC3, Vec3i);
|
||||
DEF_COPY_MASK(32sC4, Vec4i);
|
||||
DEF_COPY_MASK(32sC6, Vec6i);
|
||||
DEF_COPY_MASK(32sC8, Vec8i);
|
||||
|
||||
|
||||
BinaryFunc copyMaskTab[] =
|
||||
{
|
||||
0,
|
||||
@ -137,7 +137,7 @@ BinaryFunc copyMaskTab[] =
|
||||
0, 0, 0, 0, 0, 0, 0,
|
||||
copyMask32sC8
|
||||
};
|
||||
|
||||
|
||||
BinaryFunc getCopyMaskFunc(size_t esz)
|
||||
{
|
||||
return esz <= 32 && copyMaskTab[esz] ? copyMaskTab[esz] : copyMaskGeneric;
|
||||
@ -152,51 +152,51 @@ void Mat::copyTo( OutputArray _dst ) const
|
||||
convertTo( _dst, dtype );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( empty() )
|
||||
{
|
||||
_dst.release();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( dims <= 2 )
|
||||
{
|
||||
_dst.create( rows, cols, type() );
|
||||
Mat dst = _dst.getMat();
|
||||
if( data == dst.data )
|
||||
return;
|
||||
|
||||
|
||||
if( rows > 0 && cols > 0 )
|
||||
{
|
||||
const uchar* sptr = data;
|
||||
uchar* dptr = dst.data;
|
||||
|
||||
|
||||
// to handle the copying 1xn matrix => nx1 std vector.
|
||||
Size sz = size() == dst.size() ?
|
||||
getContinuousSize(*this, dst) :
|
||||
getContinuousSize(*this);
|
||||
size_t len = sz.width*elemSize();
|
||||
|
||||
|
||||
for( ; sz.height--; sptr += step, dptr += dst.step )
|
||||
memcpy( dptr, sptr, len );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
_dst.create( dims, size, type() );
|
||||
Mat dst = _dst.getMat();
|
||||
if( data == dst.data )
|
||||
return;
|
||||
|
||||
|
||||
if( total() != 0 )
|
||||
{
|
||||
const Mat* arrays[] = { this, &dst };
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs, 2);
|
||||
size_t size = it.size*elemSize();
|
||||
|
||||
size_t sz = it.size*elemSize();
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
memcpy(ptrs[1], ptrs[0], size);
|
||||
memcpy(ptrs[1], ptrs[0], sz);
|
||||
}
|
||||
}
|
||||
|
||||
@ -208,33 +208,33 @@ void Mat::copyTo( OutputArray _dst, InputArray _mask ) const
|
||||
copyTo(_dst);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int cn = channels(), mcn = mask.channels();
|
||||
CV_Assert( mask.depth() == CV_8U && (mcn == 1 || mcn == cn) );
|
||||
bool colorMask = mcn > 1;
|
||||
|
||||
|
||||
size_t esz = colorMask ? elemSize1() : elemSize();
|
||||
BinaryFunc copymask = getCopyMaskFunc(esz);
|
||||
|
||||
|
||||
uchar* data0 = _dst.getMat().data;
|
||||
_dst.create( dims, size, type() );
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
if( dst.data != data0 ) // do not leave dst uninitialized
|
||||
dst = Scalar(0);
|
||||
|
||||
|
||||
if( dims <= 2 )
|
||||
{
|
||||
Size sz = getContinuousSize(*this, dst, mask, mcn);
|
||||
copymask(data, step, mask.data, mask.step, dst.data, dst.step, sz, &esz);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const Mat* arrays[] = { this, &dst, &mask, 0 };
|
||||
uchar* ptrs[3];
|
||||
NAryMatIterator it(arrays, ptrs);
|
||||
Size sz((int)(it.size*mcn), 1);
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
copymask(ptrs[0], 0, ptrs[2], 0, ptrs[1], 0, sz, &esz);
|
||||
}
|
||||
@ -242,14 +242,14 @@ void Mat::copyTo( OutputArray _dst, InputArray _mask ) const
|
||||
Mat& Mat::operator = (const Scalar& s)
|
||||
{
|
||||
const Mat* arrays[] = { this };
|
||||
uchar* ptr;
|
||||
NAryMatIterator it(arrays, &ptr, 1);
|
||||
size_t size = it.size*elemSize();
|
||||
|
||||
uchar* dptr;
|
||||
NAryMatIterator it(arrays, &dptr, 1);
|
||||
size_t elsize = it.size*elemSize();
|
||||
|
||||
if( s[0] == 0 && s[1] == 0 && s[2] == 0 && s[3] == 0 )
|
||||
{
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
memset( ptr, 0, size );
|
||||
memset( dptr, 0, elsize );
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -258,50 +258,50 @@ Mat& Mat::operator = (const Scalar& s)
|
||||
double scalar[12];
|
||||
scalarToRawData(s, scalar, type(), 12);
|
||||
size_t blockSize = 12*elemSize1();
|
||||
|
||||
for( size_t j = 0; j < size; j += blockSize )
|
||||
|
||||
for( size_t j = 0; j < elsize; j += blockSize )
|
||||
{
|
||||
size_t sz = MIN(blockSize, size - j);
|
||||
memcpy( ptr + j, scalar, sz );
|
||||
size_t sz = MIN(blockSize, elsize - j);
|
||||
memcpy( dptr + j, scalar, sz );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( size_t i = 1; i < it.nplanes; i++ )
|
||||
{
|
||||
++it;
|
||||
memcpy( ptr, data, size );
|
||||
memcpy( dptr, data, elsize );
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Mat& Mat::setTo(InputArray _value, InputArray _mask)
|
||||
{
|
||||
if( !data )
|
||||
return *this;
|
||||
|
||||
|
||||
Mat value = _value.getMat(), mask = _mask.getMat();
|
||||
|
||||
|
||||
CV_Assert( checkScalar(value, type(), _value.kind(), _InputArray::MAT ));
|
||||
CV_Assert( mask.empty() || mask.type() == CV_8U );
|
||||
|
||||
|
||||
size_t esz = elemSize();
|
||||
BinaryFunc copymask = getCopyMaskFunc(esz);
|
||||
|
||||
|
||||
const Mat* arrays[] = { this, !mask.empty() ? &mask : 0, 0 };
|
||||
uchar* ptrs[2]={0,0};
|
||||
NAryMatIterator it(arrays, ptrs);
|
||||
int total = (int)it.size, blockSize0 = std::min(total, (int)((BLOCK_SIZE + esz-1)/esz));
|
||||
int totalsz = (int)it.size, blockSize0 = std::min(totalsz, (int)((BLOCK_SIZE + esz-1)/esz));
|
||||
AutoBuffer<uchar> _scbuf(blockSize0*esz + 32);
|
||||
uchar* scbuf = alignPtr((uchar*)_scbuf, (int)sizeof(double));
|
||||
convertAndUnrollScalar( value, type(), scbuf, blockSize0 );
|
||||
|
||||
|
||||
for( size_t i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
for( int j = 0; j < total; j += blockSize0 )
|
||||
for( int j = 0; j < totalsz; j += blockSize0 )
|
||||
{
|
||||
Size sz(std::min(blockSize0, total - j), 1);
|
||||
Size sz(std::min(blockSize0, totalsz - j), 1);
|
||||
size_t blockSize = sz.width*esz;
|
||||
if( ptrs[1] )
|
||||
{
|
||||
@ -323,7 +323,7 @@ flipHoriz( const uchar* src, size_t sstep, uchar* dst, size_t dstep, Size size,
|
||||
int i, j, limit = (int)(((size.width + 1)/2)*esz);
|
||||
AutoBuffer<int> _tab(size.width*esz);
|
||||
int* tab = _tab;
|
||||
|
||||
|
||||
for( i = 0; i < size.width; i++ )
|
||||
for( size_t k = 0; k < esz; k++ )
|
||||
tab[i*esz + k] = (int)((size.width - i - 1)*esz + k);
|
||||
@ -403,7 +403,7 @@ flipVert( const uchar* src0, size_t sstep, uchar* dst0, size_t dstep, Size size,
|
||||
void flip( InputArray _src, OutputArray _dst, int flip_mode )
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
|
||||
|
||||
CV_Assert( src.dims <= 2 );
|
||||
_dst.create( src.size(), src.type() );
|
||||
Mat dst = _dst.getMat();
|
||||
@ -413,7 +413,7 @@ void flip( InputArray _src, OutputArray _dst, int flip_mode )
|
||||
flipVert( src.data, src.step, dst.data, dst.step, src.size(), esz );
|
||||
else
|
||||
flipHoriz( src.data, src.step, dst.data, dst.step, src.size(), esz );
|
||||
|
||||
|
||||
if( flip_mode < 0 )
|
||||
flipHoriz( dst.data, dst.step, dst.data, dst.step, dst.size(), esz );
|
||||
}
|
||||
@ -423,7 +423,7 @@ void repeat(InputArray _src, int ny, int nx, OutputArray _dst)
|
||||
{
|
||||
Mat src = _src.getMat();
|
||||
CV_Assert( src.dims <= 2 );
|
||||
|
||||
|
||||
_dst.create(src.rows*ny, src.cols*nx, src.type());
|
||||
Mat dst = _dst.getMat();
|
||||
Size ssize = src.size(), dsize = dst.size();
|
||||
@ -493,25 +493,25 @@ cvCopy( const void* srcarr, void* dstarr, const void* maskarr )
|
||||
}
|
||||
cv::Mat src = cv::cvarrToMat(srcarr, false, true, 1), dst = cv::cvarrToMat(dstarr, false, true, 1);
|
||||
CV_Assert( src.depth() == dst.depth() && src.size == dst.size );
|
||||
|
||||
|
||||
int coi1 = 0, coi2 = 0;
|
||||
if( CV_IS_IMAGE(srcarr) )
|
||||
coi1 = cvGetImageCOI((const IplImage*)srcarr);
|
||||
if( CV_IS_IMAGE(dstarr) )
|
||||
coi2 = cvGetImageCOI((const IplImage*)dstarr);
|
||||
|
||||
|
||||
if( coi1 || coi2 )
|
||||
{
|
||||
CV_Assert( (coi1 != 0 || src.channels() == 1) &&
|
||||
(coi2 != 0 || dst.channels() == 1) );
|
||||
|
||||
|
||||
int pair[] = { std::max(coi1-1, 0), std::max(coi2-1, 0) };
|
||||
cv::mixChannels( &src, 1, &dst, 1, pair, 1 );
|
||||
return;
|
||||
}
|
||||
else
|
||||
CV_Assert( src.channels() == dst.channels() );
|
||||
|
||||
|
||||
if( !maskarr )
|
||||
src.copyTo(dst);
|
||||
else
|
||||
@ -548,12 +548,12 @@ cvFlip( const CvArr* srcarr, CvArr* dstarr, int flip_mode )
|
||||
{
|
||||
cv::Mat src = cv::cvarrToMat(srcarr);
|
||||
cv::Mat dst;
|
||||
|
||||
|
||||
if (!dstarr)
|
||||
dst = src;
|
||||
else
|
||||
dst = cv::cvarrToMat(dstarr);
|
||||
|
||||
|
||||
CV_Assert( src.type() == dst.type() && src.size() == dst.size() );
|
||||
cv::flip( src, dst, flip_mode );
|
||||
}
|
||||
|
@ -3349,7 +3349,7 @@ cvTreeToNodeSeq( const void* first, int header_size, CvMemStorage* storage )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
return allseq;
|
||||
}
|
||||
@ -3531,9 +3531,9 @@ namespace cv
|
||||
// both cv (CvFeatureTree) and ml (kNN).
|
||||
|
||||
// The algorithm is taken from:
|
||||
// J.S. Beis and D.G. Lowe. Shape indexing using approximate nearest-neighbor search
|
||||
// in highdimensional spaces. In Proc. IEEE Conf. Comp. Vision Patt. Recog.,
|
||||
// pages 1000--1006, 1997. http://citeseer.ist.psu.edu/beis97shape.html
|
||||
// J.S. Beis and D.G. Lowe. Shape indexing using approximate nearest-neighbor search
|
||||
// in highdimensional spaces. In Proc. IEEE Conf. Comp. Vision Patt. Recog.,
|
||||
// pages 1000--1006, 1997. http://citeseer.ist.psu.edu/beis97shape.html
|
||||
|
||||
const int MAX_TREE_DEPTH = 32;
|
||||
|
||||
@ -3555,8 +3555,8 @@ KDTree::KDTree(InputArray _points, InputArray _labels, bool _copyData)
|
||||
maxDepth = -1;
|
||||
normType = NORM_L2;
|
||||
build(_points, _labels, _copyData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
struct SubTree
|
||||
{
|
||||
SubTree() : first(0), last(0), nodeIdx(0), depth(0) {}
|
||||
@ -3596,7 +3596,7 @@ medianPartition( size_t* ofs, int a, int b, const float* vals )
|
||||
else
|
||||
a = i0;
|
||||
}
|
||||
|
||||
|
||||
float pivot = vals[ofs[middle]];
|
||||
int less = 0, more = 0;
|
||||
for( k = a0; k < middle; k++ )
|
||||
@ -3632,7 +3632,7 @@ computeSums( const Mat& points, const size_t* ofs, int a, int b, double* sums )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void KDTree::build(InputArray _points, bool _copyData)
|
||||
{
|
||||
build(_points, noArray(), _copyData);
|
||||
@ -3652,8 +3652,8 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
points.release();
|
||||
points.create(_points.size(), _points.type());
|
||||
}
|
||||
|
||||
int i, j, n = _points.rows, dims = _points.cols, top = 0;
|
||||
|
||||
int i, j, n = _points.rows, ptdims = _points.cols, top = 0;
|
||||
const float* data = _points.ptr<float>(0);
|
||||
float* dstdata = points.ptr<float>(0);
|
||||
size_t step = _points.step1();
|
||||
@ -3661,7 +3661,7 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
int ptpos = 0;
|
||||
labels.resize(n);
|
||||
const int* _labels_data = 0;
|
||||
|
||||
|
||||
if( !_labels.empty() )
|
||||
{
|
||||
int nlabels = _labels.checkVector(1, CV_32S, true);
|
||||
@ -3669,9 +3669,9 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
_labels_data = (const int*)_labels.data;
|
||||
}
|
||||
|
||||
Mat sumstack(MAX_TREE_DEPTH*2, dims*2, CV_64F);
|
||||
Mat sumstack(MAX_TREE_DEPTH*2, ptdims*2, CV_64F);
|
||||
SubTree stack[MAX_TREE_DEPTH*2];
|
||||
|
||||
|
||||
vector<size_t> _ptofs(n);
|
||||
size_t* ptofs = &_ptofs[0];
|
||||
|
||||
@ -3682,7 +3682,7 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
computeSums(points, ptofs, 0, n-1, sumstack.ptr<double>(top));
|
||||
stack[top++] = SubTree(0, n-1, 0, 0);
|
||||
int _maxDepth = 0;
|
||||
|
||||
|
||||
while( --top >= 0 )
|
||||
{
|
||||
int first = stack[top].first, last = stack[top].last;
|
||||
@ -3700,16 +3700,16 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
{
|
||||
const float* src = data + ptofs[first];
|
||||
float* dst = dstdata + idx*dstep;
|
||||
for( j = 0; j < dims; j++ )
|
||||
for( j = 0; j < ptdims; j++ )
|
||||
dst[j] = src[j];
|
||||
}
|
||||
labels[idx] = _labels_data ? _labels_data[idx0] : idx0;
|
||||
labels[idx] = _labels_data ? _labels_data[idx0] : idx0;
|
||||
_maxDepth = std::max(_maxDepth, depth);
|
||||
continue;
|
||||
}
|
||||
|
||||
// find the dimensionality with the biggest variance
|
||||
for( j = 0; j < dims; j++ )
|
||||
for( j = 0; j < ptdims; j++ )
|
||||
{
|
||||
double m = sums[j*2]*invCount;
|
||||
double varj = sums[j*2+1]*invCount - m*m;
|
||||
@ -3729,9 +3729,9 @@ void KDTree::build(InputArray __points, InputArray __labels, bool _copyData)
|
||||
nodes[nidx].boundary = medianPartition(ptofs, first, last, data + dim);
|
||||
|
||||
int middle = (first + last)/2;
|
||||
double *lsums = (double*)sums, *rsums = lsums + dims*2;
|
||||
double *lsums = (double*)sums, *rsums = lsums + ptdims*2;
|
||||
computeSums(points, ptofs, middle+1, last, rsums);
|
||||
for( j = 0; j < dims*2; j++ )
|
||||
for( j = 0; j < ptdims*2; j++ )
|
||||
lsums[j] = sums[j] - rsums[j];
|
||||
stack[top++] = SubTree(first, middle, left, depth+1);
|
||||
stack[top++] = SubTree(middle+1, last, right, depth+1);
|
||||
@ -3752,13 +3752,13 @@ struct PQueueElem
|
||||
int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
OutputArray _neighborsIdx, OutputArray _neighbors,
|
||||
OutputArray _dist, OutputArray _labels) const
|
||||
|
||||
|
||||
{
|
||||
Mat vecmat = _vec.getMat();
|
||||
CV_Assert( vecmat.isContinuous() && vecmat.type() == CV_32F && vecmat.total() == (size_t)points.cols );
|
||||
const float* vec = vecmat.ptr<float>();
|
||||
K = std::min(K, points.rows);
|
||||
int dims = points.cols;
|
||||
int ptdims = points.cols;
|
||||
|
||||
CV_Assert(K > 0 && (normType == NORM_L2 || normType == NORM_L1));
|
||||
|
||||
@ -3776,7 +3776,7 @@ int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
{
|
||||
float d, alt_d = 0.f;
|
||||
int nidx;
|
||||
|
||||
|
||||
if( e == 0 )
|
||||
nidx = 0;
|
||||
else
|
||||
@ -3803,7 +3803,7 @@ int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
i = left;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( ncount == K && alt_d > dist[ncount-1] )
|
||||
continue;
|
||||
}
|
||||
@ -3813,21 +3813,21 @@ int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
if( nidx < 0 )
|
||||
break;
|
||||
const Node& n = nodes[nidx];
|
||||
|
||||
|
||||
if( n.idx < 0 )
|
||||
{
|
||||
i = ~n.idx;
|
||||
const float* row = points.ptr<float>(i);
|
||||
if( normType == NORM_L2 )
|
||||
for( j = 0, d = 0.f; j < dims; j++ )
|
||||
for( j = 0, d = 0.f; j < ptdims; j++ )
|
||||
{
|
||||
float t = vec[j] - row[j];
|
||||
d += t*t;
|
||||
}
|
||||
else
|
||||
for( j = 0, d = 0.f; j < dims; j++ )
|
||||
for( j = 0, d = 0.f; j < ptdims; j++ )
|
||||
d += std::abs(vec[j] - row[j]);
|
||||
|
||||
|
||||
dist[ncount] = d;
|
||||
idx[ncount] = i;
|
||||
for( i = ncount-1; i >= 0; i-- )
|
||||
@ -3839,9 +3839,9 @@ int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
}
|
||||
ncount += ncount < K;
|
||||
e++;
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
int alt;
|
||||
if( vec[n.idx] <= n.boundary )
|
||||
{
|
||||
@ -3853,7 +3853,7 @@ int KDTree::findNearest(InputArray _vec, int K, int emax,
|
||||
nidx = n.right;
|
||||
alt = n.left;
|
||||
}
|
||||
|
||||
|
||||
d = vec[n.idx] - n.boundary;
|
||||
if( normType == NORM_L2 )
|
||||
d = d*d + alt_d;
|
||||
@ -3898,22 +3898,22 @@ void KDTree::findOrthoRange(InputArray _lowerBound,
|
||||
OutputArray _neighbors,
|
||||
OutputArray _labels ) const
|
||||
{
|
||||
int dims = points.cols;
|
||||
int ptdims = points.cols;
|
||||
Mat lowerBound = _lowerBound.getMat(), upperBound = _upperBound.getMat();
|
||||
CV_Assert( lowerBound.size == upperBound.size &&
|
||||
lowerBound.isContinuous() &&
|
||||
upperBound.isContinuous() &&
|
||||
lowerBound.type() == upperBound.type() &&
|
||||
lowerBound.type() == CV_32F &&
|
||||
lowerBound.total() == (size_t)dims );
|
||||
lowerBound.total() == (size_t)ptdims );
|
||||
const float* L = lowerBound.ptr<float>();
|
||||
const float* R = upperBound.ptr<float>();
|
||||
|
||||
|
||||
vector<int> idx;
|
||||
AutoBuffer<int> _stack(MAX_TREE_DEPTH*2 + 1);
|
||||
int* stack = _stack;
|
||||
int top = 0;
|
||||
|
||||
|
||||
stack[top++] = 0;
|
||||
|
||||
while( --top >= 0 )
|
||||
@ -3926,10 +3926,10 @@ void KDTree::findOrthoRange(InputArray _lowerBound,
|
||||
{
|
||||
int j, i = ~n.idx;
|
||||
const float* row = points.ptr<float>(i);
|
||||
for( j = 0; j < dims; j++ )
|
||||
for( j = 0; j < ptdims; j++ )
|
||||
if( row[j] < L[j] || row[j] >= R[j] )
|
||||
break;
|
||||
if( j == dims )
|
||||
if( j == ptdims )
|
||||
idx.push_back(i);
|
||||
continue;
|
||||
}
|
||||
@ -3948,7 +3948,7 @@ void KDTree::findOrthoRange(InputArray _lowerBound,
|
||||
getPoints( idx, _neighbors, _labels );
|
||||
}
|
||||
|
||||
|
||||
|
||||
void KDTree::getPoints(InputArray _idx, OutputArray _pts, OutputArray _labels) const
|
||||
{
|
||||
Mat idxmat = _idx.getMat(), pts, labelsmat;
|
||||
@ -3956,8 +3956,8 @@ void KDTree::getPoints(InputArray _idx, OutputArray _pts, OutputArray _labels) c
|
||||
(idxmat.cols == 1 || idxmat.rows == 1) );
|
||||
const int* idx = idxmat.ptr<int>();
|
||||
int* dstlabels = 0;
|
||||
|
||||
int dims = points.cols;
|
||||
|
||||
int ptdims = points.cols;
|
||||
int i, nidx = (int)idxmat.total();
|
||||
if( nidx == 0 )
|
||||
{
|
||||
@ -3965,13 +3965,13 @@ void KDTree::getPoints(InputArray _idx, OutputArray _pts, OutputArray _labels) c
|
||||
_labels.release();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( _pts.needed() )
|
||||
{
|
||||
_pts.create( nidx, dims, points.type());
|
||||
_pts.create( nidx, ptdims, points.type());
|
||||
pts = _pts.getMat();
|
||||
}
|
||||
|
||||
|
||||
if(_labels.needed())
|
||||
{
|
||||
_labels.create(nidx, 1, CV_32S, -1, true);
|
||||
@ -3980,14 +3980,14 @@ void KDTree::getPoints(InputArray _idx, OutputArray _pts, OutputArray _labels) c
|
||||
dstlabels = labelsmat.ptr<int>();
|
||||
}
|
||||
const int* srclabels = !labels.empty() ? &labels[0] : 0;
|
||||
|
||||
|
||||
for( i = 0; i < nidx; i++ )
|
||||
{
|
||||
int k = idx[i];
|
||||
CV_Assert( (unsigned)k < (unsigned)points.rows );
|
||||
const float* src = points.ptr<float>(k);
|
||||
if( pts.data )
|
||||
std::copy(src, src + dims, pts.ptr<float>(i));
|
||||
std::copy(src, src + ptdims, pts.ptr<float>(i));
|
||||
if( dstlabels )
|
||||
dstlabels[i] = srclabels ? srclabels[k] : k;
|
||||
}
|
||||
@ -4007,9 +4007,9 @@ int KDTree::dims() const
|
||||
{
|
||||
return !points.empty() ? points.cols : 0;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
schar* seqPush( CvSeq* seq, const void* element )
|
||||
{
|
||||
return cvSeqPush(seq, element);
|
||||
|
@ -169,7 +169,7 @@ LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
|
||||
}
|
||||
|
||||
int bt_pix0 = (int)img.elemSize(), bt_pix = bt_pix0;
|
||||
size_t step = img.step;
|
||||
size_t istep = img.step;
|
||||
|
||||
int dx = pt2.x - pt1.x;
|
||||
int dy = pt2.y - pt1.y;
|
||||
@ -188,11 +188,11 @@ LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
|
||||
bt_pix = (bt_pix ^ s) - s;
|
||||
}
|
||||
|
||||
ptr = (uchar*)(img.data + pt1.y * step + pt1.x * bt_pix0);
|
||||
ptr = (uchar*)(img.data + pt1.y * istep + pt1.x * bt_pix0);
|
||||
|
||||
s = dy < 0 ? -1 : 0;
|
||||
dy = (dy ^ s) - s;
|
||||
step = (step ^ s) - s;
|
||||
istep = (istep ^ s) - s;
|
||||
|
||||
s = dy > dx ? -1 : 0;
|
||||
|
||||
@ -201,9 +201,9 @@ LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
|
||||
dy ^= dx & s;
|
||||
dx ^= dy & s;
|
||||
|
||||
bt_pix ^= step & s;
|
||||
step ^= bt_pix & s;
|
||||
bt_pix ^= step & s;
|
||||
bt_pix ^= istep & s;
|
||||
istep ^= bt_pix & s;
|
||||
bt_pix ^= istep & s;
|
||||
|
||||
if( connectivity == 8 )
|
||||
{
|
||||
@ -212,7 +212,7 @@ LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
|
||||
err = dx - (dy + dy);
|
||||
plusDelta = dx + dx;
|
||||
minusDelta = -(dy + dy);
|
||||
plusStep = (int)step;
|
||||
plusStep = (int)istep;
|
||||
minusStep = bt_pix;
|
||||
count = dx + 1;
|
||||
}
|
||||
@ -223,7 +223,7 @@ LineIterator::LineIterator(const Mat& img, Point pt1, Point pt2,
|
||||
err = 0;
|
||||
plusDelta = (dx + dx) + (dy + dy);
|
||||
minusDelta = -(dy + dy);
|
||||
plusStep = (int)step - bt_pix;
|
||||
plusStep = (int)istep - bt_pix;
|
||||
minusStep = bt_pix;
|
||||
count = dx + dy + 1;
|
||||
}
|
||||
|
@ -524,30 +524,30 @@ cv::gpu::GpuMat::GpuMat(Size size_, int type_, void* data_, size_t step_) :
|
||||
dataend += step * (rows - 1) + minstep;
|
||||
}
|
||||
|
||||
cv::gpu::GpuMat::GpuMat(const GpuMat& m, Range rowRange, Range colRange)
|
||||
cv::gpu::GpuMat::GpuMat(const GpuMat& m, Range _rowRange, Range _colRange)
|
||||
{
|
||||
flags = m.flags;
|
||||
step = m.step; refcount = m.refcount;
|
||||
data = m.data; datastart = m.datastart; dataend = m.dataend;
|
||||
|
||||
if (rowRange == Range::all())
|
||||
if (_rowRange == Range::all())
|
||||
rows = m.rows;
|
||||
else
|
||||
{
|
||||
CV_Assert(0 <= rowRange.start && rowRange.start <= rowRange.end && rowRange.end <= m.rows);
|
||||
CV_Assert(0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows);
|
||||
|
||||
rows = rowRange.size();
|
||||
data += step*rowRange.start;
|
||||
rows = _rowRange.size();
|
||||
data += step*_rowRange.start;
|
||||
}
|
||||
|
||||
if (colRange == Range::all())
|
||||
if (_colRange == Range::all())
|
||||
cols = m.cols;
|
||||
else
|
||||
{
|
||||
CV_Assert(0 <= colRange.start && colRange.start <= colRange.end && colRange.end <= m.cols);
|
||||
CV_Assert(0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols);
|
||||
|
||||
cols = colRange.size();
|
||||
data += colRange.start*elemSize();
|
||||
cols = _colRange.size();
|
||||
data += _colRange.start*elemSize();
|
||||
flags &= cols < m.cols ? ~Mat::CONTINUOUS_FLAG : -1;
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ GEMM_CopyBlock( const uchar* src, size_t src_step,
|
||||
|
||||
for( ; size.height--; src += src_step, dst += dst_step )
|
||||
{
|
||||
j=0;
|
||||
j=0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; j <= size.width - 4; j += 4 )
|
||||
{
|
||||
@ -345,7 +345,7 @@ GEMMSingleMul( const T* a_data, size_t a_step,
|
||||
for( k = 0; k < n; k++, b_data += b_step )
|
||||
{
|
||||
WT al(a_data[k]);
|
||||
j=0;
|
||||
j=0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; j <= m - 4; j += 4 )
|
||||
{
|
||||
@ -513,8 +513,8 @@ GEMMStore( const T* c_data, size_t c_step,
|
||||
if( _c_data )
|
||||
{
|
||||
c_data = _c_data;
|
||||
j=0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
j=0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; j <= d_size.width - 4; j += 4, c_data += 4*c_step1 )
|
||||
{
|
||||
WT t0 = alpha*d_buf[j];
|
||||
@ -539,8 +539,8 @@ GEMMStore( const T* c_data, size_t c_step,
|
||||
}
|
||||
else
|
||||
{
|
||||
j = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
j = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; j <= d_size.width - 4; j += 4 )
|
||||
{
|
||||
WT t0 = alpha*d_buf[j];
|
||||
@ -552,7 +552,7 @@ GEMMStore( const T* c_data, size_t c_step,
|
||||
d_data[j+2] = T(t0);
|
||||
d_data[j+3] = T(t1);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
for( ; j < d_size.width; j++ )
|
||||
d_data[j] = T(alpha*d_buf[j]);
|
||||
}
|
||||
@ -597,7 +597,7 @@ static void GEMMSingleMul_64f( const double* a_data, size_t a_step,
|
||||
alpha, beta, flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void GEMMSingleMul_32fc( const Complexf* a_data, size_t a_step,
|
||||
const Complexf* b_data, size_t b_step,
|
||||
const Complexf* c_data, size_t c_step,
|
||||
@ -620,7 +620,7 @@ static void GEMMSingleMul_64fc( const Complexd* a_data, size_t a_step,
|
||||
GEMMSingleMul<Complexd,Complexd>(a_data, a_step, b_data, b_step, c_data,
|
||||
c_step, d_data, d_step, a_size, d_size,
|
||||
alpha, beta, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void GEMMBlockMul_32f( const float* a_data, size_t a_step,
|
||||
const float* b_data, size_t b_step,
|
||||
@ -696,7 +696,7 @@ static void GEMMStore_64fc( const Complexd* c_data, size_t c_step,
|
||||
}
|
||||
|
||||
void cv::gemm( InputArray matA, InputArray matB, double alpha,
|
||||
InputArray matC, double beta, OutputArray matD, int flags )
|
||||
InputArray matC, double beta, OutputArray _matD, int flags )
|
||||
{
|
||||
const int block_lin_size = 128;
|
||||
const int block_size = block_lin_size * block_lin_size;
|
||||
@ -741,8 +741,8 @@ void cv::gemm( InputArray matA, InputArray matB, double alpha,
|
||||
((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height)));
|
||||
}
|
||||
|
||||
matD.create( d_size.height, d_size.width, type );
|
||||
Mat D = matD.getMat();
|
||||
_matD.create( d_size.height, d_size.width, type );
|
||||
Mat D = _matD.getMat();
|
||||
if( (flags & GEMM_3_T) != 0 && C.data == D.data )
|
||||
{
|
||||
transpose( C, C );
|
||||
@ -2008,7 +2008,7 @@ static void scaleAdd_32f(const float* src1, const float* src2, float* dst,
|
||||
t1 = src1[i+3]*alpha + src2[i+3];
|
||||
dst[i+2] = t0; dst[i+3] = t1;
|
||||
}
|
||||
for(; i < len; i++ )
|
||||
for(; i < len; i++ )
|
||||
dst[i] = src1[i]*alpha + src2[i];
|
||||
}
|
||||
|
||||
@ -2035,7 +2035,7 @@ static void scaleAdd_64f(const double* src1, const double* src2, double* dst,
|
||||
}
|
||||
else
|
||||
#endif
|
||||
//vz why do we need unroll here?
|
||||
//vz why do we need unroll here?
|
||||
for( ; i <= len - 4; i += 4 )
|
||||
{
|
||||
double t0, t1;
|
||||
@ -2046,7 +2046,7 @@ static void scaleAdd_64f(const double* src1, const double* src2, double* dst,
|
||||
t1 = src1[i+3]*alpha + src2[i+3];
|
||||
dst[i+2] = t0; dst[i+3] = t1;
|
||||
}
|
||||
for(; i < len; i++ )
|
||||
for(; i < len; i++ )
|
||||
dst[i] = src1[i]*alpha + src2[i];
|
||||
}
|
||||
|
||||
@ -2072,7 +2072,7 @@ void cv::scaleAdd( InputArray _src1, double alpha, InputArray _src2, OutputArray
|
||||
float falpha = (float)alpha;
|
||||
void* palpha = depth == CV_32F ? (void*)&falpha : (void*)α
|
||||
|
||||
ScaleAddFunc func = depth == CV_32F ? (ScaleAddFunc)scaleAdd_32f : (ScaleAddFunc)scaleAdd_64f;
|
||||
ScaleAddFunc func = depth == CV_32F ? (ScaleAddFunc)scaleAdd_32f : (ScaleAddFunc)scaleAdd_64f;
|
||||
|
||||
if( src1.isContinuous() && src2.isContinuous() && dst.isContinuous() )
|
||||
{
|
||||
@ -2134,12 +2134,12 @@ void cv::calcCovarMatrix( const Mat* data, int nsamples, Mat& covar, Mat& _mean,
|
||||
_mean = mean.reshape(1, size.height);
|
||||
}
|
||||
|
||||
void cv::calcCovarMatrix( InputArray _data, OutputArray _covar, InputOutputArray _mean, int flags, int ctype )
|
||||
void cv::calcCovarMatrix( InputArray _src, OutputArray _covar, InputOutputArray _mean, int flags, int ctype )
|
||||
{
|
||||
if(_data.kind() == _InputArray::STD_VECTOR_MAT)
|
||||
if(_src.kind() == _InputArray::STD_VECTOR_MAT)
|
||||
{
|
||||
std::vector<cv::Mat> src;
|
||||
_data.getMatVector(src);
|
||||
_src.getMatVector(src);
|
||||
|
||||
CV_Assert( src.size() > 0 );
|
||||
|
||||
@ -2185,7 +2185,7 @@ void cv::calcCovarMatrix( InputArray _data, OutputArray _covar, InputOutputArray
|
||||
return;
|
||||
}
|
||||
|
||||
Mat data = _data.getMat(), mean;
|
||||
Mat data = _src.getMat(), mean;
|
||||
CV_Assert( ((flags & CV_COVAR_ROWS) != 0) ^ ((flags & CV_COVAR_COLS) != 0) );
|
||||
bool takeRows = (flags & CV_COVAR_ROWS) != 0;
|
||||
int type = data.type();
|
||||
@ -2209,7 +2209,7 @@ void cv::calcCovarMatrix( InputArray _data, OutputArray _covar, InputOutputArray
|
||||
else
|
||||
{
|
||||
ctype = std::max(CV_MAT_DEPTH(ctype >= 0 ? ctype : type), CV_32F);
|
||||
reduce( _data, _mean, takeRows ? 0 : 1, CV_REDUCE_AVG, ctype );
|
||||
reduce( _src, _mean, takeRows ? 0 : 1, CV_REDUCE_AVG, ctype );
|
||||
mean = _mean.getMat();
|
||||
}
|
||||
|
||||
@ -2223,7 +2223,7 @@ void cv::calcCovarMatrix( InputArray _data, OutputArray _covar, InputOutputArray
|
||||
|
||||
double cv::Mahalanobis( InputArray _v1, InputArray _v2, InputArray _icovar )
|
||||
{
|
||||
Mat v1 = _v1.getMat(), v2 = _v2.getMat(), icovar = _icovar.getMat();
|
||||
Mat v1 = _v1.getMat(), v2 = _v2.getMat(), icovar = _icovar.getMat();
|
||||
int type = v1.type(), depth = v1.depth();
|
||||
Size sz = v1.size();
|
||||
int i, j, len = sz.width*sz.height*v1.channels();
|
||||
@ -2261,7 +2261,7 @@ double cv::Mahalanobis( InputArray _v1, InputArray _v2, InputArray _icovar )
|
||||
{
|
||||
double row_sum = 0;
|
||||
j = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; j <= len - 4; j += 4 )
|
||||
row_sum += diff[j]*mat[j] + diff[j+1]*mat[j+1] +
|
||||
diff[j+2]*mat[j+2] + diff[j+3]*mat[j+3];
|
||||
@ -2292,7 +2292,7 @@ double cv::Mahalanobis( InputArray _v1, InputArray _v2, InputArray _icovar )
|
||||
{
|
||||
double row_sum = 0;
|
||||
j = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for(; j <= len - 4; j += 4 )
|
||||
row_sum += diff[j]*mat[j] + diff[j+1]*mat[j+1] +
|
||||
diff[j+2]*mat[j+2] + diff[j+3]*mat[j+3];
|
||||
@ -2642,7 +2642,7 @@ dotProd_(const T* src1, const T* src2, int len)
|
||||
{
|
||||
int i = 0;
|
||||
double result = 0;
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= len - 4; i += 4 )
|
||||
result += (double)src1[i]*src2[i] + (double)src1[i+1]*src2[i+1] +
|
||||
(double)src1[i+2]*src2[i+2] + (double)src1[i+3]*src2[i+3];
|
||||
@ -2674,7 +2674,7 @@ static double dotProd_8u(const uchar* src1, const uchar* src2, int len)
|
||||
{
|
||||
blockSize = std::min(len0 - i, blockSize0);
|
||||
__m128i s = _mm_setzero_si128();
|
||||
j = 0;
|
||||
j = 0;
|
||||
for( ; j <= blockSize - 16; j += 16 )
|
||||
{
|
||||
__m128i b0 = _mm_loadu_si128((const __m128i*)(src1 + j));
|
||||
@ -2806,9 +2806,9 @@ double Mat::dot(InputArray _mat) const
|
||||
|
||||
PCA::PCA() {}
|
||||
|
||||
PCA::PCA(InputArray data, InputArray mean, int flags, int maxComponents)
|
||||
PCA::PCA(InputArray data, InputArray _mean, int flags, int maxComponents)
|
||||
{
|
||||
operator()(data, mean, flags, maxComponents);
|
||||
operator()(data, _mean, flags, maxComponents);
|
||||
}
|
||||
|
||||
PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComponents)
|
||||
@ -2964,7 +2964,7 @@ void cv::PCACompute(InputArray data, InputOutputArray mean,
|
||||
pca.mean.copyTo(mean);
|
||||
pca.eigenvectors.copyTo(eigenvectors);
|
||||
}
|
||||
|
||||
|
||||
void cv::PCAProject(InputArray data, InputArray mean,
|
||||
InputArray eigenvectors, OutputArray result)
|
||||
{
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -210,9 +210,9 @@ void Mat::create(int d, const int* _sizes, int _type)
|
||||
#endif
|
||||
if( !allocator )
|
||||
{
|
||||
size_t total = alignSize(step.p[0]*size.p[0], (int)sizeof(*refcount));
|
||||
data = datastart = (uchar*)fastMalloc(total + (int)sizeof(*refcount));
|
||||
refcount = (int*)(data + total);
|
||||
size_t totalsize = alignSize(step.p[0]*size.p[0], (int)sizeof(*refcount));
|
||||
data = datastart = (uchar*)fastMalloc(totalsize + (int)sizeof(*refcount));
|
||||
refcount = (int*)(data + totalsize);
|
||||
*refcount = 1;
|
||||
}
|
||||
else
|
||||
@ -262,15 +262,15 @@ void Mat::deallocate()
|
||||
}
|
||||
|
||||
|
||||
Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange) : size(&rows)
|
||||
Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) : size(&rows)
|
||||
{
|
||||
initEmpty();
|
||||
CV_Assert( m.dims >= 2 );
|
||||
if( m.dims > 2 )
|
||||
{
|
||||
AutoBuffer<Range> rs(m.dims);
|
||||
rs[0] = rowRange;
|
||||
rs[1] = colRange;
|
||||
rs[0] = _rowRange;
|
||||
rs[1] = _colRange;
|
||||
for( int i = 2; i < m.dims; i++ )
|
||||
rs[i] = Range::all();
|
||||
*this = m(rs);
|
||||
@ -278,19 +278,19 @@ Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange) : size(&row
|
||||
}
|
||||
|
||||
*this = m;
|
||||
if( rowRange != Range::all() && rowRange != Range(0,rows) )
|
||||
if( _rowRange != Range::all() && _rowRange != Range(0,rows) )
|
||||
{
|
||||
CV_Assert( 0 <= rowRange.start && rowRange.start <= rowRange.end && rowRange.end <= m.rows );
|
||||
rows = rowRange.size();
|
||||
data += step*rowRange.start;
|
||||
CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows );
|
||||
rows = _rowRange.size();
|
||||
data += step*_rowRange.start;
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
}
|
||||
|
||||
if( colRange != Range::all() && colRange != Range(0,cols) )
|
||||
if( _colRange != Range::all() && _colRange != Range(0,cols) )
|
||||
{
|
||||
CV_Assert( 0 <= colRange.start && colRange.start <= colRange.end && colRange.end <= m.cols );
|
||||
cols = colRange.size();
|
||||
data += colRange.start*elemSize();
|
||||
CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols );
|
||||
cols = _colRange.size();
|
||||
data += _colRange.start*elemSize();
|
||||
flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1;
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
}
|
||||
@ -473,14 +473,14 @@ Mat::Mat(const IplImage* img, bool copyData) : size(&rows)
|
||||
dims = 2;
|
||||
CV_DbgAssert(CV_IS_IMAGE(img) && img->imageData != 0);
|
||||
|
||||
int depth = IPL2CV_DEPTH(img->depth);
|
||||
int imgdepth = IPL2CV_DEPTH(img->depth);
|
||||
size_t esz;
|
||||
step[0] = img->widthStep;
|
||||
|
||||
if(!img->roi)
|
||||
{
|
||||
CV_Assert(img->dataOrder == IPL_DATA_ORDER_PIXEL);
|
||||
flags = MAGIC_VAL + CV_MAKETYPE(depth, img->nChannels);
|
||||
flags = MAGIC_VAL + CV_MAKETYPE(imgdepth, img->nChannels);
|
||||
rows = img->height; cols = img->width;
|
||||
datastart = data = (uchar*)img->imageData;
|
||||
esz = CV_ELEM_SIZE(flags);
|
||||
@ -489,7 +489,7 @@ Mat::Mat(const IplImage* img, bool copyData) : size(&rows)
|
||||
{
|
||||
CV_Assert(img->dataOrder == IPL_DATA_ORDER_PIXEL || img->roi->coi != 0);
|
||||
bool selectedPlane = img->roi->coi && img->dataOrder == IPL_DATA_ORDER_PLANE;
|
||||
flags = MAGIC_VAL + CV_MAKETYPE(depth, selectedPlane ? 1 : img->nChannels);
|
||||
flags = MAGIC_VAL + CV_MAKETYPE(imgdepth, selectedPlane ? 1 : img->nChannels);
|
||||
rows = img->roi->height; cols = img->roi->width;
|
||||
esz = CV_ELEM_SIZE(flags);
|
||||
data = datastart = (uchar*)img->imageData +
|
||||
@ -1299,38 +1299,38 @@ bool _OutputArray::fixedType() const
|
||||
return (flags & FIXED_TYPE) == FIXED_TYPE;
|
||||
}
|
||||
|
||||
void _OutputArray::create(Size _sz, int type, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
void _OutputArray::create(Size _sz, int mtype, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
{
|
||||
int k = kind();
|
||||
if( k == MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((Mat*)obj)->size.operator()() == _sz);
|
||||
CV_Assert(!fixedType() || ((Mat*)obj)->type() == type);
|
||||
((Mat*)obj)->create(_sz, type);
|
||||
CV_Assert(!fixedType() || ((Mat*)obj)->type() == mtype);
|
||||
((Mat*)obj)->create(_sz, mtype);
|
||||
return;
|
||||
}
|
||||
int sz[] = {_sz.height, _sz.width};
|
||||
create(2, sz, type, i, allowTransposed, fixedDepthMask);
|
||||
int sizes[] = {_sz.height, _sz.width};
|
||||
create(2, sizes, mtype, i, allowTransposed, fixedDepthMask);
|
||||
}
|
||||
|
||||
void _OutputArray::create(int rows, int cols, int type, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
void _OutputArray::create(int rows, int cols, int mtype, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
{
|
||||
int k = kind();
|
||||
if( k == MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((Mat*)obj)->size.operator()() == Size(cols, rows));
|
||||
CV_Assert(!fixedType() || ((Mat*)obj)->type() == type);
|
||||
((Mat*)obj)->create(rows, cols, type);
|
||||
CV_Assert(!fixedType() || ((Mat*)obj)->type() == mtype);
|
||||
((Mat*)obj)->create(rows, cols, mtype);
|
||||
return;
|
||||
}
|
||||
int sz[] = {rows, cols};
|
||||
create(2, sz, type, i, allowTransposed, fixedDepthMask);
|
||||
int sizes[] = {rows, cols};
|
||||
create(2, sizes, mtype, i, allowTransposed, fixedDepthMask);
|
||||
}
|
||||
|
||||
void _OutputArray::create(int dims, const int* size, int type, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
void _OutputArray::create(int dims, const int* sizes, int mtype, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
{
|
||||
int k = kind();
|
||||
type = CV_MAT_TYPE(type);
|
||||
mtype = CV_MAT_TYPE(mtype);
|
||||
|
||||
if( k == MAT )
|
||||
{
|
||||
@ -1345,24 +1345,24 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow
|
||||
}
|
||||
|
||||
if( dims == 2 && m.dims == 2 && m.data &&
|
||||
m.type() == type && m.rows == size[1] && m.cols == size[0] )
|
||||
m.type() == mtype && m.rows == sizes[1] && m.cols == sizes[0] )
|
||||
return;
|
||||
}
|
||||
|
||||
if(fixedType())
|
||||
{
|
||||
if(CV_MAT_CN(type) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0 )
|
||||
type = m.type();
|
||||
if(CV_MAT_CN(mtype) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0 )
|
||||
mtype = m.type();
|
||||
else
|
||||
CV_Assert(CV_MAT_TYPE(type) == m.type());
|
||||
CV_Assert(CV_MAT_TYPE(mtype) == m.type());
|
||||
}
|
||||
if(fixedSize())
|
||||
{
|
||||
CV_Assert(m.dims == dims);
|
||||
for(int j = 0; j < dims; ++j)
|
||||
CV_Assert(m.size[j] == size[j]);
|
||||
CV_Assert(m.size[j] == sizes[j]);
|
||||
}
|
||||
m.create(dims, size, type);
|
||||
m.create(dims, sizes, mtype);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1370,16 +1370,16 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
int type0 = CV_MAT_TYPE(flags);
|
||||
CV_Assert( type == type0 || (CV_MAT_CN(type) == 1 && ((1 << type0) & fixedDepthMask) != 0) );
|
||||
CV_Assert( dims == 2 && ((size[0] == sz.height && size[1] == sz.width) ||
|
||||
(allowTransposed && size[0] == sz.width && size[1] == sz.height)));
|
||||
CV_Assert( mtype == type0 || (CV_MAT_CN(mtype) == 1 && ((1 << type0) & fixedDepthMask) != 0) );
|
||||
CV_Assert( dims == 2 && ((sizes[0] == sz.height && sizes[1] == sz.width) ||
|
||||
(allowTransposed && sizes[0] == sz.width && sizes[1] == sz.height)));
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR || k == STD_VECTOR_VECTOR )
|
||||
{
|
||||
CV_Assert( dims == 2 && (size[0] == 1 || size[1] == 1 || size[0]*size[1] == 0) );
|
||||
size_t len = size[0]*size[1] > 0 ? size[0] + size[1] - 1 : 0;
|
||||
CV_Assert( dims == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) );
|
||||
size_t len = sizes[0]*sizes[1] > 0 ? sizes[0] + sizes[1] - 1 : 0;
|
||||
vector<uchar>* v = (vector<uchar>*)obj;
|
||||
|
||||
if( k == STD_VECTOR_VECTOR )
|
||||
@ -1398,7 +1398,7 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow
|
||||
CV_Assert( i < 0 );
|
||||
|
||||
int type0 = CV_MAT_TYPE(flags);
|
||||
CV_Assert( type == type0 || (CV_MAT_CN(type) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) );
|
||||
CV_Assert( mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) );
|
||||
|
||||
int esz = CV_ELEM_SIZE(type0);
|
||||
CV_Assert(!fixedSize() || len == ((vector<uchar>*)v)->size() / esz);
|
||||
@ -1471,20 +1471,20 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow
|
||||
|
||||
if( i < 0 )
|
||||
{
|
||||
CV_Assert( dims == 2 && (size[0] == 1 || size[1] == 1 || size[0]*size[1] == 0) );
|
||||
size_t len = size[0]*size[1] > 0 ? size[0] + size[1] - 1 : 0, len0 = v.size();
|
||||
CV_Assert( dims == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) );
|
||||
size_t len = sizes[0]*sizes[1] > 0 ? sizes[0] + sizes[1] - 1 : 0, len0 = v.size();
|
||||
|
||||
CV_Assert(!fixedSize() || len == len0);
|
||||
v.resize(len);
|
||||
if( fixedType() )
|
||||
{
|
||||
int type = CV_MAT_TYPE(flags);
|
||||
int _type = CV_MAT_TYPE(flags);
|
||||
for( size_t j = len0; j < len; j++ )
|
||||
{
|
||||
if( v[i].type() == type )
|
||||
if( v[i].type() == _type )
|
||||
continue;
|
||||
CV_Assert( v[i].empty() );
|
||||
v[i].flags = (v[i].flags & ~CV_MAT_TYPE_MASK) | type;
|
||||
v[i].flags = (v[i].flags & ~CV_MAT_TYPE_MASK) | _type;
|
||||
}
|
||||
}
|
||||
return;
|
||||
@ -1502,25 +1502,25 @@ void _OutputArray::create(int dims, const int* size, int type, int i, bool allow
|
||||
}
|
||||
|
||||
if( dims == 2 && m.dims == 2 && m.data &&
|
||||
m.type() == type && m.rows == size[1] && m.cols == size[0] )
|
||||
m.type() == mtype && m.rows == sizes[1] && m.cols == sizes[0] )
|
||||
return;
|
||||
}
|
||||
|
||||
if(fixedType())
|
||||
{
|
||||
if(CV_MAT_CN(type) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0 )
|
||||
type = m.type();
|
||||
if(CV_MAT_CN(mtype) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0 )
|
||||
mtype = m.type();
|
||||
else
|
||||
CV_Assert(!fixedType() || (CV_MAT_CN(type) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0));
|
||||
CV_Assert(!fixedType() || (CV_MAT_CN(mtype) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0));
|
||||
}
|
||||
if(fixedSize())
|
||||
{
|
||||
CV_Assert(m.dims == dims);
|
||||
for(int j = 0; j < dims; ++j)
|
||||
CV_Assert(m.size[j] == size[j]);
|
||||
CV_Assert(m.size[j] == sizes[j]);
|
||||
}
|
||||
|
||||
m.create(dims, size, type);
|
||||
m.create(dims, sizes, mtype);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1929,10 +1929,10 @@ void cv::completeSymm( InputOutputArray _m, bool LtoR )
|
||||
cv::Mat cv::Mat::cross(InputArray _m) const
|
||||
{
|
||||
Mat m = _m.getMat();
|
||||
int t = type(), d = CV_MAT_DEPTH(t);
|
||||
CV_Assert( dims <= 2 && m.dims <= 2 && size() == m.size() && t == m.type() &&
|
||||
int tp = type(), d = CV_MAT_DEPTH(tp);
|
||||
CV_Assert( dims <= 2 && m.dims <= 2 && size() == m.size() && tp == m.type() &&
|
||||
((rows == 3 && cols == 1) || (cols*channels() == 3 && rows == 1)));
|
||||
Mat result(rows, cols, t);
|
||||
Mat result(rows, cols, tp);
|
||||
|
||||
if( d == CV_32F )
|
||||
{
|
||||
@ -2845,7 +2845,7 @@ cvRange( CvArr* arr, double start, double end )
|
||||
CV_IMPL void
|
||||
cvSort( const CvArr* _src, CvArr* _dst, CvArr* _idx, int flags )
|
||||
{
|
||||
cv::Mat src = cv::cvarrToMat(_src), dst, idx;
|
||||
cv::Mat src = cv::cvarrToMat(_src);
|
||||
|
||||
if( _idx )
|
||||
{
|
||||
@ -3410,22 +3410,22 @@ SparseMat::SparseMat(const Mat& m)
|
||||
|
||||
int i, idx[CV_MAX_DIM] = {0}, d = m.dims, lastSize = m.size[d - 1];
|
||||
size_t esz = m.elemSize();
|
||||
uchar* ptr = m.data;
|
||||
uchar* dptr = m.data;
|
||||
|
||||
for(;;)
|
||||
{
|
||||
for( i = 0; i < lastSize; i++, ptr += esz )
|
||||
for( i = 0; i < lastSize; i++, dptr += esz )
|
||||
{
|
||||
if( isZeroElem(ptr, esz) )
|
||||
if( isZeroElem(dptr, esz) )
|
||||
continue;
|
||||
idx[d-1] = i;
|
||||
uchar* to = newNode(idx, hash(idx));
|
||||
copyElem( ptr, to, esz );
|
||||
copyElem( dptr, to, esz );
|
||||
}
|
||||
|
||||
for( i = d - 2; i >= 0; i-- )
|
||||
{
|
||||
ptr += m.step[i] - m.size[i+1]*m.step[i+1];
|
||||
dptr += m.step[i] - m.size[i+1]*m.step[i+1];
|
||||
if( ++idx[i] < m.size[i] )
|
||||
break;
|
||||
idx[i] = 0;
|
||||
|
@ -163,11 +163,11 @@ void icvSetOpenGlFuncTab(const CvOpenGlFuncTab* tab)
|
||||
void cv::gpu::setGlDevice(int device)
|
||||
{
|
||||
#ifndef HAVE_CUDA
|
||||
(void)device;
|
||||
(void)device;
|
||||
throw_nocuda;
|
||||
#else
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)device;
|
||||
(void)device;
|
||||
throw_nogl;
|
||||
#else
|
||||
if (!glFuncTab()->isGlContextInitialized())
|
||||
@ -287,7 +287,7 @@ class cv::GlBuffer::Impl
|
||||
{
|
||||
public:
|
||||
static const Ptr<Impl>& empty();
|
||||
|
||||
|
||||
Impl(int rows, int cols, int type, unsigned int target);
|
||||
Impl(const Mat& m, unsigned int target);
|
||||
~Impl();
|
||||
@ -311,7 +311,7 @@ public:
|
||||
|
||||
private:
|
||||
Impl();
|
||||
|
||||
|
||||
unsigned int buffer_;
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
@ -484,57 +484,57 @@ inline void cv::GlBuffer::Impl::unmapDevice(cudaStream_t stream)
|
||||
|
||||
#endif // HAVE_OPENGL
|
||||
|
||||
cv::GlBuffer::GlBuffer(Usage usage) : rows_(0), cols_(0), type_(0), usage_(usage)
|
||||
cv::GlBuffer::GlBuffer(Usage _usage) : rows_(0), cols_(0), type_(0), usage_(_usage)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)usage;
|
||||
(void)_usage;
|
||||
throw_nogl;
|
||||
#else
|
||||
impl_ = Impl::empty();
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlBuffer::GlBuffer(int rows, int cols, int type, Usage usage) : rows_(0), cols_(0), type_(0), usage_(usage)
|
||||
cv::GlBuffer::GlBuffer(int _rows, int _cols, int _type, Usage _usage) : rows_(0), cols_(0), type_(0), usage_(_usage)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)rows;
|
||||
(void)cols;
|
||||
(void)type;
|
||||
(void)usage;
|
||||
(void)_rows;
|
||||
(void)_cols;
|
||||
(void)_type;
|
||||
(void)_usage;
|
||||
throw_nogl;
|
||||
#else
|
||||
impl_ = new Impl(rows, cols, type, usage);
|
||||
rows_ = rows;
|
||||
cols_ = cols;
|
||||
type_ = type;
|
||||
impl_ = new Impl(_rows, _cols, _type, _usage);
|
||||
rows_ = _rows;
|
||||
cols_ = _cols;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlBuffer::GlBuffer(Size size, int type, Usage usage) : rows_(0), cols_(0), type_(0), usage_(usage)
|
||||
cv::GlBuffer::GlBuffer(Size _size, int _type, Usage _usage) : rows_(0), cols_(0), type_(0), usage_(_usage)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)size;
|
||||
(void)type;
|
||||
(void)usage;
|
||||
(void)_size;
|
||||
(void)_type;
|
||||
(void)_usage;
|
||||
throw_nogl;
|
||||
#else
|
||||
impl_ = new Impl(size.height, size.width, type, usage);
|
||||
rows_ = size.height;
|
||||
cols_ = size.width;
|
||||
type_ = type;
|
||||
impl_ = new Impl(_size.height, _size.width, _type, _usage);
|
||||
rows_ = _size.height;
|
||||
cols_ = _size.width;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlBuffer::GlBuffer(InputArray mat_, Usage usage) : rows_(0), cols_(0), type_(0), usage_(usage)
|
||||
cv::GlBuffer::GlBuffer(InputArray mat_, Usage _usage) : rows_(0), cols_(0), type_(0), usage_(_usage)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)mat_;
|
||||
(void)usage;
|
||||
(void)mat_;
|
||||
(void)_usage;
|
||||
throw_nogl;
|
||||
#else
|
||||
int kind = mat_.kind();
|
||||
Size size = mat_.size();
|
||||
int type = mat_.type();
|
||||
Size _size = mat_.size();
|
||||
int _type = mat_.type();
|
||||
|
||||
if (kind == _InputArray::GPU_MAT)
|
||||
{
|
||||
@ -542,38 +542,38 @@ cv::GlBuffer::GlBuffer(InputArray mat_, Usage usage) : rows_(0), cols_(0), type_
|
||||
throw_nocuda;
|
||||
#else
|
||||
GpuMat d_mat = mat_.getGpuMat();
|
||||
impl_ = new Impl(d_mat.rows, d_mat.cols, d_mat.type(), usage);
|
||||
impl_ = new Impl(d_mat.rows, d_mat.cols, d_mat.type(), _usage);
|
||||
impl_->copyFrom(d_mat);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
Mat mat = mat_.getMat();
|
||||
impl_ = new Impl(mat, usage);
|
||||
impl_ = new Impl(mat, _usage);
|
||||
}
|
||||
|
||||
rows_ = size.height;
|
||||
cols_ = size.width;
|
||||
type_ = type;
|
||||
rows_ = _size.height;
|
||||
cols_ = _size.width;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
void cv::GlBuffer::create(int rows, int cols, int type, Usage usage)
|
||||
void cv::GlBuffer::create(int _rows, int _cols, int _type, Usage _usage)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)rows;
|
||||
(void)cols;
|
||||
(void)type;
|
||||
(void)usage;
|
||||
(void)_rows;
|
||||
(void)_cols;
|
||||
(void)_type;
|
||||
(void)_usage;
|
||||
throw_nogl;
|
||||
#else
|
||||
if (rows_ != rows || cols_ != cols || type_ != type || usage_ != usage)
|
||||
if (rows_ != _rows || cols_ != _cols || type_ != _type || usage_ != _usage)
|
||||
{
|
||||
impl_ = new Impl(rows, cols, type, usage);
|
||||
rows_ = rows;
|
||||
cols_ = cols;
|
||||
type_ = type;
|
||||
usage_ = usage;
|
||||
impl_ = new Impl(_rows, _cols, _type, _usage);
|
||||
rows_ = _rows;
|
||||
cols_ = _cols;
|
||||
type_ = _type;
|
||||
usage_ = _usage;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -590,14 +590,14 @@ void cv::GlBuffer::release()
|
||||
void cv::GlBuffer::copyFrom(InputArray mat_)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)mat_;
|
||||
(void)mat_;
|
||||
throw_nogl;
|
||||
#else
|
||||
int kind = mat_.kind();
|
||||
Size size = mat_.size();
|
||||
int type = mat_.type();
|
||||
Size _size = mat_.size();
|
||||
int _type = mat_.type();
|
||||
|
||||
create(size, type);
|
||||
create(_size, _type);
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
@ -728,7 +728,7 @@ public:
|
||||
|
||||
private:
|
||||
Impl();
|
||||
|
||||
|
||||
GLuint tex_;
|
||||
};
|
||||
|
||||
@ -926,45 +926,45 @@ cv::GlTexture::GlTexture() : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTUR
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlTexture::GlTexture(int rows, int cols, int type) : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTURE_BUFFER)
|
||||
cv::GlTexture::GlTexture(int _rows, int _cols, int _type) : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTURE_BUFFER)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)rows;
|
||||
(void)cols;
|
||||
(void)type;
|
||||
(void)_rows;
|
||||
(void)_cols;
|
||||
(void)_type;
|
||||
throw_nogl;
|
||||
#else
|
||||
impl_ = new Impl(rows, cols, type);
|
||||
rows_ = rows;
|
||||
cols_ = cols;
|
||||
type_ = type;
|
||||
impl_ = new Impl(_rows, _cols, _type);
|
||||
rows_ = _rows;
|
||||
cols_ = _cols;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlTexture::GlTexture(Size size, int type) : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTURE_BUFFER)
|
||||
cv::GlTexture::GlTexture(Size _size, int _type) : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTURE_BUFFER)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)size;
|
||||
(void)type;
|
||||
(void)_size;
|
||||
(void)_type;
|
||||
throw_nogl;
|
||||
#else
|
||||
impl_ = new Impl(size.height, size.width, type);
|
||||
rows_ = size.height;
|
||||
cols_ = size.width;
|
||||
type_ = type;
|
||||
impl_ = new Impl(_size.height, _size.width, _type);
|
||||
rows_ = _size.height;
|
||||
cols_ = _size.width;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
cv::GlTexture::GlTexture(InputArray mat_, bool bgra) : rows_(0), cols_(0), type_(0), buf_(GlBuffer::TEXTURE_BUFFER)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)mat_;
|
||||
(void)bgra;
|
||||
(void)mat_;
|
||||
(void)bgra;
|
||||
throw_nogl;
|
||||
#else
|
||||
#else
|
||||
int kind = mat_.kind();
|
||||
Size size = mat_.size();
|
||||
int type = mat_.type();
|
||||
Size _size = mat_.size();
|
||||
int _type = mat_.type();
|
||||
|
||||
switch (kind)
|
||||
{
|
||||
@ -994,26 +994,26 @@ cv::GlTexture::GlTexture(InputArray mat_, bool bgra) : rows_(0), cols_(0), type_
|
||||
}
|
||||
}
|
||||
|
||||
rows_ = size.height;
|
||||
cols_ = size.width;
|
||||
type_ = type;
|
||||
rows_ = _size.height;
|
||||
cols_ = _size.width;
|
||||
type_ = _type;
|
||||
#endif
|
||||
}
|
||||
|
||||
void cv::GlTexture::create(int rows, int cols, int type)
|
||||
void cv::GlTexture::create(int _rows, int _cols, int _type)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)rows;
|
||||
(void)cols;
|
||||
(void)type;
|
||||
(void)_rows;
|
||||
(void)_cols;
|
||||
(void)_type;
|
||||
throw_nogl;
|
||||
#else
|
||||
if (rows_ != rows || cols_ != cols || type_ != type)
|
||||
if (rows_ != _rows || cols_ != _cols || type_ != _type)
|
||||
{
|
||||
impl_ = new Impl(rows, cols, type);
|
||||
rows_ = rows;
|
||||
cols_ = cols;
|
||||
type_ = type;
|
||||
impl_ = new Impl(_rows, _cols, _type);
|
||||
rows_ = _rows;
|
||||
cols_ = _cols;
|
||||
type_ = _type;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -1030,15 +1030,15 @@ void cv::GlTexture::release()
|
||||
void cv::GlTexture::copyFrom(InputArray mat_, bool bgra)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)mat_;
|
||||
(void)bgra;
|
||||
(void)mat_;
|
||||
(void)bgra;
|
||||
throw_nogl;
|
||||
#else
|
||||
int kind = mat_.kind();
|
||||
Size size = mat_.size();
|
||||
int type = mat_.type();
|
||||
Size _size = mat_.size();
|
||||
int _type = mat_.type();
|
||||
|
||||
create(size, type);
|
||||
create(_size, _type);
|
||||
|
||||
switch(kind)
|
||||
{
|
||||
@ -1244,8 +1244,8 @@ void cv::GlArrays::unbind() const
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// GlFont
|
||||
|
||||
cv::GlFont::GlFont(const string& family, int height, Weight weight, Style style)
|
||||
: family_(family), height_(height), weight_(weight), style_(style), base_(0)
|
||||
cv::GlFont::GlFont(const string& _family, int _height, Weight _weight, Style _style)
|
||||
: family_(_family), height_(_height), weight_(_weight), style_(_style), base_(0)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
throw_nogl;
|
||||
@ -1253,7 +1253,7 @@ cv::GlFont::GlFont(const string& family, int height, Weight weight, Style style)
|
||||
base_ = glGenLists(256);
|
||||
CV_CheckGlError();
|
||||
|
||||
glFuncTab()->generateBitmapFont(family, height, weight, (style & STYLE_ITALIC) != 0, (style & STYLE_UNDERLINE) != 0, 0, 256, base_);
|
||||
glFuncTab()->generateBitmapFont(family_, height_, weight_, (style_ & STYLE_ITALIC) != 0, (style_ & STYLE_UNDERLINE) != 0, 0, 256, base_);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -1283,7 +1283,7 @@ namespace
|
||||
class FontCompare : public unary_function<Ptr<GlFont>, bool>
|
||||
{
|
||||
public:
|
||||
inline FontCompare(const string& family, int height, GlFont::Weight weight, GlFont::Style style)
|
||||
inline FontCompare(const string& family, int height, GlFont::Weight weight, GlFont::Style style)
|
||||
: family_(family), height_(height), weight_(weight), style_(style)
|
||||
{
|
||||
}
|
||||
@ -1304,10 +1304,10 @@ namespace
|
||||
Ptr<GlFont> cv::GlFont::get(const std::string& family, int height, Weight weight, Style style)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)family;
|
||||
(void)height;
|
||||
(void)weight;
|
||||
(void)style;
|
||||
(void)family;
|
||||
(void)height;
|
||||
(void)weight;
|
||||
(void)style;
|
||||
throw_nogl;
|
||||
return Ptr<GlFont>();
|
||||
#else
|
||||
@ -1333,9 +1333,9 @@ Ptr<GlFont> cv::GlFont::get(const std::string& family, int height, Weight weight
|
||||
void cv::render(const GlTexture& tex, Rect_<double> wndRect, Rect_<double> texRect)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)tex;
|
||||
(void)wndRect;
|
||||
(void)texRect;
|
||||
(void)tex;
|
||||
(void)wndRect;
|
||||
(void)texRect;
|
||||
throw_nogl;
|
||||
#else
|
||||
if (!tex.empty())
|
||||
@ -1368,9 +1368,9 @@ void cv::render(const GlTexture& tex, Rect_<double> wndRect, Rect_<double> texRe
|
||||
void cv::render(const GlArrays& arr, int mode, Scalar color)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)arr;
|
||||
(void)mode;
|
||||
(void)color;
|
||||
(void)arr;
|
||||
(void)mode;
|
||||
(void)color;
|
||||
throw_nogl;
|
||||
#else
|
||||
glColor3d(color[0] / 255.0, color[1] / 255.0, color[2] / 255.0);
|
||||
@ -1386,10 +1386,10 @@ void cv::render(const GlArrays& arr, int mode, Scalar color)
|
||||
void cv::render(const string& str, const Ptr<GlFont>& font, Scalar color, Point2d pos)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)str;
|
||||
(void)font;
|
||||
(void)color;
|
||||
(void)pos;
|
||||
(void)str;
|
||||
(void)font;
|
||||
(void)color;
|
||||
(void)pos;
|
||||
throw_nogl;
|
||||
#else
|
||||
glPushAttrib(GL_DEPTH_BUFFER_BIT);
|
||||
@ -1544,9 +1544,9 @@ void cv::GlCamera::setupModelViewMatrix() const
|
||||
bool icvCheckGlError(const char* file, const int line, const char* func)
|
||||
{
|
||||
#ifndef HAVE_OPENGL
|
||||
(void)file;
|
||||
(void)line;
|
||||
(void)func;
|
||||
(void)file;
|
||||
(void)line;
|
||||
(void)func;
|
||||
return true;
|
||||
#else
|
||||
GLenum err = glGetError();
|
||||
|
@ -1262,7 +1262,7 @@ int Core_SetTest::test_set_ops( int iters )
|
||||
|
||||
if( iter > iters/10 && cvtest::randInt(rng)%200 == 0 ) // clear set
|
||||
{
|
||||
int prev_count = cvset->total;
|
||||
prev_count = cvset->total;
|
||||
cvClearSet( cvset );
|
||||
cvTsClearSimpleSet( sset );
|
||||
|
||||
@ -1482,19 +1482,19 @@ int Core_GraphTest::test_graph_ops( int iters )
|
||||
|
||||
if( cvtest::randInt(rng) % 200 == 0 ) // clear graph
|
||||
{
|
||||
int prev_vtx_count = graph->total, prev_edge_count = graph->edges->total;
|
||||
int prev_vtx_count2 = graph->total, prev_edge_count2 = graph->edges->total;
|
||||
|
||||
cvClearGraph( graph );
|
||||
cvTsClearSimpleGraph( sgraph );
|
||||
|
||||
CV_TS_SEQ_CHECK_CONDITION( graph->active_count == 0 && graph->total == 0 &&
|
||||
graph->first == 0 && graph->free_elems == 0 &&
|
||||
(graph->free_blocks != 0 || prev_vtx_count == 0),
|
||||
(graph->free_blocks != 0 || prev_vtx_count2 == 0),
|
||||
"The graph is not empty after clearing" );
|
||||
|
||||
CV_TS_SEQ_CHECK_CONDITION( edges->active_count == 0 && edges->total == 0 &&
|
||||
edges->first == 0 && edges->free_elems == 0 &&
|
||||
(edges->free_blocks != 0 || prev_edge_count == 0),
|
||||
(edges->free_blocks != 0 || prev_edge_count2 == 0),
|
||||
"The graph is not empty after clearing" );
|
||||
}
|
||||
else if( op == 0 ) // add vertex
|
||||
|
@ -22,25 +22,25 @@ void testReduce( const Mat& src, Mat& sum, Mat& avg, Mat& max, Mat& min, int dim
|
||||
assert( src.channels() == 1 );
|
||||
if( dim == 0 ) // row
|
||||
{
|
||||
sum.create( 1, src.cols, CV_64FC1 );
|
||||
sum.create( 1, src.cols, CV_64FC1 );
|
||||
max.create( 1, src.cols, CV_64FC1 );
|
||||
min.create( 1, src.cols, CV_64FC1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
sum.create( src.rows, 1, CV_64FC1 );
|
||||
sum.create( src.rows, 1, CV_64FC1 );
|
||||
max.create( src.rows, 1, CV_64FC1 );
|
||||
min.create( src.rows, 1, CV_64FC1 );
|
||||
}
|
||||
sum.setTo(Scalar(0));
|
||||
max.setTo(Scalar(-DBL_MAX));
|
||||
min.setTo(Scalar(DBL_MAX));
|
||||
|
||||
|
||||
const Mat_<Type>& src_ = src;
|
||||
Mat_<double>& sum_ = (Mat_<double>&)sum;
|
||||
Mat_<double>& min_ = (Mat_<double>&)min;
|
||||
Mat_<double>& max_ = (Mat_<double>&)max;
|
||||
|
||||
|
||||
if( dim == 0 )
|
||||
{
|
||||
for( int ri = 0; ri < src.rows; ri++ )
|
||||
@ -128,7 +128,7 @@ int Core_ReduceTest::checkOp( const Mat& src, int dstType, int opType, const Mat
|
||||
else if ( dstType == CV_32S )
|
||||
eps = 0.6;
|
||||
}
|
||||
|
||||
|
||||
assert( opRes.type() == CV_64FC1 );
|
||||
Mat _dst, dst, diff;
|
||||
reduce( src, _dst, dim, opType, dstType );
|
||||
@ -151,7 +151,7 @@ int Core_ReduceTest::checkOp( const Mat& src, int dstType, int opType, const Mat
|
||||
getMatTypeStr( src.type(), srcTypeStr );
|
||||
getMatTypeStr( dstType, dstTypeStr );
|
||||
const char* dimStr = dim == 0 ? "ROWS" : "COLS";
|
||||
|
||||
|
||||
sprintf( msg, "bad accuracy with srcType = %s, dstType = %s, opType = %s, dim = %s",
|
||||
srcTypeStr.c_str(), dstTypeStr.c_str(), opTypeStr, dimStr );
|
||||
ts->printf( cvtest::TS::LOG, msg );
|
||||
@ -164,10 +164,10 @@ int Core_ReduceTest::checkCase( int srcType, int dstType, int dim, Size sz )
|
||||
{
|
||||
int code = cvtest::TS::OK, tempCode;
|
||||
Mat src, sum, avg, max, min;
|
||||
|
||||
|
||||
src.create( sz, srcType );
|
||||
randu( src, Scalar(0), Scalar(100) );
|
||||
|
||||
|
||||
if( srcType == CV_8UC1 )
|
||||
testReduce<uchar>( src, sum, avg, max, min, dim );
|
||||
else if( srcType == CV_8SC1 )
|
||||
@ -182,110 +182,108 @@ int Core_ReduceTest::checkCase( int srcType, int dstType, int dim, Size sz )
|
||||
testReduce<float>( src, sum, avg, max, min, dim );
|
||||
else if( srcType == CV_64FC1 )
|
||||
testReduce<double>( src, sum, avg, max, min, dim );
|
||||
else
|
||||
else
|
||||
assert( 0 );
|
||||
|
||||
|
||||
// 1. sum
|
||||
tempCode = checkOp( src, dstType, CV_REDUCE_SUM, sum, dim );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// 2. avg
|
||||
tempCode = checkOp( src, dstType, CV_REDUCE_AVG, avg, dim );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// 3. max
|
||||
tempCode = checkOp( src, dstType, CV_REDUCE_MAX, max, dim );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// 4. min
|
||||
tempCode = checkOp( src, dstType, CV_REDUCE_MIN, min, dim );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
int Core_ReduceTest::checkDim( int dim, Size sz )
|
||||
{
|
||||
int code = cvtest::TS::OK, tempCode;
|
||||
|
||||
|
||||
// CV_8UC1
|
||||
tempCode = checkCase( CV_8UC1, CV_8UC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_8UC1, CV_32SC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_8UC1, CV_32FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_8UC1, CV_64FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// CV_16UC1
|
||||
tempCode = checkCase( CV_16UC1, CV_32FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_16UC1, CV_64FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// CV_16SC1
|
||||
tempCode = checkCase( CV_16SC1, CV_32FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_16SC1, CV_64FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// CV_32FC1
|
||||
tempCode = checkCase( CV_32FC1, CV_32FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkCase( CV_32FC1, CV_64FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
// CV_64FC1
|
||||
tempCode = checkCase( CV_64FC1, CV_64FC1, dim, sz );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
int Core_ReduceTest::checkSize( Size sz )
|
||||
{
|
||||
int code = cvtest::TS::OK, tempCode;
|
||||
|
||||
|
||||
tempCode = checkDim( 0, sz ); // rows
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
tempCode = checkDim( 1, sz ); // cols
|
||||
|
||||
tempCode = checkDim( 1, sz ); // cols
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
void Core_ReduceTest::run( int )
|
||||
{
|
||||
int code = cvtest::TS::OK, tempCode;
|
||||
|
||||
|
||||
tempCode = checkSize( Size(1,1) );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkSize( Size(1,100) );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkSize( Size(100,1) );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
tempCode = checkSize( Size(1000,500) );
|
||||
code = tempCode != cvtest::TS::OK ? tempCode : code;
|
||||
|
||||
|
||||
ts->set_failed_test_info( code );
|
||||
}
|
||||
|
||||
|
||||
#define CHECK_C
|
||||
|
||||
Size sz(200, 500);
|
||||
|
||||
class Core_PCATest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
@ -293,41 +291,43 @@ public:
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
const Size sz(200, 500);
|
||||
|
||||
double diffPrjEps, diffBackPrjEps,
|
||||
prjEps, backPrjEps,
|
||||
evalEps, evecEps;
|
||||
int maxComponents = 100;
|
||||
Mat rPoints(sz, CV_32FC1), rTestPoints(sz, CV_32FC1);
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
rng.fill( rPoints, RNG::UNIFORM, Scalar::all(0.0), Scalar::all(1.0) );
|
||||
rng.fill( rTestPoints, RNG::UNIFORM, Scalar::all(0.0), Scalar::all(1.0) );
|
||||
|
||||
|
||||
PCA rPCA( rPoints, Mat(), CV_PCA_DATA_AS_ROW, maxComponents ), cPCA;
|
||||
|
||||
|
||||
// 1. check C++ PCA & ROW
|
||||
Mat rPrjTestPoints = rPCA.project( rTestPoints );
|
||||
Mat rBackPrjTestPoints = rPCA.backProject( rPrjTestPoints );
|
||||
|
||||
|
||||
Mat avg(1, sz.width, CV_32FC1 );
|
||||
reduce( rPoints, avg, 0, CV_REDUCE_AVG );
|
||||
Mat Q = rPoints - repeat( avg, rPoints.rows, 1 ), Qt = Q.t(), eval, evec;
|
||||
Q = Qt * Q;
|
||||
Q = Q /(float)rPoints.rows;
|
||||
|
||||
|
||||
eigen( Q, eval, evec );
|
||||
/*SVD svd(Q);
|
||||
evec = svd.vt;
|
||||
eval = svd.w;*/
|
||||
|
||||
|
||||
Mat subEval( maxComponents, 1, eval.type(), eval.data ),
|
||||
subEvec( maxComponents, evec.cols, evec.type(), evec.data );
|
||||
|
||||
|
||||
#ifdef CHECK_C
|
||||
Mat prjTestPoints, backPrjTestPoints, cPoints = rPoints.t(), cTestPoints = rTestPoints.t();
|
||||
CvMat _points, _testPoints, _avg, _eval, _evec, _prjTestPoints, _backPrjTestPoints;
|
||||
#endif
|
||||
|
||||
|
||||
// check eigen()
|
||||
double eigenEps = 1e-6;
|
||||
double err;
|
||||
@ -335,7 +335,7 @@ protected:
|
||||
{
|
||||
Mat v = evec.row(i).t();
|
||||
Mat Qv = Q * v;
|
||||
|
||||
|
||||
Mat lv = eval.at<float>(i,0) * v;
|
||||
err = norm( Qv, lv );
|
||||
if( err > eigenEps )
|
||||
@ -370,7 +370,7 @@ protected:
|
||||
absdiff(rPCA.eigenvectors, subEvec, tmp);
|
||||
double mval = 0; Point mloc;
|
||||
minMaxLoc(tmp, 0, &mval, 0, &mloc);
|
||||
|
||||
|
||||
ts->printf( cvtest::TS::LOG, "pca.eigenvectors is incorrect (CV_PCA_DATA_AS_ROW); err = %f\n", err );
|
||||
ts->printf( cvtest::TS::LOG, "max diff is %g at (i=%d, j=%d) (%g vs %g)\n",
|
||||
mval, mloc.y, mloc.x, rPCA.eigenvectors.at<float>(mloc.y, mloc.x),
|
||||
@ -380,7 +380,7 @@ protected:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
prjEps = 1.265, backPrjEps = 1.265;
|
||||
for( int i = 0; i < rTestPoints.rows; i++ )
|
||||
{
|
||||
@ -404,7 +404,7 @@ protected:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 2. check C++ PCA & COL
|
||||
cPCA( rPoints.t(), Mat(), CV_PCA_DATA_AS_COL, maxComponents );
|
||||
diffPrjEps = 1, diffBackPrjEps = 1;
|
||||
@ -423,7 +423,7 @@ protected:
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
#ifdef CHECK_C
|
||||
// 3. check C PCA & ROW
|
||||
_points = rPoints;
|
||||
@ -435,11 +435,11 @@ protected:
|
||||
backPrjTestPoints.create(rPoints.size(), rPoints.type() );
|
||||
_prjTestPoints = prjTestPoints;
|
||||
_backPrjTestPoints = backPrjTestPoints;
|
||||
|
||||
|
||||
cvCalcPCA( &_points, &_avg, &_eval, &_evec, CV_PCA_DATA_AS_ROW );
|
||||
cvProjectPCA( &_testPoints, &_avg, &_evec, &_prjTestPoints );
|
||||
cvBackProjectPCA( &_prjTestPoints, &_avg, &_evec, &_backPrjTestPoints );
|
||||
|
||||
|
||||
err = norm(prjTestPoints, rPrjTestPoints, CV_RELATIVE_L2);
|
||||
if( err > diffPrjEps )
|
||||
{
|
||||
@ -454,7 +454,7 @@ protected:
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// 3. check C PCA & COL
|
||||
_points = cPoints;
|
||||
_testPoints = cTestPoints;
|
||||
@ -463,11 +463,11 @@ protected:
|
||||
evec = evec.t(); _evec = evec;
|
||||
prjTestPoints = prjTestPoints.t(); _prjTestPoints = prjTestPoints;
|
||||
backPrjTestPoints = backPrjTestPoints.t(); _backPrjTestPoints = backPrjTestPoints;
|
||||
|
||||
|
||||
cvCalcPCA( &_points, &_avg, &_eval, &_evec, CV_PCA_DATA_AS_COL );
|
||||
cvProjectPCA( &_testPoints, &_avg, &_evec, &_prjTestPoints );
|
||||
cvBackProjectPCA( &_prjTestPoints, &_avg, &_evec, &_backPrjTestPoints );
|
||||
|
||||
|
||||
err = norm(cv::abs(prjTestPoints), cv::abs(rPrjTestPoints.t()), CV_RELATIVE_L2 );
|
||||
if( err > diffPrjEps )
|
||||
{
|
||||
@ -490,9 +490,9 @@ class Core_ArrayOpTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
Core_ArrayOpTest();
|
||||
~Core_ArrayOpTest();
|
||||
~Core_ArrayOpTest();
|
||||
protected:
|
||||
void run(int);
|
||||
void run(int);
|
||||
};
|
||||
|
||||
|
||||
@ -536,7 +536,7 @@ static double getValue(SparseMat& M, const int* idx, RNG& rng)
|
||||
d == 3 ? M.hash(idx[0], idx[1], idx[2]) : M.hash(idx);
|
||||
phv = &hv;
|
||||
}
|
||||
|
||||
|
||||
const uchar* ptr = d == 2 ? M.ptr(idx[0], idx[1], false, phv) :
|
||||
d == 3 ? M.ptr(idx[0], idx[1], idx[2], false, phv) :
|
||||
M.ptr(idx, false, phv);
|
||||
@ -560,7 +560,7 @@ static void eraseValue(SparseMat& M, const int* idx, RNG& rng)
|
||||
d == 3 ? M.hash(idx[0], idx[1], idx[2]) : M.hash(idx);
|
||||
phv = &hv;
|
||||
}
|
||||
|
||||
|
||||
if( d == 2 )
|
||||
M.erase(idx[0], idx[1], phv);
|
||||
else if( d == 3 )
|
||||
@ -584,7 +584,7 @@ static void setValue(SparseMat& M, const int* idx, double value, RNG& rng)
|
||||
d == 3 ? M.hash(idx[0], idx[1], idx[2]) : M.hash(idx);
|
||||
phv = &hv;
|
||||
}
|
||||
|
||||
|
||||
uchar* ptr = d == 2 ? M.ptr(idx[0], idx[1], true, phv) :
|
||||
d == 3 ? M.ptr(idx[0], idx[1], idx[2], true, phv) :
|
||||
M.ptr(idx, true, phv);
|
||||
@ -599,7 +599,7 @@ static void setValue(SparseMat& M, const int* idx, double value, RNG& rng)
|
||||
void Core_ArrayOpTest::run( int /* start_from */)
|
||||
{
|
||||
int errcount = 0;
|
||||
|
||||
|
||||
// dense matrix operations
|
||||
{
|
||||
int sz3[] = {5, 10, 15};
|
||||
@ -608,7 +608,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
RNG rng;
|
||||
rng.fill(A, CV_RAND_UNI, Scalar::all(-10), Scalar::all(10));
|
||||
rng.fill(B, CV_RAND_UNI, Scalar::all(-10), Scalar::all(10));
|
||||
|
||||
|
||||
int idx0[] = {3,4,5}, idx1[] = {0, 9, 7};
|
||||
float val0 = 130;
|
||||
Scalar val1(-1000, 30, 3, 8);
|
||||
@ -617,12 +617,12 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
cvSetND(&matB, idx0, val1);
|
||||
cvSet3D(&matB, idx1[0], idx1[1], idx1[2], -val1);
|
||||
Ptr<CvMatND> matC = cvCloneMatND(&matB);
|
||||
|
||||
|
||||
if( A.at<float>(idx0[0], idx0[1], idx0[2]) != val0 ||
|
||||
A.at<float>(idx1[0], idx1[1], idx1[2]) != -val0 ||
|
||||
cvGetReal3D(&matA, idx0[0], idx0[1], idx0[2]) != val0 ||
|
||||
cvGetRealND(&matA, idx1) != -val0 ||
|
||||
|
||||
|
||||
Scalar(B.at<Vec4s>(idx0[0], idx0[1], idx0[2])) != val1 ||
|
||||
Scalar(B.at<Vec4s>(idx1[0], idx1[1], idx1[2])) != -val1 ||
|
||||
Scalar(cvGet3D(matC, idx0[0], idx0[1], idx0[2])) != val1 ||
|
||||
@ -633,7 +633,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
errcount++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RNG rng;
|
||||
const int MAX_DIM = 5, MAX_DIM_SZ = 10;
|
||||
// sparse matrix operations
|
||||
@ -647,7 +647,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
vector<double> all_vals2;
|
||||
string sidx, min_sidx, max_sidx;
|
||||
double min_val=0, max_val=0;
|
||||
|
||||
|
||||
int p = 1;
|
||||
for( k = 0; k < dims; k++ )
|
||||
{
|
||||
@ -656,7 +656,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
}
|
||||
SparseMat M( dims, size, depth );
|
||||
map<string, double> M0;
|
||||
|
||||
|
||||
int nz0 = (unsigned)rng % max(p/5,10);
|
||||
nz0 = min(max(nz0, 1), p);
|
||||
all_vals.resize(nz0);
|
||||
@ -676,12 +676,12 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
_all_vals2.convertTo(_all_vals2_f, CV_32F);
|
||||
_all_vals2_f.convertTo(_all_vals2, CV_64F);
|
||||
}
|
||||
|
||||
|
||||
minMaxLoc(_all_vals, &min_val, &max_val);
|
||||
double _norm0 = norm(_all_vals, CV_C);
|
||||
double _norm1 = norm(_all_vals, CV_L1);
|
||||
double _norm2 = norm(_all_vals, CV_L2);
|
||||
|
||||
|
||||
for( i = 0; i < nz0; i++ )
|
||||
{
|
||||
for(;;)
|
||||
@ -708,18 +708,18 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Ptr<CvSparseMat> M2 = (CvSparseMat*)M;
|
||||
MatND Md;
|
||||
M.copyTo(Md);
|
||||
SparseMat M3; SparseMat(Md).convertTo(M3, Md.type(), 2);
|
||||
|
||||
|
||||
int nz1 = (int)M.nzcount(), nz2 = (int)M3.nzcount();
|
||||
double norm0 = norm(M, CV_C);
|
||||
double norm1 = norm(M, CV_L1);
|
||||
double norm2 = norm(M, CV_L2);
|
||||
double eps = depth == CV_32F ? FLT_EPSILON*100 : DBL_EPSILON*1000;
|
||||
|
||||
|
||||
if( nz1 != nz0 || nz2 != nz0)
|
||||
{
|
||||
errcount++;
|
||||
@ -727,7 +727,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
si, nz1, nz2, nz0 );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if( fabs(norm0 - _norm0) > fabs(_norm0)*eps ||
|
||||
fabs(norm1 - _norm1) > fabs(_norm1)*eps ||
|
||||
fabs(norm2 - _norm2) > fabs(_norm2)*eps )
|
||||
@ -737,10 +737,10 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
si, norm0, norm1, norm2, _norm0, _norm1, _norm2 );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
int n = (unsigned)rng % max(p/5,10);
|
||||
n = min(max(n, 1), p) + nz0;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
double val1, val2, val3, val0;
|
||||
@ -760,7 +760,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
val1 = getValue(M, idx, rng);
|
||||
val2 = getValue(M2, idx);
|
||||
val3 = getValue(M3, idx, rng);
|
||||
|
||||
|
||||
if( val1 != val0 || val2 != val0 || fabs(val3 - val0*2) > fabs(val0*2)*FLT_EPSILON )
|
||||
{
|
||||
errcount++;
|
||||
@ -768,7 +768,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
double val1, val2;
|
||||
@ -792,9 +792,9 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
errcount++;
|
||||
ts->printf(cvtest::TS::LOG, "SparseMat: after deleting M[%s], it is =%g/%g (while it should be 0)\n", sidx.c_str(), val1, val2 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int nz = (int)M.nzcount();
|
||||
if( nz != 0 )
|
||||
{
|
||||
@ -802,7 +802,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
ts->printf(cvtest::TS::LOG, "The number of non-zero elements after removing all the elements = %d (while it should be 0)\n", nz );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
int idx1[MAX_DIM], idx2[MAX_DIM];
|
||||
double val1 = 0, val2 = 0;
|
||||
M3 = SparseMat(Md);
|
||||
@ -816,7 +816,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
min_val, max_val, min_sidx.c_str(), max_sidx.c_str());
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
minMaxIdx(Md, &val1, &val2, idx1, idx2);
|
||||
s1 = idx2string(idx1, dims), s2 = idx2string(idx2, dims);
|
||||
if( (min_val < 0 && (val1 != min_val || s1 != min_sidx)) ||
|
||||
@ -829,7 +829,7 @@ void Core_ArrayOpTest::run( int /* start_from */)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ts->set_failed_test_info(errcount == 0 ? cvtest::TS::OK : cvtest::TS::FAIL_INVALID_OUTPUT);
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ static double chi2_p95(int n)
|
||||
36.42f, 37.65f, 38.89f, 40.11f, 41.34f, 42.56f, 43.77f };
|
||||
static const double xp = 1.64;
|
||||
CV_Assert(n >= 1);
|
||||
|
||||
|
||||
if( n <= 30 )
|
||||
return chi2_tab95[n-1];
|
||||
return n + sqrt((double)2*n)*xp + 0.6666666666666*(xp*xp - 1);
|
||||
@ -40,12 +40,12 @@ bool Core_RandTest::check_pdf(const Mat& hist, double scale,
|
||||
const int* H = (const int*)hist.data;
|
||||
float* H0 = ((float*)hist0.data);
|
||||
int i, hsz = hist.cols;
|
||||
|
||||
|
||||
double sum = 0;
|
||||
for( i = 0; i < hsz; i++ )
|
||||
sum += H[i];
|
||||
CV_Assert( fabs(1./sum - scale) < FLT_EPSILON );
|
||||
|
||||
|
||||
if( dist_type == CV_RAND_UNI )
|
||||
{
|
||||
float scale0 = (float)(1./hsz);
|
||||
@ -54,19 +54,19 @@ bool Core_RandTest::check_pdf(const Mat& hist, double scale,
|
||||
}
|
||||
else
|
||||
{
|
||||
double sum = 0, r = (hsz-1.)/2;
|
||||
double sum2 = 0, r = (hsz-1.)/2;
|
||||
double alpha = 2*sqrt(2.)/r, beta = -alpha*r;
|
||||
for( i = 0; i < hsz; i++ )
|
||||
{
|
||||
double x = i*alpha + beta;
|
||||
H0[i] = (float)exp(-x*x);
|
||||
sum += H0[i];
|
||||
sum2 += H0[i];
|
||||
}
|
||||
sum = 1./sum;
|
||||
sum2 = 1./sum2;
|
||||
for( i = 0; i < hsz; i++ )
|
||||
H0[i] = (float)(H0[i]*sum);
|
||||
H0[i] = (float)(H0[i]*sum2);
|
||||
}
|
||||
|
||||
|
||||
double chi2 = 0;
|
||||
for( i = 0; i < hsz; i++ )
|
||||
{
|
||||
@ -76,7 +76,7 @@ bool Core_RandTest::check_pdf(const Mat& hist, double scale,
|
||||
chi2 += (a - b)*(a - b)/(a + b);
|
||||
}
|
||||
realval = chi2;
|
||||
|
||||
|
||||
double chi2_pval = chi2_p95(hsz - 1 - (dist_type == CV_RAND_NORMAL ? 2 : 0));
|
||||
refval = chi2_pval*0.01;
|
||||
return realval <= refval;
|
||||
@ -87,22 +87,22 @@ void Core_RandTest::run( int )
|
||||
static int _ranges[][2] =
|
||||
{{ 0, 256 }, { -128, 128 }, { 0, 65536 }, { -32768, 32768 },
|
||||
{ -1000000, 1000000 }, { -1000, 1000 }, { -1000, 1000 }};
|
||||
|
||||
|
||||
const int MAX_SDIM = 10;
|
||||
const int N = 2000000;
|
||||
const int maxSlice = 1000;
|
||||
const int MAX_HIST_SIZE = 1000;
|
||||
int progress = 0;
|
||||
|
||||
|
||||
RNG& rng = ts->get_rng();
|
||||
RNG tested_rng = theRNG();
|
||||
test_case_count = 200;
|
||||
|
||||
|
||||
for( int idx = 0; idx < test_case_count; idx++ )
|
||||
{
|
||||
progress = update_progress( progress, idx, test_case_count, 0 );
|
||||
ts->update_context( this, idx, false );
|
||||
|
||||
|
||||
int depth = cvtest::randInt(rng) % (CV_64F+1);
|
||||
int c, cn = (cvtest::randInt(rng) % 4) + 1;
|
||||
int type = CV_MAKETYPE(depth, cn);
|
||||
@ -113,15 +113,15 @@ void Core_RandTest::run( int )
|
||||
double eps = 1.e-4;
|
||||
if (depth == CV_64F)
|
||||
eps = 1.e-7;
|
||||
|
||||
|
||||
bool do_sphere_test = dist_type == CV_RAND_UNI;
|
||||
Mat arr[2], hist[4];
|
||||
int W[] = {0,0,0,0};
|
||||
|
||||
|
||||
arr[0].create(1, SZ, type);
|
||||
arr[1].create(1, SZ, type);
|
||||
bool fast_algo = dist_type == CV_RAND_UNI && depth < CV_32F;
|
||||
|
||||
|
||||
for( c = 0; c < cn; c++ )
|
||||
{
|
||||
int a, b, hsz;
|
||||
@ -137,7 +137,7 @@ void Core_RandTest::run( int )
|
||||
while( abs(a-b) <= 1 );
|
||||
if( a > b )
|
||||
std::swap(a, b);
|
||||
|
||||
|
||||
unsigned r = (unsigned)(b - a);
|
||||
fast_algo = fast_algo && r <= 256 && (r & (r-1)) == 0;
|
||||
hsz = min((unsigned)(b - a), (unsigned)MAX_HIST_SIZE);
|
||||
@ -149,7 +149,7 @@ void Core_RandTest::run( int )
|
||||
int meanrange = vrange/16;
|
||||
int mindiv = MAX(vrange/20, 5);
|
||||
int maxdiv = MIN(vrange/8, 10000);
|
||||
|
||||
|
||||
a = cvtest::randInt(rng) % meanrange - meanrange/2 +
|
||||
(_ranges[depth][0] + _ranges[depth][1])/2;
|
||||
b = cvtest::randInt(rng) % (maxdiv - mindiv) + mindiv;
|
||||
@ -157,9 +157,9 @@ void Core_RandTest::run( int )
|
||||
}
|
||||
A[c] = a;
|
||||
B[c] = b;
|
||||
hist[c].create(1, hsz, CV_32S);
|
||||
hist[c].create(1, hsz, CV_32S);
|
||||
}
|
||||
|
||||
|
||||
cv::RNG saved_rng = tested_rng;
|
||||
int maxk = fast_algo ? 0 : 1;
|
||||
for( k = 0; k <= maxk; k++ )
|
||||
@ -173,14 +173,14 @@ void Core_RandTest::run( int )
|
||||
tested_rng.fill(aslice, dist_type, A, B);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( maxk >= 1 && norm(arr[0], arr[1], NORM_INF) > eps)
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "RNG output depends on the array lengths (some generated numbers get lost?)" );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_INVALID_OUTPUT );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
for( c = 0; c < cn; c++ )
|
||||
{
|
||||
const uchar* data = arr[0].data;
|
||||
@ -190,9 +190,9 @@ void Core_RandTest::run( int )
|
||||
double maxVal = dist_type == CV_RAND_UNI ? B[c] : A[c] + B[c]*4;
|
||||
double scale = HSZ/(maxVal - minVal);
|
||||
double delta = -minVal*scale;
|
||||
|
||||
|
||||
hist[c] = Scalar::all(0);
|
||||
|
||||
|
||||
for( i = c; i < SZ*cn; i += cn )
|
||||
{
|
||||
double val = depth == CV_8U ? ((const uchar*)data)[i] :
|
||||
@ -221,7 +221,7 @@ void Core_RandTest::run( int )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( dist_type == CV_RAND_UNI && W[c] != SZ )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "Uniform RNG gave values out of the range [%g,%g) on channel %d/%d\n",
|
||||
@ -237,7 +237,7 @@ void Core_RandTest::run( int )
|
||||
return;
|
||||
}
|
||||
double refval = 0, realval = 0;
|
||||
|
||||
|
||||
if( !check_pdf(hist[c], 1./W[c], dist_type, refval, realval) )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "RNG failed Chi-square test "
|
||||
@ -247,13 +247,13 @@ void Core_RandTest::run( int )
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Monte-Carlo test. Compute volume of SDIM-dimensional sphere
|
||||
// inscribed in [-1,1]^SDIM cube.
|
||||
if( do_sphere_test )
|
||||
{
|
||||
int SDIM = cvtest::randInt(rng) % (MAX_SDIM-1) + 2;
|
||||
int N0 = (SZ*cn/SDIM), N = 0;
|
||||
int N0 = (SZ*cn/SDIM), n = 0;
|
||||
double r2 = 0;
|
||||
const uchar* data = arr[0].data;
|
||||
double scale[4], delta[4];
|
||||
@ -262,7 +262,7 @@ void Core_RandTest::run( int )
|
||||
scale[c] = 2./(B[c] - A[c]);
|
||||
delta[c] = -A[c]*scale[c] - 1;
|
||||
}
|
||||
|
||||
|
||||
for( i = k = c = 0; i <= SZ*cn - SDIM; i++, k++, c++ )
|
||||
{
|
||||
double val = depth == CV_8U ? ((const uchar*)data)[i] :
|
||||
@ -276,20 +276,20 @@ void Core_RandTest::run( int )
|
||||
r2 += val*val;
|
||||
if( k == SDIM-1 )
|
||||
{
|
||||
N += r2 <= 1;
|
||||
n += r2 <= 1;
|
||||
r2 = 0;
|
||||
k = -1;
|
||||
}
|
||||
}
|
||||
|
||||
double V = ((double)N/N0)*(1 << SDIM);
|
||||
|
||||
|
||||
double V = ((double)n/N0)*(1 << SDIM);
|
||||
|
||||
// the theoretically computed volume
|
||||
int sdim = SDIM % 2;
|
||||
double V0 = sdim + 1;
|
||||
for( sdim += 2; sdim <= SDIM; sdim += 2 )
|
||||
V0 *= 2*CV_PI/sdim;
|
||||
|
||||
|
||||
if( fabs(V - V0) > 0.3*fabs(V0) )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "RNG failed %d-dim sphere volume test (got %g instead of %g)\n",
|
||||
@ -309,7 +309,7 @@ class Core_RandRangeTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
Core_RandRangeTest() {}
|
||||
~Core_RandRangeTest() {}
|
||||
~Core_RandRangeTest() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
@ -319,7 +319,7 @@ protected:
|
||||
theRNG().fill(af, RNG::UNIFORM, -DBL_MAX, DBL_MAX);
|
||||
int n0 = 0, n255 = 0, nx = 0;
|
||||
int nfmin = 0, nfmax = 0, nfx = 0;
|
||||
|
||||
|
||||
for( int i = 0; i < a.rows; i++ )
|
||||
for( int j = 0; j < a.cols; j++ )
|
||||
{
|
||||
|
@ -110,10 +110,10 @@ Mat BOWKMeansTrainer::cluster() const
|
||||
BOWKMeansTrainer::~BOWKMeansTrainer()
|
||||
{}
|
||||
|
||||
Mat BOWKMeansTrainer::cluster( const Mat& descriptors ) const
|
||||
Mat BOWKMeansTrainer::cluster( const Mat& _descriptors ) const
|
||||
{
|
||||
Mat labels, vocabulary;
|
||||
kmeans( descriptors, clusterCount, labels, termcrit, attempts, flags, vocabulary );
|
||||
kmeans( _descriptors, clusterCount, labels, termcrit, attempts, flags, vocabulary );
|
||||
return vocabulary;
|
||||
}
|
||||
|
||||
|
@ -127,8 +127,8 @@ int BriefDescriptorExtractor::descriptorType() const
|
||||
|
||||
void BriefDescriptorExtractor::read( const FileNode& fn)
|
||||
{
|
||||
int descriptorSize = fn["descriptorSize"];
|
||||
switch (descriptorSize)
|
||||
int dSize = fn["descriptorSize"];
|
||||
switch (dSize)
|
||||
{
|
||||
case 16:
|
||||
test_fn_ = pixelTests16;
|
||||
@ -142,7 +142,7 @@ void BriefDescriptorExtractor::read( const FileNode& fn)
|
||||
default:
|
||||
CV_Error(CV_StsBadArg, "descriptorSize must be 16, 32, or 64");
|
||||
}
|
||||
bytes_ = descriptorSize;
|
||||
bytes_ = dSize;
|
||||
}
|
||||
|
||||
void BriefDescriptorExtractor::write( FileStorage& fs) const
|
||||
|
@ -223,8 +223,8 @@ void OpponentColorDescriptorExtractor::computeImpl( const Mat& bgrImage, vector<
|
||||
vector<KeyPoint> outKeypoints;
|
||||
outKeypoints.reserve( keypoints.size() );
|
||||
|
||||
int descriptorSize = descriptorExtractor->descriptorSize();
|
||||
Mat mergedDescriptors( maxKeypointsCount, 3*descriptorSize, descriptorExtractor->descriptorType() );
|
||||
int dSize = descriptorExtractor->descriptorSize();
|
||||
Mat mergedDescriptors( maxKeypointsCount, 3*dSize, descriptorExtractor->descriptorType() );
|
||||
int mergedCount = 0;
|
||||
// cp - current channel position
|
||||
size_t cp[] = {0, 0, 0};
|
||||
@ -250,7 +250,7 @@ void OpponentColorDescriptorExtractor::computeImpl( const Mat& bgrImage, vector<
|
||||
// merge descriptors
|
||||
for( int ci = 0; ci < N; ci++ )
|
||||
{
|
||||
Mat dst = mergedDescriptors(Range(mergedCount, mergedCount+1), Range(ci*descriptorSize, (ci+1)*descriptorSize));
|
||||
Mat dst = mergedDescriptors(Range(mergedCount, mergedCount+1), Range(ci*dSize, (ci+1)*dSize));
|
||||
channelDescriptors[ci].row( idxs[ci][cp[ci]] ).copyTo( dst );
|
||||
cp[ci]++;
|
||||
}
|
||||
|
@ -156,11 +156,11 @@ static void _prepareImgAndDrawKeypoints( const Mat& img1, const vector<KeyPoint>
|
||||
// draw keypoints
|
||||
if( !(flags & DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS) )
|
||||
{
|
||||
Mat outImg1 = outImg( Rect(0, 0, img1.cols, img1.rows) );
|
||||
drawKeypoints( outImg1, keypoints1, outImg1, singlePointColor, flags + DrawMatchesFlags::DRAW_OVER_OUTIMG );
|
||||
Mat _outImg1 = outImg( Rect(0, 0, img1.cols, img1.rows) );
|
||||
drawKeypoints( _outImg1, keypoints1, _outImg1, singlePointColor, flags + DrawMatchesFlags::DRAW_OVER_OUTIMG );
|
||||
|
||||
Mat outImg2 = outImg( Rect(img1.cols, 0, img2.cols, img2.rows) );
|
||||
drawKeypoints( outImg2, keypoints2, outImg2, singlePointColor, flags + DrawMatchesFlags::DRAW_OVER_OUTIMG );
|
||||
Mat _outImg2 = outImg( Rect(img1.cols, 0, img2.cols, img2.rows) );
|
||||
drawKeypoints( _outImg2, keypoints2, _outImg2, singlePointColor, flags + DrawMatchesFlags::DRAW_OVER_OUTIMG );
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,9 +178,9 @@ static inline void _drawMatch( Mat& outImg, Mat& outImg1, Mat& outImg2 ,
|
||||
pt2 = kp2.pt,
|
||||
dpt2 = Point2f( std::min(pt2.x+outImg1.cols, float(outImg.cols-1)), pt2.y );
|
||||
|
||||
line( outImg,
|
||||
Point(cvRound(pt1.x*draw_multiplier), cvRound(pt1.y*draw_multiplier)),
|
||||
Point(cvRound(dpt2.x*draw_multiplier), cvRound(dpt2.y*draw_multiplier)),
|
||||
line( outImg,
|
||||
Point(cvRound(pt1.x*draw_multiplier), cvRound(pt1.y*draw_multiplier)),
|
||||
Point(cvRound(dpt2.x*draw_multiplier), cvRound(dpt2.y*draw_multiplier)),
|
||||
color, 1, CV_AA, draw_shift_bits );
|
||||
}
|
||||
|
||||
|
@ -109,11 +109,14 @@ class CV_EXPORTS HarrisDetector : public GFTTDetector
|
||||
{
|
||||
public:
|
||||
HarrisDetector( int maxCorners=1000, double qualityLevel=0.01, double minDistance=1,
|
||||
int blockSize=3, bool useHarrisDetector=true, double k=0.04 )
|
||||
: GFTTDetector( maxCorners, qualityLevel, minDistance, blockSize, useHarrisDetector, k ) {}
|
||||
int blockSize=3, bool useHarrisDetector=true, double k=0.04 );
|
||||
AlgorithmInfo* info() const;
|
||||
};
|
||||
|
||||
inline HarrisDetector::HarrisDetector( int _maxCorners, double _qualityLevel, double _minDistance,
|
||||
int _blockSize, bool _useHarrisDetector, double _k )
|
||||
: GFTTDetector( _maxCorners, _qualityLevel, _minDistance, _blockSize, _useHarrisDetector, _k ) {}
|
||||
|
||||
CV_INIT_ALGORITHM(HarrisDetector, "Feature2D.HARRIS",
|
||||
obj.info()->addParam(obj, "nfeatures", obj.nfeatures);
|
||||
obj.info()->addParam(obj, "qualityLevel", obj.qualityLevel);
|
||||
|
@ -539,7 +539,7 @@ void FlannBasedMatcher::read( const FileNode& fn)
|
||||
for(int i = 0; i < (int)ip.size(); ++i)
|
||||
{
|
||||
CV_Assert(ip[i].type() == FileNode::MAP);
|
||||
std::string name = (std::string)ip[i]["name"];
|
||||
std::string _name = (std::string)ip[i]["name"];
|
||||
int type = (int)ip[i]["type"];
|
||||
|
||||
switch(type)
|
||||
@ -549,19 +549,19 @@ void FlannBasedMatcher::read( const FileNode& fn)
|
||||
case CV_16U:
|
||||
case CV_16S:
|
||||
case CV_32S:
|
||||
indexParams->setInt(name, (int) ip[i]["value"]);
|
||||
indexParams->setInt(_name, (int) ip[i]["value"]);
|
||||
break;
|
||||
case CV_32F:
|
||||
indexParams->setFloat(name, (float) ip[i]["value"]);
|
||||
indexParams->setFloat(_name, (float) ip[i]["value"]);
|
||||
break;
|
||||
case CV_64F:
|
||||
indexParams->setDouble(name, (double) ip[i]["value"]);
|
||||
indexParams->setDouble(_name, (double) ip[i]["value"]);
|
||||
break;
|
||||
case CV_USRTYPE1:
|
||||
indexParams->setString(name, (std::string) ip[i]["value"]);
|
||||
indexParams->setString(_name, (std::string) ip[i]["value"]);
|
||||
break;
|
||||
case CV_MAKETYPE(CV_USRTYPE1,2):
|
||||
indexParams->setBool(name, (int) ip[i]["value"] != 0);
|
||||
indexParams->setBool(_name, (int) ip[i]["value"] != 0);
|
||||
break;
|
||||
case CV_MAKETYPE(CV_USRTYPE1,3):
|
||||
indexParams->setAlgorithm((int) ip[i]["value"]);
|
||||
@ -578,7 +578,7 @@ void FlannBasedMatcher::read( const FileNode& fn)
|
||||
for(int i = 0; i < (int)sp.size(); ++i)
|
||||
{
|
||||
CV_Assert(sp[i].type() == FileNode::MAP);
|
||||
std::string name = (std::string)sp[i]["name"];
|
||||
std::string _name = (std::string)sp[i]["name"];
|
||||
int type = (int)sp[i]["type"];
|
||||
|
||||
switch(type)
|
||||
@ -588,19 +588,19 @@ void FlannBasedMatcher::read( const FileNode& fn)
|
||||
case CV_16U:
|
||||
case CV_16S:
|
||||
case CV_32S:
|
||||
searchParams->setInt(name, (int) sp[i]["value"]);
|
||||
searchParams->setInt(_name, (int) sp[i]["value"]);
|
||||
break;
|
||||
case CV_32F:
|
||||
searchParams->setFloat(name, (float) ip[i]["value"]);
|
||||
searchParams->setFloat(_name, (float) ip[i]["value"]);
|
||||
break;
|
||||
case CV_64F:
|
||||
searchParams->setDouble(name, (double) ip[i]["value"]);
|
||||
searchParams->setDouble(_name, (double) ip[i]["value"]);
|
||||
break;
|
||||
case CV_USRTYPE1:
|
||||
searchParams->setString(name, (std::string) ip[i]["value"]);
|
||||
searchParams->setString(_name, (std::string) ip[i]["value"]);
|
||||
break;
|
||||
case CV_MAKETYPE(CV_USRTYPE1,2):
|
||||
searchParams->setBool(name, (int) ip[i]["value"] != 0);
|
||||
searchParams->setBool(_name, (int) ip[i]["value"] != 0);
|
||||
break;
|
||||
case CV_MAKETYPE(CV_USRTYPE1,3):
|
||||
searchParams->setAlgorithm((int) ip[i]["value"]);
|
||||
|
@ -539,8 +539,8 @@ static void extractMSER_8UC1_Pass( int* ioptr,
|
||||
}
|
||||
*imgptr += 0x10000;
|
||||
}
|
||||
int i = (int)(imgptr-ioptr);
|
||||
ptsptr->pt = cvPoint( i&stepmask, i>>stepgap );
|
||||
int imsk = (int)(imgptr-ioptr);
|
||||
ptsptr->pt = cvPoint( imsk&stepmask, imsk>>stepgap );
|
||||
// get the current location
|
||||
accumulateMSERComp( comptr, ptsptr );
|
||||
ptsptr++;
|
||||
|
@ -555,9 +555,9 @@ static inline float getScale(int level, int firstLevel, double scaleFactor)
|
||||
* @param detector_params parameters to use
|
||||
*/
|
||||
ORB::ORB(int _nfeatures, float _scaleFactor, int _nlevels, int _edgeThreshold,
|
||||
int _firstLevel, int WTA_K, int _scoreType, int _patchSize) :
|
||||
int _firstLevel, int _WTA_K, int _scoreType, int _patchSize) :
|
||||
nfeatures(_nfeatures), scaleFactor(_scaleFactor), nlevels(_nlevels),
|
||||
edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(WTA_K),
|
||||
edgeThreshold(_edgeThreshold), firstLevel(_firstLevel), WTA_K(_WTA_K),
|
||||
scoreType(_scoreType), patchSize(_patchSize)
|
||||
{}
|
||||
|
||||
@ -653,8 +653,8 @@ static void computeKeyPoints(const vector<Mat>& imagePyramid,
|
||||
|
||||
for (int level = 0; level < nlevels; ++level)
|
||||
{
|
||||
int nfeatures = nfeaturesPerLevel[level];
|
||||
allKeypoints[level].reserve(nfeatures*2);
|
||||
int featuresNum = nfeaturesPerLevel[level];
|
||||
allKeypoints[level].reserve(featuresNum*2);
|
||||
|
||||
vector<KeyPoint> & keypoints = allKeypoints[level];
|
||||
|
||||
@ -668,14 +668,14 @@ static void computeKeyPoints(const vector<Mat>& imagePyramid,
|
||||
if( scoreType == ORB::HARRIS_SCORE )
|
||||
{
|
||||
// Keep more points than necessary as FAST does not give amazing corners
|
||||
KeyPointsFilter::retainBest(keypoints, 2 * nfeatures);
|
||||
KeyPointsFilter::retainBest(keypoints, 2 * featuresNum);
|
||||
|
||||
// Compute the Harris cornerness (better scoring than FAST)
|
||||
HarrisResponses(imagePyramid[level], keypoints, 7, HARRIS_K);
|
||||
}
|
||||
|
||||
//cull to the final desired level, using the new Harris scores or the original FAST scores.
|
||||
KeyPointsFilter::retainBest(keypoints, nfeatures);
|
||||
KeyPointsFilter::retainBest(keypoints, featuresNum);
|
||||
|
||||
float sf = getScale(level, firstLevel, scaleFactor);
|
||||
|
||||
@ -738,7 +738,7 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _ke
|
||||
if( image.type() != CV_8UC1 )
|
||||
cvtColor(_image, image, CV_BGR2GRAY);
|
||||
|
||||
int nlevels = this->nlevels;
|
||||
int levelsNum = this->nlevels;
|
||||
|
||||
if( !do_keypoints )
|
||||
{
|
||||
@ -751,15 +751,15 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _ke
|
||||
//
|
||||
// In short, ultimately the descriptor should
|
||||
// ignore octave parameter and deal only with the keypoint size.
|
||||
nlevels = 0;
|
||||
levelsNum = 0;
|
||||
for( size_t i = 0; i < _keypoints.size(); i++ )
|
||||
nlevels = std::max(nlevels, std::max(_keypoints[i].octave, 0));
|
||||
nlevels++;
|
||||
levelsNum = std::max(levelsNum, std::max(_keypoints[i].octave, 0));
|
||||
levelsNum++;
|
||||
}
|
||||
|
||||
// Pre-compute the scale pyramids
|
||||
vector<Mat> imagePyramid(nlevels), maskPyramid(nlevels);
|
||||
for (int level = 0; level < nlevels; ++level)
|
||||
vector<Mat> imagePyramid(levelsNum), maskPyramid(levelsNum);
|
||||
for (int level = 0; level < levelsNum; ++level)
|
||||
{
|
||||
float scale = 1/getScale(level, firstLevel, scaleFactor);
|
||||
Size sz(cvRound(image.cols*scale), cvRound(image.rows*scale));
|
||||
@ -839,13 +839,13 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _ke
|
||||
KeyPointsFilter::runByImageBorder(_keypoints, image.size(), edgeThreshold);
|
||||
|
||||
// Cluster the input keypoints depending on the level they were computed at
|
||||
allKeypoints.resize(nlevels);
|
||||
allKeypoints.resize(levelsNum);
|
||||
for (vector<KeyPoint>::iterator keypoint = _keypoints.begin(),
|
||||
keypointEnd = _keypoints.end(); keypoint != keypointEnd; ++keypoint)
|
||||
allKeypoints[keypoint->octave].push_back(*keypoint);
|
||||
|
||||
// Make sure we rescale the coordinates
|
||||
for (int level = 0; level < nlevels; ++level)
|
||||
for (int level = 0; level < levelsNum; ++level)
|
||||
{
|
||||
if (level == firstLevel)
|
||||
continue;
|
||||
@ -864,7 +864,7 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _ke
|
||||
if( do_descriptors )
|
||||
{
|
||||
int nkeypoints = 0;
|
||||
for (int level = 0; level < nlevels; ++level)
|
||||
for (int level = 0; level < levelsNum; ++level)
|
||||
nkeypoints += (int)allKeypoints[level].size();
|
||||
if( nkeypoints == 0 )
|
||||
_descriptors.release();
|
||||
@ -897,7 +897,7 @@ void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _ke
|
||||
|
||||
_keypoints.clear();
|
||||
int offset = 0;
|
||||
for (int level = 0; level < nlevels; ++level)
|
||||
for (int level = 0; level < levelsNum; ++level)
|
||||
{
|
||||
// Get the features and compute their orientation
|
||||
vector<KeyPoint>& keypoints = allKeypoints[level];
|
||||
|
@ -48,13 +48,13 @@ static void
|
||||
computeIntegralImages( const Mat& matI, Mat& matS, Mat& matT, Mat& _FT )
|
||||
{
|
||||
CV_Assert( matI.type() == CV_8U );
|
||||
|
||||
|
||||
int x, y, rows = matI.rows, cols = matI.cols;
|
||||
|
||||
|
||||
matS.create(rows + 1, cols + 1, CV_32S);
|
||||
matT.create(rows + 1, cols + 1, CV_32S);
|
||||
_FT.create(rows + 1, cols + 1, CV_32S);
|
||||
|
||||
|
||||
const uchar* I = matI.ptr<uchar>();
|
||||
int *S = matS.ptr<int>(), *T = matT.ptr<int>(), *FT = _FT.ptr<int>();
|
||||
int istep = (int)matI.step, step = (int)(matS.step/sizeof(S[0]));
|
||||
@ -121,29 +121,28 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
StarFeature f[MAX_PATTERN];
|
||||
|
||||
Mat sum, tilted, flatTilted;
|
||||
int y, i=0, rows = img.rows, cols = img.cols;
|
||||
int y, rows = img.rows, cols = img.cols;
|
||||
int border, npatterns=0, maxIdx=0;
|
||||
|
||||
CV_Assert( img.type() == CV_8UC1 );
|
||||
|
||||
|
||||
responses.create( img.size(), CV_32F );
|
||||
sizes.create( img.size(), CV_16S );
|
||||
|
||||
while( pairs[i][0] >= 0 && !
|
||||
( sizes0[pairs[i][0]] >= maxSize
|
||||
|| sizes0[pairs[i+1][0]] + sizes0[pairs[i+1][0]]/2 >= std::min(rows, cols) ) )
|
||||
while( pairs[npatterns][0] >= 0 && !
|
||||
( sizes0[pairs[npatterns][0]] >= maxSize
|
||||
|| sizes0[pairs[npatterns+1][0]] + sizes0[pairs[npatterns+1][0]]/2 >= std::min(rows, cols) ) )
|
||||
{
|
||||
++i;
|
||||
++npatterns;
|
||||
}
|
||||
|
||||
npatterns = i;
|
||||
|
||||
npatterns += (pairs[npatterns-1][0] >= 0);
|
||||
maxIdx = pairs[npatterns-1][0];
|
||||
|
||||
|
||||
computeIntegralImages( img, sum, tilted, flatTilted );
|
||||
int step = (int)(sum.step/sum.elemSize());
|
||||
|
||||
for( i = 0; i <= maxIdx; i++ )
|
||||
for(int i = 0; i <= maxIdx; i++ )
|
||||
{
|
||||
int ur_size = sizes0[i], t_size = sizes0[i] + sizes0[i]/2;
|
||||
int ur_area = (2*ur_size + 1)*(2*ur_size + 1);
|
||||
@ -169,24 +168,24 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
sizes1[maxIdx] = -sizes1[maxIdx];
|
||||
border = sizes0[maxIdx] + sizes0[maxIdx]/2;
|
||||
|
||||
for( i = 0; i < npatterns; i++ )
|
||||
for(int i = 0; i < npatterns; i++ )
|
||||
{
|
||||
int innerArea = f[pairs[i][1]].area;
|
||||
int outerArea = f[pairs[i][0]].area - innerArea;
|
||||
invSizes[i][0] = 1.f/outerArea;
|
||||
invSizes[i][1] = 1.f/innerArea;
|
||||
}
|
||||
|
||||
|
||||
#if CV_SSE2
|
||||
if( useSIMD )
|
||||
{
|
||||
for( i = 0; i < npatterns; i++ )
|
||||
for(int i = 0; i < npatterns; i++ )
|
||||
{
|
||||
_mm_store_ps((float*)&invSizes4[i][0], _mm_set1_ps(invSizes[i][0]));
|
||||
_mm_store_ps((float*)&invSizes4[i][1], _mm_set1_ps(invSizes[i][1]));
|
||||
}
|
||||
|
||||
for( i = 0; i <= maxIdx; i++ )
|
||||
for(int i = 0; i <= maxIdx; i++ )
|
||||
_mm_store_ps((float*)&sizes1_4[i], _mm_set1_ps((float)sizes1[i]));
|
||||
}
|
||||
#endif
|
||||
@ -197,7 +196,7 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
float* r_ptr2 = responses.ptr<float>(rows - 1 - y);
|
||||
short* s_ptr = sizes.ptr<short>(y);
|
||||
short* s_ptr2 = sizes.ptr<short>(rows - 1 - y);
|
||||
|
||||
|
||||
memset( r_ptr, 0, cols*sizeof(r_ptr[0]));
|
||||
memset( r_ptr2, 0, cols*sizeof(r_ptr2[0]));
|
||||
memset( s_ptr, 0, cols*sizeof(s_ptr[0]));
|
||||
@ -206,10 +205,10 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
|
||||
for( y = border; y < rows - border; y++ )
|
||||
{
|
||||
int x = border, i;
|
||||
int x = border;
|
||||
float* r_ptr = responses.ptr<float>(y);
|
||||
short* s_ptr = sizes.ptr<short>(y);
|
||||
|
||||
|
||||
memset( r_ptr, 0, border*sizeof(r_ptr[0]));
|
||||
memset( s_ptr, 0, border*sizeof(s_ptr[0]));
|
||||
memset( r_ptr + cols - border, 0, border*sizeof(r_ptr[0]));
|
||||
@ -226,7 +225,7 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
__m128 bestResponse = _mm_setzero_ps();
|
||||
__m128 bestSize = _mm_setzero_ps();
|
||||
|
||||
for( i = 0; i <= maxIdx; i++ )
|
||||
for(int i = 0; i <= maxIdx; i++ )
|
||||
{
|
||||
const int** p = (const int**)&f[i].p[0];
|
||||
__m128i r0 = _mm_sub_epi32(_mm_loadu_si128((const __m128i*)(p[0]+ofs)),
|
||||
@ -241,7 +240,7 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
_mm_store_ps((float*)&vals[i], _mm_cvtepi32_ps(r0));
|
||||
}
|
||||
|
||||
for( i = 0; i < npatterns; i++ )
|
||||
for(int i = 0; i < npatterns; i++ )
|
||||
{
|
||||
__m128 inner_sum = vals[pairs[i][1]];
|
||||
__m128 outer_sum = _mm_sub_ps(vals[pairs[i][0]], inner_sum);
|
||||
@ -260,7 +259,7 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
_mm_packs_epi32(_mm_cvtps_epi32(bestSize),_mm_setzero_si128()));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
for( ; x < cols - border; x++ )
|
||||
{
|
||||
int ofs = y*step + x;
|
||||
@ -268,13 +267,13 @@ StarDetectorComputeResponses( const Mat& img, Mat& responses, Mat& sizes, int ma
|
||||
float bestResponse = 0;
|
||||
int bestSize = 0;
|
||||
|
||||
for( i = 0; i <= maxIdx; i++ )
|
||||
for(int i = 0; i <= maxIdx; i++ )
|
||||
{
|
||||
const int** p = (const int**)&f[i].p[0];
|
||||
vals[i] = p[0][ofs] - p[1][ofs] - p[2][ofs] + p[3][ofs] +
|
||||
p[4][ofs] - p[5][ofs] - p[6][ofs] + p[7][ofs];
|
||||
}
|
||||
for( i = 0; i < npatterns; i++ )
|
||||
for(int i = 0; i < npatterns; i++ )
|
||||
{
|
||||
int inner_sum = vals[pairs[i][1]];
|
||||
int outer_sum = vals[pairs[i][0]] - inner_sum;
|
||||
@ -306,7 +305,7 @@ static bool StarDetectorSuppressLines( const Mat& responses, const Mat& sizes, P
|
||||
int x, y, delta = sz/4, radius = delta*4;
|
||||
float Lxx = 0, Lyy = 0, Lxy = 0;
|
||||
int Lxxb = 0, Lyyb = 0, Lxyb = 0;
|
||||
|
||||
|
||||
for( y = pt.y - radius; y <= pt.y + radius; y += delta )
|
||||
for( x = pt.x - radius; x <= pt.x + radius; x += delta )
|
||||
{
|
||||
@ -314,7 +313,7 @@ static bool StarDetectorSuppressLines( const Mat& responses, const Mat& sizes, P
|
||||
float Ly = r_ptr[(y+1)*rstep + x] - r_ptr[(y-1)*rstep + x];
|
||||
Lxx += Lx*Lx; Lyy += Ly*Ly; Lxy += Lx*Ly;
|
||||
}
|
||||
|
||||
|
||||
if( (Lxx + Lyy)*(Lxx + Lyy) >= lineThresholdProjected*(Lxx*Lyy - Lxy*Lxy) )
|
||||
return true;
|
||||
|
||||
@ -415,7 +414,7 @@ StarDetectorSuppressNonmax( const Mat& responses, const Mat& sizes,
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
StarDetector::StarDetector(int _maxSize, int _responseThreshold,
|
||||
int _lineThresholdProjected,
|
||||
int _lineThresholdBinarized,
|
||||
@ -431,10 +430,10 @@ void StarDetector::detectImpl( const Mat& image, vector<KeyPoint>& keypoints, co
|
||||
{
|
||||
Mat grayImage = image;
|
||||
if( image.type() != CV_8U ) cvtColor( image, grayImage, CV_BGR2GRAY );
|
||||
|
||||
|
||||
(*this)(grayImage, keypoints);
|
||||
KeyPointsFilter::runByPixelsMask( keypoints, mask );
|
||||
}
|
||||
}
|
||||
|
||||
void StarDetector::operator()(const Mat& img, vector<KeyPoint>& keypoints) const
|
||||
{
|
||||
@ -446,5 +445,5 @@ void StarDetector::operator()(const Mat& img, vector<KeyPoint>& keypoints) const
|
||||
responseThreshold, lineThresholdProjected,
|
||||
lineThresholdBinarized, suppressNonmaxSize );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -92,9 +92,9 @@ public:
|
||||
/**
|
||||
Default constructor. Initializes a new pool.
|
||||
*/
|
||||
PooledAllocator(int blocksize = BLOCKSIZE)
|
||||
PooledAllocator(int blockSize = BLOCKSIZE)
|
||||
{
|
||||
this->blocksize = blocksize;
|
||||
blocksize = blockSize;
|
||||
remaining = 0;
|
||||
base = NULL;
|
||||
|
||||
@ -122,7 +122,7 @@ public:
|
||||
*/
|
||||
void* allocateMemory(int size)
|
||||
{
|
||||
int blocksize;
|
||||
int blockSize;
|
||||
|
||||
/* Round size up to a multiple of wordsize. The following expression
|
||||
only works for WORDSIZE that is a power of 2, by masking last bits of
|
||||
@ -138,11 +138,11 @@ public:
|
||||
wastedMemory += remaining;
|
||||
|
||||
/* Allocate new storage. */
|
||||
blocksize = (size + sizeof(void*) + (WORDSIZE-1) > BLOCKSIZE) ?
|
||||
blockSize = (size + sizeof(void*) + (WORDSIZE-1) > BLOCKSIZE) ?
|
||||
size + sizeof(void*) + (WORDSIZE-1) : BLOCKSIZE;
|
||||
|
||||
// use the standard C malloc to allocate memory
|
||||
void* m = ::malloc(blocksize);
|
||||
void* m = ::malloc(blockSize);
|
||||
if (!m) {
|
||||
fprintf(stderr,"Failed to allocate memory.\n");
|
||||
return NULL;
|
||||
@ -155,7 +155,7 @@ public:
|
||||
int shift = 0;
|
||||
//int shift = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & (WORDSIZE-1))) & (WORDSIZE-1);
|
||||
|
||||
remaining = blocksize - sizeof(void*) - shift;
|
||||
remaining = blockSize - sizeof(void*) - shift;
|
||||
loc = ((char*)m + sizeof(void*) + shift);
|
||||
}
|
||||
void* rloc = loc;
|
||||
|
@ -66,9 +66,9 @@ public:
|
||||
/** @param only constructor we use in our code
|
||||
* @param the size of the bitset (in bits)
|
||||
*/
|
||||
DynamicBitset(size_t size)
|
||||
DynamicBitset(size_t sz)
|
||||
{
|
||||
resize(size);
|
||||
resize(sz);
|
||||
reset();
|
||||
}
|
||||
|
||||
@ -116,10 +116,10 @@ public:
|
||||
/** @param resize the bitset so that it contains at least size bits
|
||||
* @param size
|
||||
*/
|
||||
void resize(size_t size)
|
||||
void resize(size_t sz)
|
||||
{
|
||||
size_ = size;
|
||||
bitset_.resize(size / cell_bit_size_ + 1);
|
||||
size_ = sz;
|
||||
bitset_.resize(sz / cell_bit_size_ + 1);
|
||||
}
|
||||
|
||||
/** @param set a bit to true
|
||||
|
@ -67,12 +67,12 @@ public:
|
||||
* Constructor.
|
||||
*
|
||||
* Params:
|
||||
* size = heap size
|
||||
* sz = heap size
|
||||
*/
|
||||
|
||||
Heap(int size)
|
||||
Heap(int sz)
|
||||
{
|
||||
length = size;
|
||||
length = sz;
|
||||
heap.reserve(length);
|
||||
count = 0;
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ private:
|
||||
* indices_length = length of indices vector
|
||||
*
|
||||
*/
|
||||
void chooseCentersRandom(int k, int* indices, int indices_length, int* centers, int& centers_length)
|
||||
void chooseCentersRandom(int k, int* dsindices, int indices_length, int* centers, int& centers_length)
|
||||
{
|
||||
UniqueRandom r(indices_length);
|
||||
|
||||
@ -122,7 +122,7 @@ private:
|
||||
return;
|
||||
}
|
||||
|
||||
centers[index] = indices[rnd];
|
||||
centers[index] = dsindices[rnd];
|
||||
|
||||
for (int j=0; j<index; ++j) {
|
||||
DistanceType sq = distance(dataset[centers[index]], dataset[centers[j]], dataset.cols);
|
||||
@ -147,14 +147,14 @@ private:
|
||||
* indices = indices in the dataset
|
||||
* Returns:
|
||||
*/
|
||||
void chooseCentersGonzales(int k, int* indices, int indices_length, int* centers, int& centers_length)
|
||||
void chooseCentersGonzales(int k, int* dsindices, int indices_length, int* centers, int& centers_length)
|
||||
{
|
||||
int n = indices_length;
|
||||
|
||||
int rnd = rand_int(n);
|
||||
assert(rnd >=0 && rnd < n);
|
||||
|
||||
centers[0] = indices[rnd];
|
||||
centers[0] = dsindices[rnd];
|
||||
|
||||
int index;
|
||||
for (index=1; index<k; ++index) {
|
||||
@ -162,9 +162,9 @@ private:
|
||||
int best_index = -1;
|
||||
DistanceType best_val = 0;
|
||||
for (int j=0; j<n; ++j) {
|
||||
DistanceType dist = distance(dataset[centers[0]],dataset[indices[j]],dataset.cols);
|
||||
DistanceType dist = distance(dataset[centers[0]],dataset[dsindices[j]],dataset.cols);
|
||||
for (int i=1; i<index; ++i) {
|
||||
DistanceType tmp_dist = distance(dataset[centers[i]],dataset[indices[j]],dataset.cols);
|
||||
DistanceType tmp_dist = distance(dataset[centers[i]],dataset[dsindices[j]],dataset.cols);
|
||||
if (tmp_dist<dist) {
|
||||
dist = tmp_dist;
|
||||
}
|
||||
@ -175,7 +175,7 @@ private:
|
||||
}
|
||||
}
|
||||
if (best_index!=-1) {
|
||||
centers[index] = indices[best_index];
|
||||
centers[index] = dsindices[best_index];
|
||||
}
|
||||
else {
|
||||
break;
|
||||
@ -198,7 +198,7 @@ private:
|
||||
* indices = indices in the dataset
|
||||
* Returns:
|
||||
*/
|
||||
void chooseCentersKMeanspp(int k, int* indices, int indices_length, int* centers, int& centers_length)
|
||||
void chooseCentersKMeanspp(int k, int* dsindices, int indices_length, int* centers, int& centers_length)
|
||||
{
|
||||
int n = indices_length;
|
||||
|
||||
@ -208,10 +208,10 @@ private:
|
||||
// Choose one random center and set the closestDistSq values
|
||||
int index = rand_int(n);
|
||||
assert(index >=0 && index < n);
|
||||
centers[0] = indices[index];
|
||||
centers[0] = dsindices[index];
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
closestDistSq[i] = distance(dataset[indices[i]], dataset[indices[index]], dataset.cols);
|
||||
closestDistSq[i] = distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols);
|
||||
currentPot += closestDistSq[i];
|
||||
}
|
||||
|
||||
@ -237,7 +237,7 @@ private:
|
||||
|
||||
// Compute the new potential
|
||||
double newPot = 0;
|
||||
for (int i = 0; i < n; i++) newPot += std::min( distance(dataset[indices[i]], dataset[indices[index]], dataset.cols), closestDistSq[i] );
|
||||
for (int i = 0; i < n; i++) newPot += std::min( distance(dataset[dsindices[i]], dataset[dsindices[index]], dataset.cols), closestDistSq[i] );
|
||||
|
||||
// Store the best result
|
||||
if ((bestNewPot < 0)||(newPot < bestNewPot)) {
|
||||
@ -247,9 +247,9 @@ private:
|
||||
}
|
||||
|
||||
// Add the appropriate center
|
||||
centers[centerCount] = indices[bestNewIndex];
|
||||
centers[centerCount] = dsindices[bestNewIndex];
|
||||
currentPot = bestNewPot;
|
||||
for (int i = 0; i < n; i++) closestDistSq[i] = std::min( distance(dataset[indices[i]], dataset[indices[bestNewIndex]], dataset.cols), closestDistSq[i] );
|
||||
for (int i = 0; i < n; i++) closestDistSq[i] = std::min( distance(dataset[dsindices[i]], dataset[dsindices[bestNewIndex]], dataset.cols), closestDistSq[i] );
|
||||
}
|
||||
|
||||
centers_length = centerCount;
|
||||
@ -518,11 +518,11 @@ private:
|
||||
|
||||
|
||||
|
||||
void computeLabels(int* indices, int indices_length, int* centers, int centers_length, int* labels, DistanceType& cost)
|
||||
void computeLabels(int* dsindices, int indices_length, int* centers, int centers_length, int* labels, DistanceType& cost)
|
||||
{
|
||||
cost = 0;
|
||||
for (int i=0; i<indices_length; ++i) {
|
||||
ElementType* point = dataset[indices[i]];
|
||||
ElementType* point = dataset[dsindices[i]];
|
||||
DistanceType dist = distance(point, dataset[centers[0]], veclen_);
|
||||
labels[i] = 0;
|
||||
for (int j=1; j<centers_length; ++j) {
|
||||
@ -547,13 +547,13 @@ private:
|
||||
*
|
||||
* TODO: for 1-sized clusters don't store a cluster center (it's the same as the single cluster point)
|
||||
*/
|
||||
void computeClustering(NodePtr node, int* indices, int indices_length, int branching, int level)
|
||||
void computeClustering(NodePtr node, int* dsindices, int indices_length, int branching, int level)
|
||||
{
|
||||
node->size = indices_length;
|
||||
node->level = level;
|
||||
|
||||
if (indices_length < leaf_size_) { // leaf node
|
||||
node->indices = indices;
|
||||
node->indices = dsindices;
|
||||
std::sort(node->indices,node->indices+indices_length);
|
||||
node->childs = NULL;
|
||||
return;
|
||||
@ -563,10 +563,10 @@ private:
|
||||
std::vector<int> labels(indices_length);
|
||||
|
||||
int centers_length;
|
||||
(this->*chooseCenters)(branching, indices, indices_length, ¢ers[0], centers_length);
|
||||
(this->*chooseCenters)(branching, dsindices, indices_length, ¢ers[0], centers_length);
|
||||
|
||||
if (centers_length<branching) {
|
||||
node->indices = indices;
|
||||
node->indices = dsindices;
|
||||
std::sort(node->indices,node->indices+indices_length);
|
||||
node->childs = NULL;
|
||||
return;
|
||||
@ -575,7 +575,7 @@ private:
|
||||
|
||||
// assign points to clusters
|
||||
DistanceType cost;
|
||||
computeLabels(indices, indices_length, ¢ers[0], centers_length, &labels[0], cost);
|
||||
computeLabels(dsindices, indices_length, ¢ers[0], centers_length, &labels[0], cost);
|
||||
|
||||
node->childs = pool.allocate<NodePtr>(branching);
|
||||
int start = 0;
|
||||
@ -583,7 +583,7 @@ private:
|
||||
for (int i=0; i<branching; ++i) {
|
||||
for (int j=0; j<indices_length; ++j) {
|
||||
if (labels[j]==i) {
|
||||
std::swap(indices[j],indices[end]);
|
||||
std::swap(dsindices[j],dsindices[end]);
|
||||
std::swap(labels[j],labels[end]);
|
||||
end++;
|
||||
}
|
||||
@ -592,7 +592,7 @@ private:
|
||||
node->childs[i] = pool.allocate<Node>();
|
||||
node->childs[i]->pivot = centers[i];
|
||||
node->childs[i]->indices = NULL;
|
||||
computeClustering(node->childs[i],indices+start, end-start, branching, level+1);
|
||||
computeClustering(node->childs[i],dsindices+start, end-start, branching, level+1);
|
||||
start=end;
|
||||
}
|
||||
}
|
||||
|
@ -5,9 +5,7 @@ endif()
|
||||
set(the_description "GPU-accelerated Computer Vision")
|
||||
ocv_add_module(gpu opencv_imgproc opencv_calib3d opencv_objdetect opencv_video opencv_nonfree opencv_legacy)
|
||||
|
||||
ocv_module_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/cuda")
|
||||
|
||||
ocv_module_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/../highgui/src")
|
||||
ocv_module_include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/cuda" "${CMAKE_CURRENT_SOURCE_DIR}/../highgui/src")
|
||||
|
||||
file(GLOB lib_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h")
|
||||
file(GLOB lib_int_hdrs "src/*.hpp" "src/*.h")
|
||||
@ -30,17 +28,14 @@ if (HAVE_CUDA)
|
||||
set(ncv_files ${ncv_srcs} ${ncv_hdrs} ${ncv_cuda})
|
||||
|
||||
source_group("Src\\NVidia" FILES ${ncv_files})
|
||||
include_directories(AFTER SYSTEM ${CUDA_INCLUDE_DIRS})
|
||||
ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging")
|
||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef)
|
||||
ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging" ${CUDA_INCLUDE_DIRS})
|
||||
ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef /wd4211 /wd4201 /wd4100 /wd4505 /wd4408)
|
||||
|
||||
#set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-keep")
|
||||
#set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-Xcompiler;/EHsc-;")
|
||||
|
||||
if(MSVC)
|
||||
if(NOT ENABLE_NOISY_WARNINGS)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4211 /wd4201 /wd4100 /wd4505 /wd4408")
|
||||
|
||||
foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
|
||||
string(REPLACE "/W4" "/W3" ${var} "${${var}}")
|
||||
endforeach()
|
||||
@ -52,10 +47,8 @@ if (HAVE_CUDA)
|
||||
ocv_cuda_compile(cuda_objs ${lib_cuda} ${ncv_cuda})
|
||||
#CUDA_BUILD_CLEAN_TARGET()
|
||||
|
||||
|
||||
set(cuda_link_libs ${CUDA_LIBRARIES} ${CUDA_npp_LIBRARY})
|
||||
|
||||
|
||||
if(NOT APPLE)
|
||||
unset(CUDA_nvcuvid_LIBRARY CACHE)
|
||||
find_cuda_helper_libs(nvcuvid)
|
||||
@ -106,11 +99,11 @@ ocv_add_precompiled_headers(${the_module})
|
||||
################################################################################################################
|
||||
file(GLOB test_srcs "test/*.cpp")
|
||||
file(GLOB test_hdrs "test/*.hpp" "test/*.h")
|
||||
|
||||
set(nvidia "")
|
||||
if(HAVE_CUDA)
|
||||
file(GLOB nvidia "test/nvidia/*.cpp" "test/nvidia/*.hpp" "test/nvidia/*.h")
|
||||
set(nvidia FILES "Src\\\\\\\\NVidia" ${nvidia}) # 8 ugly backslashes :'(
|
||||
else()
|
||||
set(nvidia "")
|
||||
endif()
|
||||
|
||||
ocv_add_accuracy_tests(FILES "Include" ${test_hdrs}
|
||||
|
@ -134,7 +134,7 @@ endif()
|
||||
|
||||
if(HAVE_OPENNI)
|
||||
list(APPEND highgui_srcs src/cap_openni.cpp)
|
||||
include_directories(AFTER SYSTEM ${OPENNI_INCLUDE_DIR})
|
||||
ocv_include_directories(${OPENNI_INCLUDE_DIR})
|
||||
list(APPEND HIGHGUI_LIBRARIES ${OPENNI_LIBRARY})
|
||||
endif(HAVE_OPENNI)
|
||||
|
||||
|
@ -283,7 +283,7 @@ void CvCapture_GStreamer::newPad(GstElement *uridecodebin,
|
||||
|
||||
|
||||
sinkpad = gst_element_get_static_pad (color, "sink");
|
||||
|
||||
|
||||
// printf("linking dynamic pad to colourconverter %p %p\n", uridecodebin, pad);
|
||||
|
||||
gst_pad_link (pad, sinkpad);
|
||||
@ -357,13 +357,13 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
|
||||
if(manualpipeline) {
|
||||
GstIterator *it = gst_bin_iterate_sinks(GST_BIN(uridecodebin));
|
||||
if(gst_iterator_next(it, (gpointer *)&sink) != GST_ITERATOR_OK) {
|
||||
CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n");
|
||||
return false;
|
||||
CV_ERROR(CV_StsError, "GStreamer: cannot find appsink in manual pipeline\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
pipeline = uridecodebin;
|
||||
pipeline = uridecodebin;
|
||||
} else {
|
||||
pipeline = gst_pipeline_new (NULL);
|
||||
pipeline = gst_pipeline_new (NULL);
|
||||
|
||||
color = gst_element_factory_make("ffmpegcolorspace", NULL);
|
||||
sink = gst_element_factory_make("appsink", NULL);
|
||||
@ -381,16 +381,12 @@ bool CvCapture_GStreamer::open( int type, const char* filename )
|
||||
gst_app_sink_set_max_buffers (GST_APP_SINK(sink), 1);
|
||||
gst_app_sink_set_drop (GST_APP_SINK(sink), stream);
|
||||
|
||||
{
|
||||
GstCaps* caps;
|
||||
caps = gst_caps_new_simple("video/x-raw-rgb",
|
||||
"red_mask", G_TYPE_INT, 0x0000FF,
|
||||
"green_mask", G_TYPE_INT, 0x00FF00,
|
||||
"blue_mask", G_TYPE_INT, 0xFF0000,
|
||||
NULL);
|
||||
gst_app_sink_set_caps(GST_APP_SINK(sink), caps);
|
||||
gst_app_sink_set_caps(GST_APP_SINK(sink), gst_caps_new_simple("video/x-raw-rgb",
|
||||
"red_mask", G_TYPE_INT, 0x0000FF,
|
||||
"green_mask", G_TYPE_INT, 0x00FF00,
|
||||
"blue_mask", G_TYPE_INT, 0xFF0000,
|
||||
NULL));
|
||||
gst_caps_unref(caps);
|
||||
}
|
||||
|
||||
if(gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_READY) ==
|
||||
GST_STATE_CHANGE_FAILURE) {
|
||||
|
@ -779,9 +779,9 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
|
||||
return -1;
|
||||
} else {
|
||||
buffer_number--;
|
||||
fprintf (stderr, "Insufficient buffer memory on %s -- decreaseing buffers\n", deviceName);
|
||||
fprintf (stderr, "Insufficient buffer memory on %s -- decreaseing buffers\n", deviceName);
|
||||
|
||||
goto try_again;
|
||||
goto try_again;
|
||||
}
|
||||
}
|
||||
|
||||
@ -824,8 +824,8 @@ static int _capture_V4L2 (CvCaptureCAM_V4L *capture, char *deviceName)
|
||||
if (capture->buffers[MAX_V4L_BUFFERS].start) {
|
||||
free(capture->buffers[MAX_V4L_BUFFERS].start);
|
||||
capture->buffers[MAX_V4L_BUFFERS].start = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
capture->buffers[MAX_V4L_BUFFERS].start = malloc(buf.length);
|
||||
capture->buffers[MAX_V4L_BUFFERS].length = buf.length;
|
||||
};
|
||||
@ -1080,11 +1080,11 @@ static int read_frame_v4l2(CvCaptureCAM_V4L* capture) {
|
||||
|
||||
#ifdef USE_TEMP_BUFFER
|
||||
memcpy(capture->buffers[MAX_V4L_BUFFERS].start,
|
||||
capture->buffers[buf.index].start,
|
||||
capture->buffers[MAX_V4L_BUFFERS].length );
|
||||
capture->buffers[buf.index].start,
|
||||
capture->buffers[MAX_V4L_BUFFERS].length );
|
||||
capture->bufferIndex = MAX_V4L_BUFFERS;
|
||||
//printf("got data in buff %d, len=%d, flags=0x%X, seq=%d, used=%d)\n",
|
||||
// buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused);
|
||||
// buf.index, buf.length, buf.flags, buf.sequence, buf.bytesused);
|
||||
#else
|
||||
capture->bufferIndex = buf.index;
|
||||
#endif
|
||||
@ -1211,9 +1211,9 @@ static int icvGrabFrameCAM_V4L(CvCaptureCAM_V4L* capture) {
|
||||
capture->mmaps[capture->bufferIndex].format = capture->imageProperties.palette;
|
||||
|
||||
if (v4l1_ioctl (capture->deviceHandle, VIDIOCMCAPTURE,
|
||||
&capture->mmaps[capture->bufferIndex]) == -1) {
|
||||
/* capture is on the way, so just exit */
|
||||
return 1;
|
||||
&capture->mmaps[capture->bufferIndex]) == -1) {
|
||||
/* capture is on the way, so just exit */
|
||||
return 1;
|
||||
}
|
||||
|
||||
++capture->bufferIndex;
|
||||
@ -1273,11 +1273,11 @@ static IplImage* icvRetrieveFrameCAM_V4L( CvCaptureCAM_V4L* capture, int) {
|
||||
if (capture->is_v4l2_device == 1)
|
||||
{
|
||||
|
||||
if(capture->buffers[capture->bufferIndex].start){
|
||||
memcpy((char *)capture->frame.imageData,
|
||||
(char *)capture->buffers[capture->bufferIndex].start,
|
||||
capture->frame.imageSize);
|
||||
}
|
||||
if(capture->buffers[capture->bufferIndex].start){
|
||||
memcpy((char *)capture->frame.imageData,
|
||||
(char *)capture->buffers[capture->bufferIndex].start,
|
||||
capture->frame.imageSize);
|
||||
}
|
||||
|
||||
} else
|
||||
#endif /* HAVE_CAMV4L2 */
|
||||
@ -1353,7 +1353,7 @@ static double icvGetPropertyCAM_V4L (CvCaptureCAM_V4L* capture,
|
||||
sprintf(name, "<unknown property string>");
|
||||
capture->control.id = property_id;
|
||||
}
|
||||
|
||||
|
||||
if(v4l2_ioctl(capture->deviceHandle, VIDIOC_G_CTRL, &capture->control) == 0) {
|
||||
/* all went well */
|
||||
is_v4l2_device = 1;
|
||||
@ -1519,7 +1519,7 @@ static int icvSetControl (CvCaptureCAM_V4L* capture, int property_id, double val
|
||||
|
||||
CLEAR (capture->control);
|
||||
CLEAR (capture->queryctrl);
|
||||
|
||||
|
||||
/* get current values */
|
||||
switch (property_id) {
|
||||
case CV_CAP_PROP_BRIGHTNESS:
|
||||
@ -1688,8 +1688,8 @@ static void icvCloseCAM_V4L( CvCaptureCAM_V4L* capture ){
|
||||
if (xioctl(capture->deviceHandle, VIDIOC_STREAMOFF, &capture->type) < 0) {
|
||||
perror ("Unable to stop the stream.");
|
||||
}
|
||||
for (unsigned int n_buffers = 0; n_buffers < capture->req.count; ++n_buffers) {
|
||||
if (-1 == v4l2_munmap (capture->buffers[n_buffers].start, capture->buffers[n_buffers].length)) {
|
||||
for (unsigned int n_buffers2 = 0; n_buffers2 < capture->req.count; ++n_buffers2) {
|
||||
if (-1 == v4l2_munmap (capture->buffers[n_buffers2].start, capture->buffers[n_buffers2].length)) {
|
||||
perror ("munmap");
|
||||
}
|
||||
}
|
||||
|
@ -157,22 +157,22 @@ bool PngDecoder::readHeader()
|
||||
|
||||
if( !m_buf.empty() || m_f )
|
||||
{
|
||||
png_uint_32 width, height;
|
||||
png_uint_32 wdth, hght;
|
||||
int bit_depth, color_type;
|
||||
|
||||
png_read_info( png_ptr, info_ptr );
|
||||
|
||||
png_get_IHDR( png_ptr, info_ptr, &width, &height,
|
||||
png_get_IHDR( png_ptr, info_ptr, &wdth, &hght,
|
||||
&bit_depth, &color_type, 0, 0, 0 );
|
||||
|
||||
m_width = (int)width;
|
||||
m_height = (int)height;
|
||||
m_width = (int)wdth;
|
||||
m_height = (int)hght;
|
||||
m_color_type = color_type;
|
||||
m_bit_depth = bit_depth;
|
||||
|
||||
if( bit_depth <= 8 || bit_depth == 16 )
|
||||
{
|
||||
switch(color_type)
|
||||
switch(color_type)
|
||||
{
|
||||
case PNG_COLOR_TYPE_RGB:
|
||||
case PNG_COLOR_TYPE_PALETTE:
|
||||
@ -224,7 +224,7 @@ bool PngDecoder::readData( Mat& img )
|
||||
else if( !isBigEndian() )
|
||||
png_set_swap( png_ptr );
|
||||
|
||||
if(img.channels() < 4)
|
||||
if(img.channels() < 4)
|
||||
{
|
||||
/* observation: png_read_image() writes 400 bytes beyond
|
||||
* end of data when reading a 400x118 color png
|
||||
@ -247,7 +247,7 @@ bool PngDecoder::readData( Mat& img )
|
||||
#else
|
||||
png_set_gray_1_2_4_to_8( png_ptr );
|
||||
#endif
|
||||
|
||||
|
||||
if( CV_MAT_CN(m_type) > 1 && color )
|
||||
png_set_bgr( png_ptr ); // convert RGB to BGR
|
||||
else if( color )
|
||||
@ -330,7 +330,7 @@ bool PngEncoder::write( const Mat& img, const vector<int>& params )
|
||||
if( params[i] == CV_IMWRITE_PNG_STRATEGY )
|
||||
{
|
||||
compression_strategy = params[i+1];
|
||||
compression_strategy = MIN(MAX(compression_strategy, 0), Z_FIXED);
|
||||
compression_strategy = MIN(MAX(compression_strategy, 0), Z_FIXED);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -115,19 +115,19 @@ bool TiffDecoder::readHeader()
|
||||
|
||||
if( tif )
|
||||
{
|
||||
int width = 0, height = 0, photometric = 0;
|
||||
int wdth = 0, hght = 0, photometric = 0;
|
||||
m_tif = tif;
|
||||
|
||||
if( TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &width ) &&
|
||||
TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &height ) &&
|
||||
if( TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &wdth ) &&
|
||||
TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &hght ) &&
|
||||
TIFFGetField( tif, TIFFTAG_PHOTOMETRIC, &photometric ))
|
||||
{
|
||||
int bpp=8, ncn = photometric > 1 ? 3 : 1;
|
||||
TIFFGetField( tif, TIFFTAG_BITSPERSAMPLE, &bpp );
|
||||
TIFFGetField( tif, TIFFTAG_SAMPLESPERPIXEL, &ncn );
|
||||
|
||||
m_width = width;
|
||||
m_height = height;
|
||||
|
||||
m_width = wdth;
|
||||
m_height = hght;
|
||||
if( bpp > 8 &&
|
||||
((photometric != 2 && photometric != 1) ||
|
||||
(ncn != 1 && ncn != 3 && ncn != 4)))
|
||||
@ -169,7 +169,7 @@ bool TiffDecoder::readData( Mat& img )
|
||||
bool color = img.channels() > 1;
|
||||
uchar* data = img.data;
|
||||
int step = (int)img.step;
|
||||
|
||||
|
||||
if( img.depth() != CV_8U && img.depth() != CV_16U && img.depth() != CV_32F && img.depth() != CV_64F )
|
||||
return false;
|
||||
|
||||
@ -422,9 +422,9 @@ bool TiffEncoder::writeLibTiff( const Mat& img, const vector<int>& /*params*/)
|
||||
default:
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const int bitsPerByte = 8;
|
||||
size_t fileStep = (width * channels * bitsPerChannel) / bitsPerByte;
|
||||
int rowsPerStrip = (int)((1 << 13)/fileStep);
|
||||
@ -443,7 +443,7 @@ bool TiffEncoder::writeLibTiff( const Mat& img, const vector<int>& /*params*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// defaults for now, maybe base them on params in the future
|
||||
int compression = COMPRESSION_LZW;
|
||||
int predictor = PREDICTOR_HORIZONTAL;
|
||||
@ -516,7 +516,7 @@ bool TiffEncoder::writeLibTiff( const Mat& img, const vector<int>& /*params*/)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
TIFFClose(pTiffHandle);
|
||||
return true;
|
||||
}
|
||||
@ -546,7 +546,7 @@ bool TiffEncoder::write( const Mat& img, const vector<int>& /*params*/)
|
||||
if( !strm.open(*m_buf) )
|
||||
return false;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
#ifdef HAVE_TIFF
|
||||
return writeLibTiff(img, params);
|
||||
|
@ -60,9 +60,9 @@ protected:
|
||||
void CV_DrawingTest::run( int )
|
||||
{
|
||||
Mat testImg, valImg;
|
||||
const string name = "drawing/image.jpg";
|
||||
const string fname = "drawing/image.jpg";
|
||||
string path = ts->get_data_path(), filename;
|
||||
filename = path + name;
|
||||
filename = path + fname;
|
||||
|
||||
draw( testImg );
|
||||
|
||||
@ -415,30 +415,30 @@ class CV_FillConvexPolyTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_FillConvexPolyTest() {}
|
||||
~CV_FillConvexPolyTest() {}
|
||||
~CV_FillConvexPolyTest() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
vector<Point> line1;
|
||||
vector<Point> line2;
|
||||
|
||||
|
||||
line1.push_back(Point(1, 1));
|
||||
line1.push_back(Point(5, 1));
|
||||
line1.push_back(Point(5, 8));
|
||||
line1.push_back(Point(1, 8));
|
||||
|
||||
|
||||
line2.push_back(Point(2, 2));
|
||||
line2.push_back(Point(10, 2));
|
||||
line2.push_back(Point(10, 16));
|
||||
line2.push_back(Point(2, 16));
|
||||
|
||||
|
||||
Mat gray0(10,10,CV_8U, Scalar(0));
|
||||
fillConvexPoly(gray0, line1, Scalar(255), 8, 0);
|
||||
int nz1 = countNonZero(gray0);
|
||||
|
||||
|
||||
fillConvexPoly(gray0, line2, Scalar(0), 8, 1);
|
||||
int nz2 = countNonZero(gray0)/255;
|
||||
|
||||
|
||||
CV_Assert( nz1 == 40 && nz2 == 0 );
|
||||
}
|
||||
};
|
||||
|
@ -53,7 +53,7 @@ string fourccToString(int fourcc)
|
||||
{
|
||||
return format("%c%c%c%c", fourcc & 255, (fourcc >> 8) & 255, (fourcc >> 16) & 255, (fourcc >> 24) & 255);
|
||||
}
|
||||
|
||||
|
||||
const VideoFormat g_specific_fmt_list[] =
|
||||
{
|
||||
VideoFormat("avi", CV_FOURCC('X', 'V', 'I', 'D')),
|
||||
@ -63,11 +63,11 @@ const VideoFormat g_specific_fmt_list[] =
|
||||
VideoFormat("mkv", CV_FOURCC('X', 'V', 'I', 'D')),
|
||||
VideoFormat("mkv", CV_FOURCC('M', 'P', 'E', 'G')),
|
||||
VideoFormat("mkv", CV_FOURCC('M', 'J', 'P', 'G')),
|
||||
|
||||
|
||||
VideoFormat("mov", CV_FOURCC('m', 'p', '4', 'v')),
|
||||
VideoFormat()
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
class CV_HighGuiTest : public cvtest::BaseTest
|
||||
@ -246,7 +246,7 @@ void CV_HighGuiTest::VideoTest(const string& dir, const cvtest::VideoFormat& fmt
|
||||
|
||||
if (!img)
|
||||
break;
|
||||
|
||||
|
||||
frames.push_back(Mat(img).clone());
|
||||
|
||||
if (writer == 0)
|
||||
@ -393,7 +393,7 @@ void CV_HighGuiTest::SpecificVideoTest(const string& dir, const cvtest::VideoFor
|
||||
{
|
||||
string ext = fmt.ext;
|
||||
int fourcc = fmt.fourcc;
|
||||
|
||||
|
||||
string fourcc_str = cvtest::fourccToString(fourcc);
|
||||
const string video_file = "video_" + fourcc_str + "." + ext;
|
||||
|
||||
@ -403,7 +403,7 @@ void CV_HighGuiTest::SpecificVideoTest(const string& dir, const cvtest::VideoFor
|
||||
if (!writer.isOpened())
|
||||
{
|
||||
// call it repeatedly for easier debugging
|
||||
VideoWriter writer(video_file, fourcc, 25, frame_size, true);
|
||||
VideoWriter writer2(video_file, fourcc, 25, frame_size, true);
|
||||
ts->printf(ts->LOG, "Creating a video in %s...\n", video_file.c_str());
|
||||
ts->printf(ts->LOG, "Cannot create VideoWriter object with codec %s.\n", fourcc_str.c_str());
|
||||
ts->set_failed_test_info(ts->FAIL_MISMATCH);
|
||||
@ -412,7 +412,7 @@ void CV_HighGuiTest::SpecificVideoTest(const string& dir, const cvtest::VideoFor
|
||||
|
||||
const size_t IMAGE_COUNT = 30;
|
||||
vector<Mat> images;
|
||||
|
||||
|
||||
for( size_t i = 0; i < IMAGE_COUNT; ++i )
|
||||
{
|
||||
string file_path = format("%s../python/images/QCIF_%02d.bmp", dir.c_str(), i);
|
||||
@ -432,7 +432,7 @@ void CV_HighGuiTest::SpecificVideoTest(const string& dir, const cvtest::VideoFor
|
||||
if (img.at<Vec3b>(k, l) == Vec3b::all(0))
|
||||
img.at<Vec3b>(k, l) = Vec3b(0, 255, 0);
|
||||
else img.at<Vec3b>(k, l) = Vec3b(0, 0, 255);
|
||||
|
||||
|
||||
resize(img, img, frame_size, 0.0, 0.0, INTER_CUBIC);
|
||||
|
||||
images.push_back(img);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -48,11 +48,11 @@
|
||||
|
||||
/*
|
||||
Various border types, image boundaries are denoted with '|'
|
||||
|
||||
|
||||
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
|
||||
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
|
||||
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
|
||||
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
|
||||
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
|
||||
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
|
||||
*/
|
||||
int cv::borderInterpolate( int p, int len, int borderType )
|
||||
@ -113,7 +113,7 @@ FilterEngine::FilterEngine()
|
||||
|
||||
wholeSize = Size(-1,-1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
FilterEngine::FilterEngine( const Ptr<BaseFilter>& _filter2D,
|
||||
const Ptr<BaseRowFilter>& _rowFilter,
|
||||
@ -125,7 +125,7 @@ FilterEngine::FilterEngine( const Ptr<BaseFilter>& _filter2D,
|
||||
init(_filter2D, _rowFilter, _columnFilter, _srcType, _dstType, _bufType,
|
||||
_rowBorderType, _columnBorderType, _borderValue);
|
||||
}
|
||||
|
||||
|
||||
FilterEngine::~FilterEngine()
|
||||
{
|
||||
}
|
||||
@ -141,24 +141,24 @@ void FilterEngine::init( const Ptr<BaseFilter>& _filter2D,
|
||||
_srcType = CV_MAT_TYPE(_srcType);
|
||||
_bufType = CV_MAT_TYPE(_bufType);
|
||||
_dstType = CV_MAT_TYPE(_dstType);
|
||||
|
||||
|
||||
srcType = _srcType;
|
||||
int srcElemSize = (int)getElemSize(srcType);
|
||||
dstType = _dstType;
|
||||
bufType = _bufType;
|
||||
|
||||
|
||||
filter2D = _filter2D;
|
||||
rowFilter = _rowFilter;
|
||||
columnFilter = _columnFilter;
|
||||
|
||||
if( _columnBorderType < 0 )
|
||||
_columnBorderType = _rowBorderType;
|
||||
|
||||
|
||||
rowBorderType = _rowBorderType;
|
||||
columnBorderType = _columnBorderType;
|
||||
|
||||
|
||||
CV_Assert( columnBorderType != BORDER_WRAP );
|
||||
|
||||
|
||||
if( isSeparable() )
|
||||
{
|
||||
CV_Assert( !rowFilter.empty() && !columnFilter.empty() );
|
||||
@ -175,7 +175,7 @@ void FilterEngine::init( const Ptr<BaseFilter>& _filter2D,
|
||||
CV_Assert( 0 <= anchor.x && anchor.x < ksize.width &&
|
||||
0 <= anchor.y && anchor.y < ksize.height );
|
||||
|
||||
borderElemSize = srcElemSize/(CV_MAT_DEPTH(srcType) >= CV_32S ? sizeof(int) : 1);
|
||||
borderElemSize = srcElemSize/(CV_MAT_DEPTH(srcType) >= CV_32S ? sizeof(int) : 1);
|
||||
int borderLength = std::max(ksize.width - 1, 1);
|
||||
borderTab.resize(borderLength*borderElemSize);
|
||||
|
||||
@ -198,7 +198,7 @@ static const int VEC_ALIGN = CV_MALLOC_ALIGN;
|
||||
int FilterEngine::start(Size _wholeSize, Rect _roi, int _maxBufRows)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
|
||||
wholeSize = _wholeSize;
|
||||
roi = _roi;
|
||||
CV_Assert( roi.x >= 0 && roi.y >= 0 && roi.width >= 0 && roi.height >= 0 &&
|
||||
@ -226,7 +226,7 @@ int FilterEngine::start(Size _wholeSize, Rect _roi, int _maxBufRows)
|
||||
int n = (int)constBorderValue.size(), N;
|
||||
N = (maxWidth + ksize.width - 1)*esz;
|
||||
tdst = isSeparable() ? &srcRow[0] : dst;
|
||||
|
||||
|
||||
for( i = 0; i < N; i += n )
|
||||
{
|
||||
n = std::min( n, N - i );
|
||||
@ -237,7 +237,7 @@ int FilterEngine::start(Size _wholeSize, Rect _roi, int _maxBufRows)
|
||||
if( isSeparable() )
|
||||
(*rowFilter)(&srcRow[0], dst, maxWidth, cn);
|
||||
}
|
||||
|
||||
|
||||
int maxBufStep = bufElemSize*(int)alignSize(maxWidth +
|
||||
(!isSeparable() ? ksize.width - 1 : 0),VEC_ALIGN);
|
||||
ringBuf.resize(maxBufStep*rows.size()+VEC_ALIGN);
|
||||
@ -265,10 +265,10 @@ int FilterEngine::start(Size _wholeSize, Rect _roi, int _maxBufRows)
|
||||
else
|
||||
{
|
||||
int xofs1 = std::min(roi.x, anchor.x) - roi.x;
|
||||
|
||||
|
||||
int btab_esz = borderElemSize, wholeWidth = wholeSize.width;
|
||||
int* btab = (int*)&borderTab[0];
|
||||
|
||||
|
||||
for( i = 0; i < dx1; i++ )
|
||||
{
|
||||
int p0 = (borderInterpolate(i-dx1, wholeWidth, rowBorderType) + xofs1)*btab_esz;
|
||||
@ -301,20 +301,20 @@ int FilterEngine::start(const Mat& src, const Rect& _srcRoi,
|
||||
bool isolated, int maxBufRows)
|
||||
{
|
||||
Rect srcRoi = _srcRoi;
|
||||
|
||||
|
||||
if( srcRoi == Rect(0,0,-1,-1) )
|
||||
srcRoi = Rect(0,0,src.cols,src.rows);
|
||||
|
||||
|
||||
CV_Assert( srcRoi.x >= 0 && srcRoi.y >= 0 &&
|
||||
srcRoi.width >= 0 && srcRoi.height >= 0 &&
|
||||
srcRoi.x + srcRoi.width <= src.cols &&
|
||||
srcRoi.y + srcRoi.height <= src.rows );
|
||||
|
||||
Point ofs;
|
||||
Size wholeSize(src.cols, src.rows);
|
||||
Size wsz(src.cols, src.rows);
|
||||
if( !isolated )
|
||||
src.locateROI( wholeSize, ofs );
|
||||
start( wholeSize, srcRoi + ofs, maxBufRows );
|
||||
src.locateROI( wsz, ofs );
|
||||
start( wsz, srcRoi + ofs, maxBufRows );
|
||||
|
||||
return startY - ofs.y;
|
||||
}
|
||||
@ -334,7 +334,7 @@ int FilterEngine::proceed( const uchar* src, int srcstep, int count,
|
||||
uchar* dst, int dststep )
|
||||
{
|
||||
CV_Assert( wholeSize.width > 0 && wholeSize.height > 0 );
|
||||
|
||||
|
||||
const int *btab = &borderTab[0];
|
||||
int esz = (int)getElemSize(srcType), btab_esz = borderElemSize;
|
||||
uchar** brows = &rows[0];
|
||||
@ -365,7 +365,7 @@ int FilterEngine::proceed( const uchar* src, int srcstep, int count,
|
||||
int bi = (startY - startY0 + rowCount) % bufRows;
|
||||
uchar* brow = alignPtr(&ringBuf[0], VEC_ALIGN) + bi*bufStep;
|
||||
uchar* row = isSep ? &srcRow[0] : brow;
|
||||
|
||||
|
||||
if( ++rowCount > bufRows )
|
||||
{
|
||||
--rowCount;
|
||||
@ -394,7 +394,7 @@ int FilterEngine::proceed( const uchar* src, int srcstep, int count,
|
||||
row[i + (width1 - _dx2)*esz] = src[btab[i+_dx1*esz]];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( isSep )
|
||||
(*rowFilter)(row, brow, width, CV_MAT_CN(srcType));
|
||||
}
|
||||
@ -434,11 +434,11 @@ void FilterEngine::apply(const Mat& src, Mat& dst,
|
||||
const Rect& _srcRoi, Point dstOfs, bool isolated)
|
||||
{
|
||||
CV_Assert( src.type() == srcType && dst.type() == dstType );
|
||||
|
||||
|
||||
Rect srcRoi = _srcRoi;
|
||||
if( srcRoi == Rect(0,0,-1,-1) )
|
||||
srcRoi = Rect(0,0,src.cols,src.rows);
|
||||
|
||||
|
||||
if( srcRoi.area() == 0 )
|
||||
return;
|
||||
|
||||
@ -560,7 +560,7 @@ struct RowVec_8u32s
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
int i = 0, k, _ksize = kernel.rows + kernel.cols - 1;
|
||||
int* dst = (int*)_dst;
|
||||
const int* _kx = (const int*)kernel.data;
|
||||
@ -593,7 +593,7 @@ struct RowVec_8u32s
|
||||
s2 = _mm_add_epi32(s2, _mm_unpacklo_epi16(x2, x3));
|
||||
s3 = _mm_add_epi32(s3, _mm_unpackhi_epi16(x2, x3));
|
||||
}
|
||||
|
||||
|
||||
_mm_store_si128((__m128i*)(dst + i), s0);
|
||||
_mm_store_si128((__m128i*)(dst + i + 4), s1);
|
||||
_mm_store_si128((__m128i*)(dst + i + 8), s2);
|
||||
@ -652,7 +652,7 @@ struct SymmRowSmallVec_8u32s
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
int i = 0, j, k, _ksize = kernel.rows + kernel.cols - 1;
|
||||
int* dst = (int*)_dst;
|
||||
bool symmetrical = (symmetryType & KERNEL_SYMMETRICAL) != 0;
|
||||
@ -973,7 +973,7 @@ struct SymmColumnVec_32s8u
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
int ksize2 = (kernel.rows + kernel.cols - 1)/2;
|
||||
const float* ky = (const float*)kernel.data + ksize2;
|
||||
int i = 0, k;
|
||||
@ -1121,7 +1121,7 @@ struct SymmColumnSmallVec_32s16s
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
int ksize2 = (kernel.rows + kernel.cols - 1)/2;
|
||||
const float* ky = (const float*)kernel.data + ksize2;
|
||||
int i = 0;
|
||||
@ -1237,9 +1237,9 @@ struct SymmColumnSmallVec_32s16s
|
||||
Mat kernel;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////// 16s //////////////////////////////////
|
||||
|
||||
|
||||
struct RowVec_16s32f
|
||||
{
|
||||
RowVec_16s32f() {}
|
||||
@ -1248,17 +1248,17 @@ struct RowVec_16s32f
|
||||
kernel = _kernel;
|
||||
sse2_supported = checkHardwareSupport(CV_CPU_SSE2);
|
||||
}
|
||||
|
||||
|
||||
int operator()(const uchar* _src, uchar* _dst, int width, int cn) const
|
||||
{
|
||||
if( !sse2_supported )
|
||||
return 0;
|
||||
|
||||
|
||||
int i = 0, k, _ksize = kernel.rows + kernel.cols - 1;
|
||||
float* dst = (float*)_dst;
|
||||
const float* _kx = (const float*)kernel.data;
|
||||
width *= cn;
|
||||
|
||||
|
||||
for( ; i <= width - 8; i += 8 )
|
||||
{
|
||||
const short* src = (const short*)_src + i;
|
||||
@ -1267,7 +1267,7 @@ struct RowVec_16s32f
|
||||
{
|
||||
f = _mm_load_ss(_kx+k);
|
||||
f = _mm_shuffle_ps(f, f, 0);
|
||||
|
||||
|
||||
__m128i x0i = _mm_loadu_si128((const __m128i*)src);
|
||||
__m128i x1i = _mm_srai_epi32(_mm_unpackhi_epi16(x0i, x0i), 16);
|
||||
x0i = _mm_srai_epi32(_mm_unpacklo_epi16(x0i, x0i), 16);
|
||||
@ -1281,12 +1281,12 @@ struct RowVec_16s32f
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
Mat kernel;
|
||||
bool sse2_supported;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
struct SymmColumnVec_32f16s
|
||||
{
|
||||
SymmColumnVec_32f16s() { symmetryType=0; }
|
||||
@ -1298,12 +1298,12 @@ struct SymmColumnVec_32f16s
|
||||
CV_Assert( (symmetryType & (KERNEL_SYMMETRICAL | KERNEL_ASYMMETRICAL)) != 0 );
|
||||
sse2_supported = checkHardwareSupport(CV_CPU_SSE2);
|
||||
}
|
||||
|
||||
|
||||
int operator()(const uchar** _src, uchar* _dst, int width) const
|
||||
{
|
||||
if( !sse2_supported )
|
||||
return 0;
|
||||
|
||||
|
||||
int ksize2 = (kernel.rows + kernel.cols - 1)/2;
|
||||
const float* ky = (const float*)kernel.data + ksize2;
|
||||
int i = 0, k;
|
||||
@ -1312,7 +1312,7 @@ struct SymmColumnVec_32f16s
|
||||
const float *S, *S2;
|
||||
short* dst = (short*)_dst;
|
||||
__m128 d4 = _mm_set1_ps(delta);
|
||||
|
||||
|
||||
if( symmetrical )
|
||||
{
|
||||
for( ; i <= width - 16; i += 16 )
|
||||
@ -1330,7 +1330,7 @@ struct SymmColumnVec_32f16s
|
||||
s3 = _mm_load_ps(S+12);
|
||||
s2 = _mm_add_ps(_mm_mul_ps(s2, f), d4);
|
||||
s3 = _mm_add_ps(_mm_mul_ps(s3, f), d4);
|
||||
|
||||
|
||||
for( k = 1; k <= ksize2; k++ )
|
||||
{
|
||||
S = src[k] + i;
|
||||
@ -1346,23 +1346,23 @@ struct SymmColumnVec_32f16s
|
||||
s2 = _mm_add_ps(s2, _mm_mul_ps(x0, f));
|
||||
s3 = _mm_add_ps(s3, _mm_mul_ps(x1, f));
|
||||
}
|
||||
|
||||
|
||||
__m128i s0i = _mm_cvtps_epi32(s0);
|
||||
__m128i s1i = _mm_cvtps_epi32(s1);
|
||||
__m128i s2i = _mm_cvtps_epi32(s2);
|
||||
__m128i s3i = _mm_cvtps_epi32(s3);
|
||||
|
||||
|
||||
_mm_storeu_si128((__m128i*)(dst + i), _mm_packs_epi32(s0i, s1i));
|
||||
_mm_storeu_si128((__m128i*)(dst + i + 8), _mm_packs_epi32(s2i, s3i));
|
||||
}
|
||||
|
||||
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
__m128 f = _mm_load_ss(ky);
|
||||
f = _mm_shuffle_ps(f, f, 0);
|
||||
__m128 x0, s0 = _mm_load_ps(src[0] + i);
|
||||
s0 = _mm_add_ps(_mm_mul_ps(s0, f), d4);
|
||||
|
||||
|
||||
for( k = 1; k <= ksize2; k++ )
|
||||
{
|
||||
f = _mm_load_ss(ky+k);
|
||||
@ -1372,7 +1372,7 @@ struct SymmColumnVec_32f16s
|
||||
x0 = _mm_add_ps(_mm_load_ps(src[k]+i), _mm_load_ps(src[-k] + i));
|
||||
s0 = _mm_add_ps(s0, _mm_mul_ps(x0, f));
|
||||
}
|
||||
|
||||
|
||||
__m128i s0i = _mm_cvtps_epi32(s0);
|
||||
_mm_storel_epi64((__m128i*)(dst + i), _mm_packs_epi32(s0i, s0i));
|
||||
}
|
||||
@ -1384,7 +1384,7 @@ struct SymmColumnVec_32f16s
|
||||
__m128 f, s0 = d4, s1 = d4, s2 = d4, s3 = d4;
|
||||
__m128 x0, x1;
|
||||
S = src[0] + i;
|
||||
|
||||
|
||||
for( k = 1; k <= ksize2; k++ )
|
||||
{
|
||||
S = src[k] + i;
|
||||
@ -1400,20 +1400,20 @@ struct SymmColumnVec_32f16s
|
||||
s2 = _mm_add_ps(s2, _mm_mul_ps(x0, f));
|
||||
s3 = _mm_add_ps(s3, _mm_mul_ps(x1, f));
|
||||
}
|
||||
|
||||
|
||||
__m128i s0i = _mm_cvtps_epi32(s0);
|
||||
__m128i s1i = _mm_cvtps_epi32(s1);
|
||||
__m128i s2i = _mm_cvtps_epi32(s2);
|
||||
__m128i s3i = _mm_cvtps_epi32(s3);
|
||||
|
||||
|
||||
_mm_storeu_si128((__m128i*)(dst + i), _mm_packs_epi32(s0i, s1i));
|
||||
_mm_storeu_si128((__m128i*)(dst + i + 8), _mm_packs_epi32(s2i, s3i));
|
||||
}
|
||||
|
||||
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
__m128 f, x0, s0 = d4;
|
||||
|
||||
|
||||
for( k = 1; k <= ksize2; k++ )
|
||||
{
|
||||
f = _mm_load_ss(ky+k);
|
||||
@ -1421,21 +1421,21 @@ struct SymmColumnVec_32f16s
|
||||
x0 = _mm_sub_ps(_mm_load_ps(src[k]+i), _mm_load_ps(src[-k] + i));
|
||||
s0 = _mm_add_ps(s0, _mm_mul_ps(x0, f));
|
||||
}
|
||||
|
||||
|
||||
__m128i s0i = _mm_cvtps_epi32(s0);
|
||||
_mm_storel_epi64((__m128i*)(dst + i), _mm_packs_epi32(s0i, s0i));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
int symmetryType;
|
||||
float delta;
|
||||
Mat kernel;
|
||||
bool sse2_supported;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
/////////////////////////////////////// 32f //////////////////////////////////
|
||||
|
||||
@ -1451,7 +1451,7 @@ struct RowVec_32f
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE) )
|
||||
return 0;
|
||||
|
||||
|
||||
int i = 0, k, _ksize = kernel.rows + kernel.cols - 1;
|
||||
float* dst = (float*)_dst;
|
||||
const float* _kx = (const float*)kernel.data;
|
||||
@ -1494,7 +1494,7 @@ struct SymmRowSmallVec_32f
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE) )
|
||||
return 0;
|
||||
|
||||
|
||||
int i = 0, _ksize = kernel.rows + kernel.cols - 1;
|
||||
float* dst = (float*)_dst;
|
||||
const float* src = (const float*)_src + (_ksize/2)*cn;
|
||||
@ -1594,12 +1594,12 @@ struct SymmRowSmallVec_32f
|
||||
y0 = _mm_mul_ps(_mm_add_ps(y0, y2), k1);
|
||||
x0 = _mm_add_ps(x0, _mm_mul_ps(x1, k0));
|
||||
y0 = _mm_add_ps(y0, _mm_mul_ps(y1, k0));
|
||||
|
||||
|
||||
x2 = _mm_add_ps(_mm_loadu_ps(src + cn*2), _mm_loadu_ps(src - cn*2));
|
||||
y2 = _mm_add_ps(_mm_loadu_ps(src + cn*2 + 4), _mm_loadu_ps(src - cn*2 + 4));
|
||||
x0 = _mm_add_ps(x0, _mm_mul_ps(x2, k2));
|
||||
y0 = _mm_add_ps(y0, _mm_mul_ps(y2, k2));
|
||||
|
||||
|
||||
_mm_store_ps(dst + i, x0);
|
||||
_mm_store_ps(dst + i + 4, y0);
|
||||
}
|
||||
@ -1654,12 +1654,12 @@ struct SymmRowSmallVec_32f
|
||||
|
||||
x0 = _mm_mul_ps(_mm_sub_ps(x0, x2), k1);
|
||||
y0 = _mm_mul_ps(_mm_sub_ps(y0, y2), k1);
|
||||
|
||||
|
||||
x2 = _mm_sub_ps(_mm_loadu_ps(src + cn*2), _mm_loadu_ps(src - cn*2));
|
||||
y2 = _mm_sub_ps(_mm_loadu_ps(src + cn*2 + 4), _mm_loadu_ps(src - cn*2 + 4));
|
||||
x0 = _mm_add_ps(x0, _mm_mul_ps(x2, k2));
|
||||
y0 = _mm_add_ps(y0, _mm_mul_ps(y2, k2));
|
||||
|
||||
|
||||
_mm_store_ps(dst + i, x0);
|
||||
_mm_store_ps(dst + i + 4, y0);
|
||||
}
|
||||
@ -1689,7 +1689,7 @@ struct SymmColumnVec_32f
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE) )
|
||||
return 0;
|
||||
|
||||
|
||||
int ksize2 = (kernel.rows + kernel.cols - 1)/2;
|
||||
const float* ky = (const float*)kernel.data + ksize2;
|
||||
int i = 0, k;
|
||||
@ -1829,7 +1829,7 @@ struct SymmColumnSmallVec_32f
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE) )
|
||||
return 0;
|
||||
|
||||
|
||||
int ksize2 = (kernel.rows + kernel.cols - 1)/2;
|
||||
const float* ky = (const float*)kernel.data + ksize2;
|
||||
int i = 0;
|
||||
@ -1963,7 +1963,7 @@ struct FilterVec_8u
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
const float* kf = (const float*)&coeffs[0];
|
||||
int i = 0, k, nz = _nz;
|
||||
__m128 d4 = _mm_set1_ps(delta);
|
||||
@ -2046,7 +2046,7 @@ struct FilterVec_8u16s
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE2) )
|
||||
return 0;
|
||||
|
||||
|
||||
const float* kf = (const float*)&coeffs[0];
|
||||
short* dst = (short*)_dst;
|
||||
int i = 0, k, nz = _nz;
|
||||
@ -2127,7 +2127,7 @@ struct FilterVec_32f
|
||||
{
|
||||
if( !checkHardwareSupport(CV_CPU_SSE) )
|
||||
return 0;
|
||||
|
||||
|
||||
const float* kf = (const float*)&coeffs[0];
|
||||
const float** src = (const float**)_src;
|
||||
float* dst = (float*)_dst;
|
||||
@ -2217,7 +2217,7 @@ template<typename ST, typename DT, class VecOp> struct RowFilter : public BaseRo
|
||||
(kernel.rows == 1 || kernel.cols == 1));
|
||||
vecOp = _vecOp;
|
||||
}
|
||||
|
||||
|
||||
void operator()(const uchar* src, uchar* dst, int width, int cn)
|
||||
{
|
||||
int _ksize = ksize;
|
||||
@ -2242,7 +2242,7 @@ template<typename ST, typename DT, class VecOp> struct RowFilter : public BaseRo
|
||||
s0 += f*S[0]; s1 += f*S[1];
|
||||
s2 += f*S[2]; s3 += f*S[3];
|
||||
}
|
||||
|
||||
|
||||
D[i] = s0; D[i+1] = s1;
|
||||
D[i+2] = s2; D[i+3] = s3;
|
||||
}
|
||||
@ -2275,7 +2275,7 @@ template<typename ST, typename DT, class VecOp> struct SymmRowSmallFilter :
|
||||
symmetryType = _symmetryType;
|
||||
CV_Assert( (symmetryType & (KERNEL_SYMMETRICAL | KERNEL_ASYMMETRICAL)) != 0 && this->ksize <= 5 );
|
||||
}
|
||||
|
||||
|
||||
void operator()(const uchar* src, uchar* dst, int width, int cn)
|
||||
{
|
||||
int ksize2 = this->ksize/2, ksize2n = ksize2*cn;
|
||||
@ -2397,7 +2397,7 @@ template<class CastOp, class VecOp> struct ColumnFilter : public BaseColumnFilte
|
||||
{
|
||||
typedef typename CastOp::type1 ST;
|
||||
typedef typename CastOp::rtype DT;
|
||||
|
||||
|
||||
ColumnFilter( const Mat& _kernel, int _anchor,
|
||||
double _delta, const CastOp& _castOp=CastOp(),
|
||||
const VecOp& _vecOp=VecOp() )
|
||||
@ -2427,7 +2427,7 @@ template<class CastOp, class VecOp> struct ColumnFilter : public BaseColumnFilte
|
||||
{
|
||||
DT* D = (DT*)dst;
|
||||
i = vecOp(src, dst, width);
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST f = ky[0];
|
||||
@ -2574,7 +2574,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
{
|
||||
typedef typename CastOp::type1 ST;
|
||||
typedef typename CastOp::rtype DT;
|
||||
|
||||
|
||||
SymmColumnSmallFilter( const Mat& _kernel, int _anchor,
|
||||
double _delta, int _symmetryType,
|
||||
const CastOp& _castOp=CastOp(),
|
||||
@ -2610,7 +2610,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
{
|
||||
if( is_1_2_1 )
|
||||
{
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST s0 = S0[i] + S1[i]*2 + S2[i] + _delta;
|
||||
@ -2624,7 +2624,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
for( ; i < width; i ++ )
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S0[i] + S1[i]*2 + S2[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
@ -2633,7 +2633,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
}
|
||||
else if( is_1_m2_1 )
|
||||
{
|
||||
#if CV_ENABLE_UNROLLED
|
||||
#if CV_ENABLE_UNROLLED
|
||||
for( ; i <= width - 4; i += 4 )
|
||||
{
|
||||
ST s0 = S0[i] - S1[i]*2 + S2[i] + _delta;
|
||||
@ -2647,7 +2647,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
for( ; i < width; i ++ )
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S0[i] - S1[i]*2 + S2[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
@ -2700,7 +2700,7 @@ struct SymmColumnSmallFilter : public SymmColumnFilter<CastOp, VecOp>
|
||||
D[i+3] = castOp(s1);
|
||||
}
|
||||
#else
|
||||
for( ; i < width; i ++ )
|
||||
for( ; i < width; i ++ )
|
||||
{
|
||||
ST s0 = S2[i] - S0[i] + _delta;
|
||||
D[i] = castOp(s0);
|
||||
@ -2763,7 +2763,7 @@ template<typename ST, typename DT> struct FixedPtCastEx
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
cv::Ptr<cv::BaseRowFilter> cv::getLinearRowFilter( int srcType, int bufType,
|
||||
InputArray _kernel, int anchor,
|
||||
int symmetryType )
|
||||
@ -2785,7 +2785,7 @@ cv::Ptr<cv::BaseRowFilter> cv::getLinearRowFilter( int srcType, int bufType,
|
||||
return Ptr<BaseRowFilter>(new SymmRowSmallFilter<float, float, SymmRowSmallVec_32f>
|
||||
(kernel, anchor, symmetryType, SymmRowSmallVec_32f(kernel, symmetryType)));
|
||||
}
|
||||
|
||||
|
||||
if( sdepth == CV_8U && ddepth == CV_32S )
|
||||
return Ptr<BaseRowFilter>(new RowFilter<uchar, int, RowVec_8u32s>
|
||||
(kernel, anchor, RowVec_8u32s(kernel)));
|
||||
@ -2820,7 +2820,7 @@ cv::Ptr<cv::BaseRowFilter> cv::getLinearRowFilter( int srcType, int bufType,
|
||||
|
||||
cv::Ptr<cv::BaseColumnFilter> cv::getLinearColumnFilter( int bufType, int dstType,
|
||||
InputArray _kernel, int anchor,
|
||||
int symmetryType, double delta,
|
||||
int symmetryType, double delta,
|
||||
int bits )
|
||||
{
|
||||
Mat kernel = _kernel.getMat();
|
||||
@ -3045,7 +3045,7 @@ template<typename ST, class CastOp, class VecOp> struct Filter2D : public BaseFi
|
||||
{
|
||||
typedef typename CastOp::type1 KT;
|
||||
typedef typename CastOp::rtype DT;
|
||||
|
||||
|
||||
Filter2D( const Mat& _kernel, Point _anchor,
|
||||
double _delta, const CastOp& _castOp=CastOp(),
|
||||
const VecOp& _vecOp=VecOp() )
|
||||
@ -3143,7 +3143,7 @@ cv::Ptr<cv::BaseFilter> cv::getLinearFilter(int srcType, int dstType,
|
||||
kernel = _kernel;
|
||||
else
|
||||
_kernel.convertTo(kernel, kdepth, _kernel.type() == CV_32S ? 1./(1 << bits) : 1.);
|
||||
|
||||
|
||||
if( sdepth == CV_8U && ddepth == CV_8U )
|
||||
return Ptr<BaseFilter>(new Filter2D<uchar, Cast<float, uchar>, FilterVec_8u>
|
||||
(kernel, anchor, delta, Cast<float, uchar>(), FilterVec_8u(kernel, 0, delta)));
|
||||
@ -3203,7 +3203,7 @@ cv::Ptr<cv::FilterEngine> cv::createLinearFilter( int _srcType, int _dstType,
|
||||
{
|
||||
Mat _kernel = filter_kernel.getMat();
|
||||
_srcType = CV_MAT_TYPE(_srcType);
|
||||
_dstType = CV_MAT_TYPE(_dstType);
|
||||
_dstType = CV_MAT_TYPE(_dstType);
|
||||
int cn = CV_MAT_CN(_srcType);
|
||||
CV_Assert( cn == CV_MAT_CN(_dstType) );
|
||||
|
||||
@ -3211,14 +3211,14 @@ cv::Ptr<cv::FilterEngine> cv::createLinearFilter( int _srcType, int _dstType,
|
||||
int bits = 0;
|
||||
|
||||
/*int sdepth = CV_MAT_DEPTH(_srcType), ddepth = CV_MAT_DEPTH(_dstType);
|
||||
int ktype = _kernel.depth() == CV_32S ? KERNEL_INTEGER : getKernelType(_kernel, _anchor);
|
||||
int ktype = _kernel.depth() == CV_32S ? KERNEL_INTEGER : getKernelType(_kernel, _anchor);
|
||||
if( sdepth == CV_8U && (ddepth == CV_8U || ddepth == CV_16S) &&
|
||||
_kernel.rows*_kernel.cols <= (1 << 10) )
|
||||
{
|
||||
bits = (ktype & KERNEL_INTEGER) ? 0 : 11;
|
||||
_kernel.convertTo(kernel, CV_32S, 1 << bits);
|
||||
}*/
|
||||
|
||||
|
||||
Ptr<BaseFilter> _filter2D = getLinearFilter(_srcType, _dstType,
|
||||
kernel, _anchor, _delta, bits);
|
||||
|
||||
@ -3233,7 +3233,7 @@ void cv::filter2D( InputArray _src, OutputArray _dst, int ddepth,
|
||||
double delta, int borderType )
|
||||
{
|
||||
Mat src = _src.getMat(), kernel = _kernel.getMat();
|
||||
|
||||
|
||||
if( ddepth < 0 )
|
||||
ddepth = src.depth();
|
||||
|
||||
@ -3279,7 +3279,7 @@ void cv::sepFilter2D( InputArray _src, OutputArray _dst, int ddepth,
|
||||
double delta, int borderType )
|
||||
{
|
||||
Mat src = _src.getMat(), kernelX = _kernelX.getMat(), kernelY = _kernelY.getMat();
|
||||
|
||||
|
||||
if( ddepth < 0 )
|
||||
ddepth = src.depth();
|
||||
|
||||
|
@ -64,7 +64,7 @@ private:
|
||||
int ts;
|
||||
int dist;
|
||||
TWeight weight;
|
||||
uchar t;
|
||||
uchar t;
|
||||
};
|
||||
class Edge
|
||||
{
|
||||
@ -174,7 +174,7 @@ TWeight GCGraph<TWeight>::maxFlow()
|
||||
v->t = v->weight < 0;
|
||||
}
|
||||
else
|
||||
v->parent = 0;
|
||||
v->parent = 0;
|
||||
}
|
||||
first = first->next;
|
||||
last->next = nilNode;
|
||||
@ -290,14 +290,14 @@ TWeight GCGraph<TWeight>::maxFlow()
|
||||
curr_ts++;
|
||||
while( !orphans.empty() )
|
||||
{
|
||||
Vtx* v = orphans.back();
|
||||
Vtx* v2 = orphans.back();
|
||||
orphans.pop_back();
|
||||
|
||||
int d, minDist = INT_MAX;
|
||||
e0 = 0;
|
||||
vt = v->t;
|
||||
vt = v2->t;
|
||||
|
||||
for( ei = v->first; ei != 0; ei = edgePtr[ei].next )
|
||||
for( ei = v2->first; ei != 0; ei = edgePtr[ei].next )
|
||||
{
|
||||
if( edgePtr[ei^(vt^1)].weight == 0 )
|
||||
continue;
|
||||
@ -344,16 +344,16 @@ TWeight GCGraph<TWeight>::maxFlow()
|
||||
}
|
||||
}
|
||||
|
||||
if( (v->parent = e0) > 0 )
|
||||
if( (v2->parent = e0) > 0 )
|
||||
{
|
||||
v->ts = curr_ts;
|
||||
v->dist = minDist;
|
||||
v2->ts = curr_ts;
|
||||
v2->dist = minDist;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* no parent is found */
|
||||
v->ts = 0;
|
||||
for( ei = v->first; ei != 0; ei = edgePtr[ei].next )
|
||||
v2->ts = 0;
|
||||
for( ei = v2->first; ei != 0; ei = edgePtr[ei].next )
|
||||
{
|
||||
u = vtxPtr+edgePtr[ei].dst;
|
||||
ej = u->parent;
|
||||
@ -364,7 +364,7 @@ TWeight GCGraph<TWeight>::maxFlow()
|
||||
u->next = nilNode;
|
||||
last = last->next = u;
|
||||
}
|
||||
if( ej > 0 && vtxPtr+edgePtr[ej].dst == v )
|
||||
if( ej > 0 && vtxPtr+edgePtr[ej].dst == v2 )
|
||||
{
|
||||
orphans.push_back(u);
|
||||
u->parent = ORPHAN;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -92,8 +92,6 @@ icvHoughLinesStandard( const CvMat* img, float rho, float theta,
|
||||
int step, width, height;
|
||||
int numangle, numrho;
|
||||
int total = 0;
|
||||
float ang;
|
||||
int r, n;
|
||||
int i, j;
|
||||
float irho = 1 / rho;
|
||||
double scale;
|
||||
@ -117,7 +115,8 @@ icvHoughLinesStandard( const CvMat* img, float rho, float theta,
|
||||
|
||||
memset( accum, 0, sizeof(accum[0]) * (numangle+2) * (numrho+2) );
|
||||
|
||||
for( ang = 0, n = 0; n < numangle; ang += theta, n++ )
|
||||
float ang = 0;
|
||||
for(int n = 0; n < numangle; ang += theta, n++ )
|
||||
{
|
||||
tabSin[n] = (float)(sin(ang) * irho);
|
||||
tabCos[n] = (float)(cos(ang) * irho);
|
||||
@ -128,17 +127,17 @@ icvHoughLinesStandard( const CvMat* img, float rho, float theta,
|
||||
for( j = 0; j < width; j++ )
|
||||
{
|
||||
if( image[i * step + j] != 0 )
|
||||
for( n = 0; n < numangle; n++ )
|
||||
for(int n = 0; n < numangle; n++ )
|
||||
{
|
||||
r = cvRound( j * tabCos[n] + i * tabSin[n] );
|
||||
int r = cvRound( j * tabCos[n] + i * tabSin[n] );
|
||||
r += (numrho - 1) / 2;
|
||||
accum[(n+1) * (numrho+2) + r+1]++;
|
||||
}
|
||||
}
|
||||
|
||||
// stage 2. find local maximums
|
||||
for( r = 0; r < numrho; r++ )
|
||||
for( n = 0; n < numangle; n++ )
|
||||
for(int r = 0; r < numrho; r++ )
|
||||
for(int n = 0; n < numangle; n++ )
|
||||
{
|
||||
int base = (n+1) * (numrho+2) + r+1;
|
||||
if( accum[base] > threshold &&
|
||||
@ -529,7 +528,7 @@ icvHoughLinesProbabilistic( CvMat* image,
|
||||
// choose random point out of the remaining ones
|
||||
int idx = cvRandInt(&rng) % count;
|
||||
int max_val = threshold-1, max_n = 0;
|
||||
CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, idx );
|
||||
CvPoint* point = (CvPoint*)cvGetSeqElem( seq, idx );
|
||||
CvPoint line_end[2] = {{0,0}, {0,0}};
|
||||
float a, b;
|
||||
int* adata = (int*)accum.data;
|
||||
@ -537,11 +536,11 @@ icvHoughLinesProbabilistic( CvMat* image,
|
||||
int good_line;
|
||||
const int shift = 16;
|
||||
|
||||
i = pt->y;
|
||||
j = pt->x;
|
||||
i = point->y;
|
||||
j = point->x;
|
||||
|
||||
// "remove" it by overriding it with the last element
|
||||
*pt = *(CvPoint*)cvGetSeqElem( seq, count-1 );
|
||||
*point = *(CvPoint*)cvGetSeqElem( seq, count-1 );
|
||||
|
||||
// check if it has been excluded already (i.e. belongs to some other line)
|
||||
if( !mdata0[i*width + j] )
|
||||
@ -852,7 +851,7 @@ icvHoughCirclesGradient( CvMat* img, float dp, float min_dist,
|
||||
for( x = 0; x < cols; x++ )
|
||||
{
|
||||
float vx, vy;
|
||||
int sx, sy, x0, y0, x1, y1, r, k;
|
||||
int sx, sy, x0, y0, x1, y1, r;
|
||||
CvPoint pt;
|
||||
|
||||
vx = dx_row[x];
|
||||
@ -869,7 +868,7 @@ icvHoughCirclesGradient( CvMat* img, float dp, float min_dist,
|
||||
x0 = cvRound((x*idp)*ONE);
|
||||
y0 = cvRound((y*idp)*ONE);
|
||||
// Step from min_radius to max_radius in both directions of the gradient
|
||||
for( k = 0; k < 2; k++ )
|
||||
for(int k1 = 0; k1 < 2; k1++ )
|
||||
{
|
||||
x1 = x0 + min_radius * sx;
|
||||
y1 = y0 + min_radius * sy;
|
||||
@ -934,7 +933,7 @@ icvHoughCirclesGradient( CvMat* img, float dp, float min_dist,
|
||||
//Calculate circle's center in pixels
|
||||
float cx = (float)((x + 0.5f)*dp), cy = (float)(( y + 0.5f )*dp);
|
||||
float start_dist, dist_sum;
|
||||
float r_best = 0, c[3];
|
||||
float r_best = 0;
|
||||
int max_count = 0;
|
||||
// Check distance with previously detected circles
|
||||
for( j = 0; j < circles->total; j++ )
|
||||
@ -996,6 +995,7 @@ icvHoughCirclesGradient( CvMat* img, float dp, float min_dist,
|
||||
// Check if the circle has enough support
|
||||
if( max_count > acc_threshold )
|
||||
{
|
||||
float c[3];
|
||||
c[0] = cx;
|
||||
c[1] = cy;
|
||||
c[2] = (float)r_best;
|
||||
|
@ -97,7 +97,6 @@ static inline void interpolateLanczos4( float x, float* coeffs )
|
||||
static const double cs[][2]=
|
||||
{{1, 0}, {-s45, -s45}, {0, 1}, {s45, -s45}, {-1, 0}, {s45, s45}, {0, -1}, {-s45, s45}};
|
||||
|
||||
int i;
|
||||
if( x < FLT_EPSILON )
|
||||
{
|
||||
for( int i = 0; i < 8; i++ )
|
||||
@ -108,7 +107,7 @@ static inline void interpolateLanczos4( float x, float* coeffs )
|
||||
|
||||
float sum = 0;
|
||||
double y0=-(x+3)*CV_PI*0.25, s0 = sin(y0), c0=cos(y0);
|
||||
for( i = 0; i < 8; i++ )
|
||||
for(int i = 0; i < 8; i++ )
|
||||
{
|
||||
double y = -(x+3-i)*CV_PI*0.25;
|
||||
coeffs[i] = (float)((cs[i][0]*s0 + cs[i][1]*c0)/(y*y));
|
||||
@ -116,7 +115,7 @@ static inline void interpolateLanczos4( float x, float* coeffs )
|
||||
}
|
||||
|
||||
sum = 1.f/sum;
|
||||
for( i = 0; i < 8; i++ )
|
||||
for(int i = 0; i < 8; i++ )
|
||||
coeffs[i] *= sum;
|
||||
}
|
||||
|
||||
@ -1091,14 +1090,14 @@ static void resizeGeneric_( const Mat& src, Mat& dst,
|
||||
const T* srows[MAX_ESIZE]={0};
|
||||
WT* rows[MAX_ESIZE]={0};
|
||||
int prev_sy[MAX_ESIZE];
|
||||
int k, dy;
|
||||
int dy;
|
||||
xmin *= cn;
|
||||
xmax *= cn;
|
||||
|
||||
HResize hresize;
|
||||
VResize vresize;
|
||||
|
||||
for( k = 0; k < ksize; k++ )
|
||||
for(int k = 0; k < ksize; k++ )
|
||||
{
|
||||
prev_sy[k] = -1;
|
||||
rows[k] = (WT*)_buffer + bufstep*k;
|
||||
@ -1107,9 +1106,9 @@ static void resizeGeneric_( const Mat& src, Mat& dst,
|
||||
// image resize is a separable operation. In case of not too strong
|
||||
for( dy = 0; dy < dsize.height; dy++, beta += ksize )
|
||||
{
|
||||
int sy0 = yofs[dy], k, k0=ksize, k1=0, ksize2 = ksize/2;
|
||||
int sy0 = yofs[dy], k0=ksize, k1=0, ksize2 = ksize/2;
|
||||
|
||||
for( k = 0; k < ksize; k++ )
|
||||
for(int k = 0; k < ksize; k++ )
|
||||
{
|
||||
int sy = clip(sy0 - ksize2 + 1 + k, 0, ssize.height);
|
||||
for( k1 = std::max(k1, k); k1 < ksize; k1++ )
|
||||
@ -2374,25 +2373,25 @@ static void remapLanczos4( const Mat& _src, Mat& _dst, const Mat& _xy,
|
||||
for( i = 0; i < 8; i++, w += 8 )
|
||||
{
|
||||
int yi = y[i];
|
||||
const T* S = S0 + yi*sstep;
|
||||
const T* S1 = S0 + yi*sstep;
|
||||
if( yi < 0 )
|
||||
continue;
|
||||
if( x[0] >= 0 )
|
||||
sum += (S[x[0]] - cv)*w[0];
|
||||
sum += (S1[x[0]] - cv)*w[0];
|
||||
if( x[1] >= 0 )
|
||||
sum += (S[x[1]] - cv)*w[1];
|
||||
sum += (S1[x[1]] - cv)*w[1];
|
||||
if( x[2] >= 0 )
|
||||
sum += (S[x[2]] - cv)*w[2];
|
||||
sum += (S1[x[2]] - cv)*w[2];
|
||||
if( x[3] >= 0 )
|
||||
sum += (S[x[3]] - cv)*w[3];
|
||||
sum += (S1[x[3]] - cv)*w[3];
|
||||
if( x[4] >= 0 )
|
||||
sum += (S[x[4]] - cv)*w[4];
|
||||
sum += (S1[x[4]] - cv)*w[4];
|
||||
if( x[5] >= 0 )
|
||||
sum += (S[x[5]] - cv)*w[5];
|
||||
sum += (S1[x[5]] - cv)*w[5];
|
||||
if( x[6] >= 0 )
|
||||
sum += (S[x[6]] - cv)*w[6];
|
||||
sum += (S1[x[6]] - cv)*w[6];
|
||||
if( x[7] >= 0 )
|
||||
sum += (S[x[7]] - cv)*w[7];
|
||||
sum += (S1[x[7]] - cv)*w[7];
|
||||
}
|
||||
D[k] = castOp(sum);
|
||||
}
|
||||
@ -2966,8 +2965,8 @@ void cv::warpAffine( InputArray _src, OutputArray _dst,
|
||||
remap( src, dpart, _XY, Mat(), interpolation, borderType, borderValue );
|
||||
else
|
||||
{
|
||||
Mat matA(bh, bw, CV_16U, A);
|
||||
remap( src, dpart, _XY, matA, interpolation, borderType, borderValue );
|
||||
Mat _matA(bh, bw, CV_16U, A);
|
||||
remap( src, dpart, _XY, _matA, interpolation, borderType, borderValue );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3064,8 +3063,8 @@ void cv::warpPerspective( InputArray _src, OutputArray _dst, InputArray _M0,
|
||||
remap( src, dpart, _XY, Mat(), interpolation, borderType, borderValue );
|
||||
else
|
||||
{
|
||||
Mat matA(bh, bw, CV_16U, A);
|
||||
remap( src, dpart, _XY, matA, interpolation, borderType, borderValue );
|
||||
Mat _matA(bh, bw, CV_16U, A);
|
||||
remap( src, dpart, _XY, _matA, interpolation, borderType, borderValue );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* moments )
|
||||
yi_1 = ((CvPoint2D32f*)(reader.ptr))->y;
|
||||
}
|
||||
CV_NEXT_SEQ_ELEM( contour->elem_size, reader );
|
||||
|
||||
|
||||
xi_12 = xi_1 * xi_1;
|
||||
yi_12 = yi_1 * yi_1;
|
||||
|
||||
@ -208,7 +208,7 @@ static void momentsInTile( const cv::Mat& img, double* moments )
|
||||
const T* ptr = (const T*)(img.data + y*img.step);
|
||||
WT x0 = 0, x1 = 0, x2 = 0;
|
||||
MT x3 = 0;
|
||||
|
||||
|
||||
for( x = 0; x < size.width; x++ )
|
||||
{
|
||||
WT p = ptr[x];
|
||||
@ -248,21 +248,21 @@ template<> void momentsInTile<uchar, int, int>( const cv::Mat& img, double* mome
|
||||
typedef int WT;
|
||||
typedef int MT;
|
||||
cv::Size size = img.size();
|
||||
int x, y;
|
||||
int y;
|
||||
MT mom[10] = {0,0,0,0,0,0,0,0,0,0};
|
||||
bool useSIMD = cv::checkHardwareSupport(CV_CPU_SSE2);
|
||||
|
||||
|
||||
for( y = 0; y < size.height; y++ )
|
||||
{
|
||||
const T* ptr = img.ptr<T>(y);
|
||||
int x0 = 0, x1 = 0, x2 = 0, x3 = 0, x = 0;
|
||||
|
||||
|
||||
if( useSIMD )
|
||||
{
|
||||
__m128i qx_init = _mm_setr_epi16(0, 1, 2, 3, 4, 5, 6, 7);
|
||||
__m128i dx = _mm_set1_epi16(8);
|
||||
__m128i z = _mm_setzero_si128(), qx0 = z, qx1 = z, qx2 = z, qx3 = z, qx = qx_init;
|
||||
|
||||
|
||||
for( ; x <= size.width - 8; x += 8 )
|
||||
{
|
||||
__m128i p = _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(ptr + x)), z);
|
||||
@ -272,34 +272,34 @@ template<> void momentsInTile<uchar, int, int>( const cv::Mat& img, double* mome
|
||||
qx1 = _mm_add_epi32(qx1, _mm_madd_epi16(p, qx));
|
||||
qx2 = _mm_add_epi32(qx2, _mm_madd_epi16(p, sx));
|
||||
qx3 = _mm_add_epi32(qx3, _mm_madd_epi16(px, sx));
|
||||
|
||||
|
||||
qx = _mm_add_epi16(qx, dx);
|
||||
}
|
||||
int CV_DECL_ALIGNED(16) buf[4];
|
||||
_mm_store_si128((__m128i*)buf, qx0);
|
||||
x0 = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
_mm_store_si128((__m128i*)buf, qx1);
|
||||
x1 = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
x1 = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
_mm_store_si128((__m128i*)buf, qx2);
|
||||
x2 = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
_mm_store_si128((__m128i*)buf, qx3);
|
||||
x3 = buf[0] + buf[1] + buf[2] + buf[3];
|
||||
}
|
||||
|
||||
|
||||
for( ; x < size.width; x++ )
|
||||
{
|
||||
WT p = ptr[x];
|
||||
WT xp = x * p, xxp;
|
||||
|
||||
|
||||
x0 += p;
|
||||
x1 += xp;
|
||||
xxp = xp * x;
|
||||
x2 += xxp;
|
||||
x3 += xxp * x;
|
||||
}
|
||||
|
||||
|
||||
WT py = y * x0, sy = y*y;
|
||||
|
||||
|
||||
mom[9] += ((MT)py) * sy; // m03
|
||||
mom[8] += ((MT)x1) * sy; // m12
|
||||
mom[7] += ((MT)x2) * y; // m21
|
||||
@ -311,8 +311,8 @@ template<> void momentsInTile<uchar, int, int>( const cv::Mat& img, double* mome
|
||||
mom[1] += x1; // m10
|
||||
mom[0] += x0; // m00
|
||||
}
|
||||
|
||||
for( x = 0; x < 10; x++ )
|
||||
|
||||
for(int x = 0; x < 10; x++ )
|
||||
moments[x] = (double)mom[x];
|
||||
}
|
||||
|
||||
@ -366,7 +366,7 @@ CV_IMPL void cvMoments( const void* array, CvMoments* moments, int binary )
|
||||
type = CV_MAT_TYPE( mat->type );
|
||||
depth = CV_MAT_DEPTH( type );
|
||||
cn = CV_MAT_CN( type );
|
||||
|
||||
|
||||
cv::Size size = cvGetMatSize( mat );
|
||||
|
||||
if( cn > 1 && coi == 0 )
|
||||
@ -387,14 +387,14 @@ CV_IMPL void cvMoments( const void* array, CvMoments* moments, int binary )
|
||||
func = momentsInTile<double, double, double>;
|
||||
else
|
||||
CV_Error( CV_StsUnsupportedFormat, "" );
|
||||
|
||||
|
||||
cv::Mat src0(mat);
|
||||
|
||||
for( int y = 0; y < size.height; y += TILE_SIZE )
|
||||
{
|
||||
cv::Size tileSize;
|
||||
tileSize.height = std::min(TILE_SIZE, size.height - y);
|
||||
|
||||
|
||||
for( int x = 0; x < size.width; x += TILE_SIZE )
|
||||
{
|
||||
tileSize.width = std::min(TILE_SIZE, size.width - x);
|
||||
@ -413,20 +413,20 @@ CV_IMPL void cvMoments( const void* array, CvMoments* moments, int binary )
|
||||
cv::compare( src, 0, tmp, CV_CMP_NE );
|
||||
src = tmp;
|
||||
}
|
||||
|
||||
|
||||
double mom[10];
|
||||
func( src, mom );
|
||||
|
||||
|
||||
if(binary)
|
||||
{
|
||||
double s = 1./255;
|
||||
for( int k = 0; k < 10; k++ )
|
||||
mom[k] *= s;
|
||||
}
|
||||
|
||||
|
||||
double xm = x * mom[0], ym = y * mom[0];
|
||||
|
||||
// accumulate moments computed in each tile
|
||||
// accumulate moments computed in each tile
|
||||
|
||||
// + m00 ( = m00' )
|
||||
moments->m00 += mom[0];
|
||||
@ -451,7 +451,7 @@ CV_IMPL void cvMoments( const void* array, CvMoments* moments, int binary )
|
||||
|
||||
// + m21 ( = m21' + x*(2*m11' + 2*y*m10' + x*m01' + x*y*m00') + y*m20')
|
||||
moments->m21 += mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3];
|
||||
|
||||
|
||||
// + m12 ( = m12' + y*(2*m11' + 2*x*m01' + y*m10' + x*y*m00') + x*m02')
|
||||
moments->m12 += mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5];
|
||||
|
||||
@ -601,9 +601,9 @@ Moments::operator CvMoments() const
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
cv::Moments cv::moments( InputArray _array, bool binaryImage )
|
||||
{
|
||||
CvMoments om;
|
||||
|
@ -49,7 +49,7 @@ cvArcLength( const void *array, CvSlice slice, int is_closed )
|
||||
int i, j = 0, count;
|
||||
const int N = 16;
|
||||
float buf[N];
|
||||
CvMat buffer = cvMat( 1, N, CV_32F, buf );
|
||||
CvMat buffer = cvMat( 1, N, CV_32F, buf );
|
||||
CvSeqReader reader;
|
||||
CvContour contour_header;
|
||||
CvSeq* contour = 0;
|
||||
@ -74,7 +74,7 @@ cvArcLength( const void *array, CvSlice slice, int is_closed )
|
||||
if( contour->total > 1 )
|
||||
{
|
||||
int is_float = CV_SEQ_ELTYPE( contour ) == CV_32FC2;
|
||||
|
||||
|
||||
cvStartReadSeq( contour, &reader, 0 );
|
||||
cvSetSeqReaderPos( &reader, slice.start_index );
|
||||
count = cvSliceLength( slice, contour );
|
||||
@ -110,7 +110,7 @@ cvArcLength( const void *array, CvSlice slice, int is_closed )
|
||||
CV_NEXT_SEQ_ELEM( contour->elem_size, reader );
|
||||
// Bugfix by Axel at rubico.com 2010-03-22, affects closed slices only
|
||||
// wraparound not handled by CV_NEXT_SEQ_ELEM
|
||||
if( is_closed && i == count - 2 )
|
||||
if( is_closed && i == count - 2 )
|
||||
cvSetSeqReaderPos( &reader, slice.start_index );
|
||||
|
||||
buffer.data.fl[j] = dx * dx + dy * dy;
|
||||
@ -287,7 +287,7 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
*_radius = 0;
|
||||
|
||||
CvSeqReader reader;
|
||||
int i, k, count;
|
||||
int k, count;
|
||||
CvPoint2D32f pts[8];
|
||||
CvContour contour_header;
|
||||
CvSeqBlock block;
|
||||
@ -324,7 +324,7 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
pt_left = pt_right = pt_top = pt_bottom = (CvPoint *)(reader.ptr);
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
|
||||
for( i = 1; i < count; i++ )
|
||||
for(int i = 1; i < count; i++ )
|
||||
{
|
||||
CvPoint* pt_ptr = (CvPoint*)reader.ptr;
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
@ -351,7 +351,7 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
pt_left = pt_right = pt_top = pt_bottom = (CvPoint2D32f *) (reader.ptr);
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
|
||||
for( i = 1; i < count; i++ )
|
||||
for(int i = 1; i < count; i++ )
|
||||
{
|
||||
CvPoint2D32f* pt_ptr = (CvPoint2D32f*)reader.ptr;
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
@ -375,14 +375,14 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
for( k = 0; k < max_iters; k++ )
|
||||
{
|
||||
double min_delta = 0, delta;
|
||||
CvPoint2D32f ptfl, farAway = { 0, 0};
|
||||
/*only for first iteration because the alg is repared at the loop's foot*/
|
||||
if(k==0)
|
||||
icvFindEnslosingCicle4pts_32f( pts, ¢er, &radius );
|
||||
CvPoint2D32f ptfl, farAway = { 0, 0};
|
||||
/*only for first iteration because the alg is repared at the loop's foot*/
|
||||
if(k==0)
|
||||
icvFindEnslosingCicle4pts_32f( pts, ¢er, &radius );
|
||||
|
||||
cvStartReadSeq( sequence, &reader, 0 );
|
||||
|
||||
for( i = 0; i < count; i++ )
|
||||
for(int i = 0; i < count; i++ )
|
||||
{
|
||||
if( !is_float )
|
||||
{
|
||||
@ -406,22 +406,22 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
if( result )
|
||||
break;
|
||||
|
||||
CvPoint2D32f ptsCopy[4];
|
||||
/* find good replacement partner for the point which is at most far away,
|
||||
starting with the one that lays in the actual circle (i=3) */
|
||||
for(int i = 3; i >=0; i-- )
|
||||
{
|
||||
for(int j = 0; j < 4; j++ )
|
||||
{
|
||||
ptsCopy[j]=(i != j)? pts[j]: farAway;
|
||||
}
|
||||
CvPoint2D32f ptsCopy[4];
|
||||
/* find good replacement partner for the point which is at most far away,
|
||||
starting with the one that lays in the actual circle (i=3) */
|
||||
for(int i = 3; i >=0; i-- )
|
||||
{
|
||||
for(int j = 0; j < 4; j++ )
|
||||
{
|
||||
ptsCopy[j]=(i != j)? pts[j]: farAway;
|
||||
}
|
||||
|
||||
icvFindEnslosingCicle4pts_32f(ptsCopy, ¢er, &radius );
|
||||
if( icvIsPtInCircle( pts[i], center, radius )>=0){ // replaced one again in the new circle?
|
||||
pts[i] = farAway;
|
||||
break;
|
||||
}
|
||||
}
|
||||
icvFindEnslosingCicle4pts_32f(ptsCopy, ¢er, &radius );
|
||||
if( icvIsPtInCircle( pts[i], center, radius )>=0){ // replaced one again in the new circle?
|
||||
pts[i] = farAway;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !result )
|
||||
@ -429,7 +429,7 @@ cvMinEnclosingCircle( const void* array, CvPoint2D32f * _center, float *_radius
|
||||
cvStartReadSeq( sequence, &reader, 0 );
|
||||
radius = 0.f;
|
||||
|
||||
for( i = 0; i < count; i++ )
|
||||
for(int i = 0; i < count; i++ )
|
||||
{
|
||||
CvPoint2D32f ptfl;
|
||||
float t, dx, dy;
|
||||
@ -486,7 +486,7 @@ icvContourArea( const CvSeq* contour, double *area )
|
||||
yi_1 = ((CvPoint2D32f*)(reader.ptr))->y;
|
||||
}
|
||||
CV_NEXT_SEQ_ELEM( contour->elem_size, reader );
|
||||
|
||||
|
||||
while( lpt-- > 0 )
|
||||
{
|
||||
double dxy, xi, yi;
|
||||
@ -520,7 +520,7 @@ icvContourArea( const CvSeq* contour, double *area )
|
||||
|
||||
/****************************************************************************************\
|
||||
|
||||
copy data from one buffer to other buffer
|
||||
copy data from one buffer to other buffer
|
||||
|
||||
\****************************************************************************************/
|
||||
|
||||
@ -797,9 +797,9 @@ cvFitEllipse2( const CvArr* array )
|
||||
n = ptseq->total;
|
||||
if( n < 5 )
|
||||
CV_Error( CV_StsBadSize, "Number of points should be >= 5" );
|
||||
|
||||
|
||||
/*
|
||||
* New fitellipse algorithm, contributed by Dr. Daniel Weiss
|
||||
* New fitellipse algorithm, contributed by Dr. Daniel Weiss
|
||||
*/
|
||||
CvPoint2D32f c = {0,0};
|
||||
double gfp[5], rp[5], t;
|
||||
@ -818,7 +818,7 @@ cvFitEllipse2( const CvArr* array )
|
||||
|
||||
cvStartReadSeq( ptseq, &reader );
|
||||
is_float = CV_SEQ_ELTYPE(ptseq) == CV_32FC2;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
CvPoint2D32f p;
|
||||
@ -857,7 +857,7 @@ cvFitEllipse2( const CvArr* array )
|
||||
Ad[i*5 + 3] = p.x;
|
||||
Ad[i*5 + 4] = p.y;
|
||||
}
|
||||
|
||||
|
||||
cvSolve( &A, &b, &x, CV_SVD );
|
||||
|
||||
// now use general-form parameters A - E to find the ellipse center:
|
||||
@ -1069,7 +1069,7 @@ cvBoundingRect( CvArr* array, int update )
|
||||
xmin = ymin = 0;
|
||||
}
|
||||
else if( ptseq->total )
|
||||
{
|
||||
{
|
||||
int is_float = CV_SEQ_ELTYPE(ptseq) == CV_32FC2;
|
||||
cvStartReadSeq( ptseq, &reader, 0 );
|
||||
|
||||
@ -1082,12 +1082,12 @@ cvBoundingRect( CvArr* array, int update )
|
||||
ymin = ymax = pt.y;
|
||||
|
||||
for( i = 1; i < ptseq->total; i++ )
|
||||
{
|
||||
{
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
|
||||
|
||||
if( xmin > pt.x )
|
||||
xmin = pt.x;
|
||||
|
||||
|
||||
if( xmax < pt.x )
|
||||
xmax = pt.x;
|
||||
|
||||
@ -1108,14 +1108,14 @@ cvBoundingRect( CvArr* array, int update )
|
||||
ymin = ymax = CV_TOGGLE_FLT(pt.y);
|
||||
|
||||
for( i = 1; i < ptseq->total; i++ )
|
||||
{
|
||||
{
|
||||
CV_READ_SEQ_ELEM( pt, reader );
|
||||
pt.x = CV_TOGGLE_FLT(pt.x);
|
||||
pt.y = CV_TOGGLE_FLT(pt.y);
|
||||
|
||||
|
||||
if( xmin > pt.x )
|
||||
xmin = pt.x;
|
||||
|
||||
|
||||
if( xmax < pt.x )
|
||||
xmax = pt.x;
|
||||
|
||||
@ -1144,7 +1144,7 @@ cvBoundingRect( CvArr* array, int update )
|
||||
|
||||
if( update )
|
||||
((CvContour*)ptseq)->rect = rect;
|
||||
|
||||
|
||||
return rect;
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ cv::Mat cv::getDefaultNewCameraMatrix( InputArray _cameraMatrix, Size imgsize,
|
||||
Mat cameraMatrix = _cameraMatrix.getMat();
|
||||
if( !centerPrincipalPoint && cameraMatrix.type() == CV_64F )
|
||||
return cameraMatrix;
|
||||
|
||||
|
||||
Mat newCameraMatrix;
|
||||
cameraMatrix.convertTo(newCameraMatrix, CV_64F);
|
||||
if( centerPrincipalPoint )
|
||||
@ -65,7 +65,7 @@ void cv::initUndistortRectifyMap( InputArray _cameraMatrix, InputArray _distCoef
|
||||
{
|
||||
Mat cameraMatrix = _cameraMatrix.getMat(), distCoeffs = _distCoeffs.getMat();
|
||||
Mat matR = _matR.getMat(), newCameraMatrix = _newCameraMatrix.getMat();
|
||||
|
||||
|
||||
if( m1type <= 0 )
|
||||
m1type = CV_16SC2;
|
||||
CV_Assert( m1type == CV_16SC2 || m1type == CV_32FC1 || m1type == CV_32FC2 );
|
||||
@ -106,7 +106,7 @@ void cv::initUndistortRectifyMap( InputArray _cameraMatrix, InputArray _distCoef
|
||||
double u0 = A(0, 2), v0 = A(1, 2);
|
||||
double fx = A(0, 0), fy = A(1, 1);
|
||||
|
||||
CV_Assert( distCoeffs.size() == Size(1, 4) || distCoeffs.size() == Size(4, 1) ||
|
||||
CV_Assert( distCoeffs.size() == Size(1, 4) || distCoeffs.size() == Size(4, 1) ||
|
||||
distCoeffs.size() == Size(1, 5) || distCoeffs.size() == Size(5, 1) ||
|
||||
distCoeffs.size() == Size(1, 8) || distCoeffs.size() == Size(8, 1));
|
||||
|
||||
@ -166,10 +166,10 @@ void cv::undistort( InputArray _src, OutputArray _dst, InputArray _cameraMatrix,
|
||||
{
|
||||
Mat src = _src.getMat(), cameraMatrix = _cameraMatrix.getMat();
|
||||
Mat distCoeffs = _distCoeffs.getMat(), newCameraMatrix = _newCameraMatrix.getMat();
|
||||
|
||||
|
||||
_dst.create( src.size(), src.type() );
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
CV_Assert( dst.data != src.data );
|
||||
|
||||
int stripe_size0 = std::min(std::max(1, (1 << 12) / std::max(src.cols, 1)), src.rows);
|
||||
@ -289,11 +289,11 @@ void cvUndistortPoints( const CvMat* _src, CvMat* _dst, const CvMat* _cameraMatr
|
||||
(_distCoeffs->rows == 1 || _distCoeffs->cols == 1) &&
|
||||
(_distCoeffs->rows*_distCoeffs->cols == 4 ||
|
||||
_distCoeffs->rows*_distCoeffs->cols == 5 ||
|
||||
_distCoeffs->rows*_distCoeffs->cols == 8));
|
||||
_distCoeffs->rows*_distCoeffs->cols == 8));
|
||||
|
||||
_Dk = cvMat( _distCoeffs->rows, _distCoeffs->cols,
|
||||
CV_MAKETYPE(CV_64F,CV_MAT_CN(_distCoeffs->type)), k);
|
||||
|
||||
|
||||
cvConvert( _distCoeffs, &_Dk );
|
||||
iters = 5;
|
||||
}
|
||||
@ -389,13 +389,13 @@ void cv::undistortPoints( InputArray _src, OutputArray _dst,
|
||||
{
|
||||
Mat src = _src.getMat(), cameraMatrix = _cameraMatrix.getMat();
|
||||
Mat distCoeffs = _distCoeffs.getMat(), R = _Rmat.getMat(), P = _Pmat.getMat();
|
||||
|
||||
|
||||
CV_Assert( src.isContinuous() && (src.depth() == CV_32F || src.depth() == CV_64F) &&
|
||||
((src.rows == 1 && src.channels() == 2) || src.cols*src.channels() == 2));
|
||||
|
||||
|
||||
_dst.create(src.size(), src.type(), -1, true);
|
||||
Mat dst = _dst.getMat();
|
||||
|
||||
|
||||
CvMat _csrc = src, _cdst = dst, _ccameraMatrix = cameraMatrix;
|
||||
CvMat matR, matP, _cdistCoeffs, *pR=0, *pP=0, *pD=0;
|
||||
if( R.data )
|
||||
@ -416,11 +416,11 @@ static Point2f mapPointSpherical(const Point2f& p, float alpha, Vec4d* J, int pr
|
||||
double beta = 1 + 2*alpha;
|
||||
double v = x*x + y*y + 1, iv = 1/v;
|
||||
double u = sqrt(beta*v + alpha*alpha);
|
||||
|
||||
|
||||
double k = (u - alpha)*iv;
|
||||
double kv = (v*beta/u - (u - alpha)*2)*iv*iv;
|
||||
double kx = kv*x, ky = kv*y;
|
||||
|
||||
|
||||
if( projType == PROJ_SPHERICAL_ORTHO )
|
||||
{
|
||||
if(J)
|
||||
@ -433,7 +433,7 @@ static Point2f mapPointSpherical(const Point2f& p, float alpha, Vec4d* J, int pr
|
||||
double iR = 1/(alpha + 1);
|
||||
double x1 = std::max(std::min(x*k*iR, 1.), -1.);
|
||||
double y1 = std::max(std::min(y*k*iR, 1.), -1.);
|
||||
|
||||
|
||||
if(J)
|
||||
{
|
||||
double fx1 = iR/sqrt(1 - x1*x1);
|
||||
@ -446,35 +446,35 @@ static Point2f mapPointSpherical(const Point2f& p, float alpha, Vec4d* J, int pr
|
||||
return Point2f();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static Point2f invMapPointSpherical(Point2f _p, float alpha, int projType)
|
||||
{
|
||||
static int avgiter = 0, avgn = 0;
|
||||
|
||||
|
||||
double eps = 1e-12;
|
||||
Vec2d p(_p.x, _p.y), q(_p.x, _p.y), err;
|
||||
Vec4d J;
|
||||
int i, maxiter = 5;
|
||||
|
||||
|
||||
for( i = 0; i < maxiter; i++ )
|
||||
{
|
||||
Point2f p1 = mapPointSpherical(Point2f((float)q[0], (float)q[1]), alpha, &J, projType);
|
||||
err = Vec2d(p1.x, p1.y) - p;
|
||||
if( err[0]*err[0] + err[1]*err[1] < eps )
|
||||
break;
|
||||
|
||||
|
||||
Vec4d JtJ(J[0]*J[0] + J[2]*J[2], J[0]*J[1] + J[2]*J[3],
|
||||
J[0]*J[1] + J[2]*J[3], J[1]*J[1] + J[3]*J[3]);
|
||||
double d = JtJ[0]*JtJ[3] - JtJ[1]*JtJ[2];
|
||||
d = d ? 1./d : 0;
|
||||
Vec4d iJtJ(JtJ[3]*d, -JtJ[1]*d, -JtJ[2]*d, JtJ[0]*d);
|
||||
Vec2d JtErr(J[0]*err[0] + J[2]*err[1], J[1]*err[0] + J[3]*err[1]);
|
||||
|
||||
|
||||
q -= Vec2d(iJtJ[0]*JtErr[0] + iJtJ[1]*JtErr[1], iJtJ[2]*JtErr[0] + iJtJ[3]*JtErr[1]);
|
||||
//Matx22d J(kx*x + k, kx*y, ky*x, ky*y + k);
|
||||
//q -= Vec2d((J.t()*J).inv()*(J.t()*err));
|
||||
}
|
||||
|
||||
|
||||
if( i < maxiter )
|
||||
{
|
||||
avgiter += i;
|
||||
@ -482,12 +482,12 @@ static Point2f invMapPointSpherical(Point2f _p, float alpha, int projType)
|
||||
if( avgn == 1500 )
|
||||
printf("avg iters = %g\n", (double)avgiter/avgn);
|
||||
}
|
||||
|
||||
|
||||
return i < maxiter ? Point2f((float)q[0], (float)q[1]) : Point2f(-FLT_MAX, -FLT_MAX);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
float cv::initWideAngleProjMap( InputArray _cameraMatrix0, InputArray _distCoeffs0,
|
||||
Size imageSize, int destImageWidth, int m1type,
|
||||
OutputArray _map1, OutputArray _map2, int projType, double _alpha )
|
||||
@ -500,40 +500,40 @@ float cv::initWideAngleProjMap( InputArray _cameraMatrix0, InputArray _distCoeff
|
||||
Point2f dcenter((destImageWidth-1)*0.5f, 0.f);
|
||||
float xmin = FLT_MAX, xmax = -FLT_MAX, ymin = FLT_MAX, ymax = -FLT_MAX;
|
||||
int N = 9;
|
||||
std::vector<Point2f> u(1), v(1);
|
||||
Mat _u(u), I = Mat::eye(3,3,CV_64F);
|
||||
std::vector<Point2f> uvec(1), vvec(1);
|
||||
Mat I = Mat::eye(3,3,CV_64F);
|
||||
float alpha = (float)_alpha;
|
||||
|
||||
|
||||
int ndcoeffs = distCoeffs0.cols*distCoeffs0.rows*distCoeffs0.channels();
|
||||
CV_Assert((distCoeffs0.cols == 1 || distCoeffs0.rows == 1) &&
|
||||
(ndcoeffs == 4 || ndcoeffs == 5 || ndcoeffs == 8));
|
||||
CV_Assert(cameraMatrix0.size() == Size(3,3));
|
||||
distCoeffs0.convertTo(distCoeffs,CV_64F);
|
||||
cameraMatrix0.convertTo(cameraMatrix,CV_64F);
|
||||
|
||||
|
||||
alpha = std::min(alpha, 0.999f);
|
||||
|
||||
|
||||
for( int i = 0; i < N; i++ )
|
||||
for( int j = 0; j < N; j++ )
|
||||
{
|
||||
Point2f p((float)j*imageSize.width/(N-1), (float)i*imageSize.height/(N-1));
|
||||
u[0] = p;
|
||||
undistortPoints(_u, v, cameraMatrix, distCoeffs, I, I);
|
||||
Point2f q = mapPointSpherical(v[0], alpha, 0, projType);
|
||||
uvec[0] = p;
|
||||
undistortPoints(uvec, vvec, cameraMatrix, distCoeffs, I, I);
|
||||
Point2f q = mapPointSpherical(vvec[0], alpha, 0, projType);
|
||||
if( xmin > q.x ) xmin = q.x;
|
||||
if( xmax < q.x ) xmax = q.x;
|
||||
if( ymin > q.y ) ymin = q.y;
|
||||
if( ymax < q.y ) ymax = q.y;
|
||||
}
|
||||
|
||||
|
||||
float scale = (float)std::min(dcenter.x/fabs(xmax), dcenter.x/fabs(xmin));
|
||||
Size dsize(destImageWidth, cvCeil(std::max(scale*fabs(ymin)*2, scale*fabs(ymax)*2)));
|
||||
dcenter.y = (dsize.height - 1)*0.5f;
|
||||
|
||||
|
||||
Mat mapxy(dsize, CV_32FC2);
|
||||
double k1 = k[0], k2 = k[1], k3 = k[2], p1 = k[3], p2 = k[4], k4 = k[5], k5 = k[6], k6 = k[7];
|
||||
double fx = cameraMatrix.at<double>(0,0), fy = cameraMatrix.at<double>(1,1), cx = scenter.x, cy = scenter.y;
|
||||
|
||||
|
||||
for( int y = 0; y < dsize.height; y++ )
|
||||
{
|
||||
Point2f* mxy = mapxy.ptr<Point2f>(y);
|
||||
@ -551,11 +551,11 @@ float cv::initWideAngleProjMap( InputArray _cameraMatrix0, InputArray _distCoeff
|
||||
double kr = 1 + ((k3*r2 + k2)*r2 + k1)*r2/(1 + ((k6*r2 + k5)*r2 + k4)*r2);
|
||||
double u = fx*(q.x*kr + p1*_2xy + p2*(r2 + 2*x2)) + cx;
|
||||
double v = fy*(q.y*kr + p1*(r2 + 2*y2) + p2*_2xy) + cy;
|
||||
|
||||
|
||||
mxy[x] = Point2f((float)u, (float)v);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(m1type == CV_32FC2)
|
||||
{
|
||||
_map1.create(mapxy.size(), mapxy.type());
|
||||
@ -565,7 +565,7 @@ float cv::initWideAngleProjMap( InputArray _cameraMatrix0, InputArray _distCoeff
|
||||
}
|
||||
else
|
||||
convertMaps(mapxy, Mat(), _map1, _map2, m1type, false);
|
||||
|
||||
|
||||
return scale;
|
||||
}
|
||||
|
||||
|
@ -266,7 +266,7 @@ void CV_FindContourTest::run_func()
|
||||
// the whole testing is done here, run_func() is not utilized in this test
|
||||
int CV_FindContourTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
int i, code = cvtest::TS::OK;
|
||||
int code = cvtest::TS::OK;
|
||||
|
||||
cvCmpS( img[0], 0, img[0], CV_CMP_GT );
|
||||
|
||||
@ -284,7 +284,7 @@ int CV_FindContourTest::validate_test_results( int /*test_case_idx*/ )
|
||||
Mat _img[4];
|
||||
for( int i = 0; i < 4; i++ )
|
||||
_img[i] = cvarrToMat(img[i]);
|
||||
|
||||
|
||||
code = cvtest::cmpEps2(ts, _img[0], _img[3], 0, true, "Comparing original image with the map of filled contours" );
|
||||
|
||||
if( code < 0 )
|
||||
@ -303,7 +303,7 @@ int CV_FindContourTest::validate_test_results( int /*test_case_idx*/ )
|
||||
CvTreeNodeIterator iterator2;
|
||||
int count3;
|
||||
|
||||
for( i = 0; i < 2; i++ )
|
||||
for(int i = 0; i < 2; i++ )
|
||||
{
|
||||
CvTreeNodeIterator iterator;
|
||||
cvInitTreeNodeIterator( &iterator, i == 0 ? contours : contours2, INT_MAX );
|
||||
@ -353,7 +353,7 @@ int CV_FindContourTest::validate_test_results( int /*test_case_idx*/ )
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
for( i = 0; i < seq1->total; i++ )
|
||||
for(int i = 0; i < seq1->total; i++ )
|
||||
{
|
||||
CvPoint pt1;
|
||||
CvPoint pt2;
|
||||
|
@ -193,7 +193,7 @@ protected:
|
||||
void* result;
|
||||
double low_high_range;
|
||||
CvScalar low, high;
|
||||
|
||||
|
||||
bool test_cpp;
|
||||
};
|
||||
|
||||
@ -254,7 +254,7 @@ int CV_BaseShapeDescrTest::read_params( CvFileStorage* fs )
|
||||
}
|
||||
|
||||
|
||||
void CV_BaseShapeDescrTest::generate_point_set( void* points )
|
||||
void CV_BaseShapeDescrTest::generate_point_set( void* pointsSet )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
int i, k, n, total, point_type;
|
||||
@ -269,16 +269,16 @@ void CV_BaseShapeDescrTest::generate_point_set( void* points )
|
||||
}
|
||||
memset( &reader, 0, sizeof(reader) );
|
||||
|
||||
if( CV_IS_SEQ(points) )
|
||||
if( CV_IS_SEQ(pointsSet) )
|
||||
{
|
||||
CvSeq* ptseq = (CvSeq*)points;
|
||||
CvSeq* ptseq = (CvSeq*)pointsSet;
|
||||
total = ptseq->total;
|
||||
point_type = CV_SEQ_ELTYPE(ptseq);
|
||||
cvStartReadSeq( ptseq, &reader );
|
||||
}
|
||||
else
|
||||
{
|
||||
CvMat* ptm = (CvMat*)points;
|
||||
CvMat* ptm = (CvMat*)pointsSet;
|
||||
assert( CV_IS_MAT(ptm) && CV_IS_MAT_CONT(ptm->type) );
|
||||
total = ptm->rows + ptm->cols - 1;
|
||||
point_type = CV_MAT_TYPE(ptm->type);
|
||||
@ -362,7 +362,7 @@ int CV_BaseShapeDescrTest::prepare_test_case( int test_case_idx )
|
||||
}
|
||||
|
||||
generate_point_set( points );
|
||||
|
||||
|
||||
test_cpp = (cvtest::randInt(rng) & 16) == 0;
|
||||
return 1;
|
||||
}
|
||||
@ -614,16 +614,16 @@ int CV_ConvHullTest::validate_test_results( int test_case_idx )
|
||||
for( i = 0; i < point_count; i++ )
|
||||
{
|
||||
int idx = 0, on_edge = 0;
|
||||
double result = cvTsPointPolygonTest( p[i], h, hull_count, &idx, &on_edge );
|
||||
double pptresult = cvTsPointPolygonTest( p[i], h, hull_count, &idx, &on_edge );
|
||||
|
||||
if( result < 0 )
|
||||
if( pptresult < 0 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "The point #%d is outside of the convex hull\n", i );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
if( result < FLT_EPSILON && !on_edge )
|
||||
if( pptresult < FLT_EPSILON && !on_edge )
|
||||
mask->data.ptr[idx] = (uchar)1;
|
||||
}
|
||||
|
||||
@ -735,15 +735,15 @@ int CV_MinAreaRectTest::validate_test_results( int test_case_idx )
|
||||
for( i = 0; i < point_count; i++ )
|
||||
{
|
||||
int idx = 0, on_edge = 0;
|
||||
double result = cvTsPointPolygonTest( p[i], box_pt, 4, &idx, &on_edge );
|
||||
if( result < -eps )
|
||||
double pptresult = cvTsPointPolygonTest( p[i], box_pt, 4, &idx, &on_edge );
|
||||
if( pptresult < -eps )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "The point #%d is outside of the box\n", i );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
goto _exit_;
|
||||
}
|
||||
|
||||
if( result < eps )
|
||||
if( pptresult < eps )
|
||||
{
|
||||
for( j = 0; j < 4; j++ )
|
||||
{
|
||||
@ -997,7 +997,7 @@ CV_FitEllipseTest::CV_FitEllipseTest()
|
||||
}
|
||||
|
||||
|
||||
void CV_FitEllipseTest::generate_point_set( void* points )
|
||||
void CV_FitEllipseTest::generate_point_set( void* pointsSet )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
int i, total, point_type;
|
||||
@ -1020,16 +1020,16 @@ void CV_FitEllipseTest::generate_point_set( void* points )
|
||||
}
|
||||
memset( &reader, 0, sizeof(reader) );
|
||||
|
||||
if( CV_IS_SEQ(points) )
|
||||
if( CV_IS_SEQ(pointsSet) )
|
||||
{
|
||||
CvSeq* ptseq = (CvSeq*)points;
|
||||
CvSeq* ptseq = (CvSeq*)pointsSet;
|
||||
total = ptseq->total;
|
||||
point_type = CV_SEQ_ELTYPE(ptseq);
|
||||
cvStartReadSeq( ptseq, &reader );
|
||||
}
|
||||
else
|
||||
{
|
||||
CvMat* ptm = (CvMat*)points;
|
||||
CvMat* ptm = (CvMat*)pointsSet;
|
||||
assert( CV_IS_MAT(ptm) && CV_IS_MAT_CONT(ptm->type) );
|
||||
total = ptm->rows + ptm->cols - 1;
|
||||
point_type = CV_MAT_TYPE(ptm->type);
|
||||
@ -1171,7 +1171,7 @@ class CV_FitEllipseSmallTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_FitEllipseSmallTest() {}
|
||||
~CV_FitEllipseSmallTest() {}
|
||||
~CV_FitEllipseSmallTest() {}
|
||||
protected:
|
||||
void run(int)
|
||||
{
|
||||
@ -1188,7 +1188,7 @@ protected:
|
||||
c[0].push_back(Point(8, 6)*scale+ofs);
|
||||
c[0].push_back(Point(8, 2)*scale+ofs);
|
||||
c[0].push_back(Point(6, 0)*scale+ofs);
|
||||
|
||||
|
||||
RotatedRect e = fitEllipse(c[0]);
|
||||
CV_Assert( fabs(e.center.x - 4) <= 1. &&
|
||||
fabs(e.center.y - 4) <= 1. &&
|
||||
@ -1226,7 +1226,7 @@ CV_FitLineTest::CV_FitLineTest()
|
||||
}
|
||||
|
||||
|
||||
void CV_FitLineTest::generate_point_set( void* points )
|
||||
void CV_FitLineTest::generate_point_set( void* pointsSet )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
int i, k, n, total, point_type;
|
||||
@ -1250,16 +1250,16 @@ void CV_FitLineTest::generate_point_set( void* points )
|
||||
|
||||
memset( &reader, 0, sizeof(reader) );
|
||||
|
||||
if( CV_IS_SEQ(points) )
|
||||
if( CV_IS_SEQ(pointsSet) )
|
||||
{
|
||||
CvSeq* ptseq = (CvSeq*)points;
|
||||
CvSeq* ptseq = (CvSeq*)pointsSet;
|
||||
total = ptseq->total;
|
||||
point_type = CV_MAT_DEPTH(CV_SEQ_ELTYPE(ptseq));
|
||||
cvStartReadSeq( ptseq, &reader );
|
||||
}
|
||||
else
|
||||
{
|
||||
CvMat* ptm = (CvMat*)points;
|
||||
CvMat* ptm = (CvMat*)pointsSet;
|
||||
assert( CV_IS_MAT(ptm) && CV_IS_MAT_CONT(ptm->type) );
|
||||
total = ptm->rows + ptm->cols - 1;
|
||||
point_type = CV_MAT_DEPTH(CV_MAT_TYPE(ptm->type));
|
||||
@ -1498,7 +1498,7 @@ CV_ContourMomentsTest::CV_ContourMomentsTest()
|
||||
}
|
||||
|
||||
|
||||
void CV_ContourMomentsTest::generate_point_set( void* points )
|
||||
void CV_ContourMomentsTest::generate_point_set( void* pointsSet )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
float max_sz;
|
||||
@ -1518,7 +1518,7 @@ void CV_ContourMomentsTest::generate_point_set( void* points )
|
||||
max_r_scale = cvtest::randReal(rng)*max_max_r_scale*0.01;
|
||||
angle = cvtest::randReal(rng)*360;
|
||||
|
||||
cvTsGenerateTousledBlob( center, axes, max_r_scale, angle, points, rng );
|
||||
cvTsGenerateTousledBlob( center, axes, max_r_scale, angle, pointsSet, rng );
|
||||
|
||||
if( points1 )
|
||||
points1->flags = CV_SEQ_MAGIC_VAL + CV_SEQ_POLYGON;
|
||||
@ -1614,8 +1614,8 @@ class CV_PerimeterAreaSliceTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_PerimeterAreaSliceTest();
|
||||
~CV_PerimeterAreaSliceTest();
|
||||
protected:
|
||||
~CV_PerimeterAreaSliceTest();
|
||||
protected:
|
||||
void run(int);
|
||||
};
|
||||
|
||||
@ -1629,7 +1629,7 @@ void CV_PerimeterAreaSliceTest::run( int )
|
||||
Ptr<CvMemStorage> storage = cvCreateMemStorage();
|
||||
RNG& rng = theRNG();
|
||||
const double min_r = 90, max_r = 120;
|
||||
|
||||
|
||||
for( int i = 0; i < 100; i++ )
|
||||
{
|
||||
ts->update_context( this, i, true );
|
||||
@ -1640,7 +1640,7 @@ void CV_PerimeterAreaSliceTest::run( int )
|
||||
CvPoint center;
|
||||
center.x = rng.uniform(cvCeil(max_r), cvFloor(640-max_r));
|
||||
center.y = rng.uniform(cvCeil(max_r), cvFloor(480-max_r));
|
||||
|
||||
|
||||
for( int j = 0; j < n; j++ )
|
||||
{
|
||||
CvPoint pt;
|
||||
@ -1650,7 +1650,7 @@ void CV_PerimeterAreaSliceTest::run( int )
|
||||
pt.y = cvRound(center.y - r*sin(phi));
|
||||
cvSeqPush(contour, &pt);
|
||||
}
|
||||
|
||||
|
||||
CvSlice slice;
|
||||
for(;;)
|
||||
{
|
||||
@ -1664,14 +1664,14 @@ void CV_PerimeterAreaSliceTest::run( int )
|
||||
/*printf( "%d. (%d, %d) of %d, length = %d, length1 = %d\n",
|
||||
i, slice.start_index, slice.end_index,
|
||||
contour->total, cvSliceLength(slice, contour), cslice->total );
|
||||
|
||||
|
||||
double area0 = cvContourArea(cslice);
|
||||
double area1 = cvContourArea(contour, slice);
|
||||
double area1 = cvContourArea(contour, slice);
|
||||
if( area0 != area1 )
|
||||
{
|
||||
ts->printf(cvtest::TS::LOG,
|
||||
"The contour area slice is computed differently (%g vs %g)\n", area0, area1 );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}*/
|
||||
|
||||
@ -1681,7 +1681,7 @@ void CV_PerimeterAreaSliceTest::run( int )
|
||||
{
|
||||
ts->printf(cvtest::TS::LOG,
|
||||
"The contour arc length is computed differently (%g vs %g)\n", len0, len1 );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -253,46 +253,46 @@ void CV_MorphologyBaseTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
Mat _ielement(element->nRows, element->nCols, CV_32S, element->values);
|
||||
Mat _element;
|
||||
_ielement.convertTo(_element, CV_8U);
|
||||
Point anchor(element->anchorX, element->anchorY);
|
||||
int border = BORDER_REPLICATE;
|
||||
Point _anchor(element->anchorX, element->anchorY);
|
||||
int _border = BORDER_REPLICATE;
|
||||
|
||||
if( optype == CV_MOP_ERODE )
|
||||
{
|
||||
cvtest::erode( src, dst, _element, anchor, border );
|
||||
cvtest::erode( src, dst, _element, _anchor, _border );
|
||||
}
|
||||
else if( optype == CV_MOP_DILATE )
|
||||
{
|
||||
cvtest::dilate( src, dst, _element, anchor, border );
|
||||
cvtest::dilate( src, dst, _element, _anchor, _border );
|
||||
}
|
||||
else
|
||||
{
|
||||
Mat temp;
|
||||
if( optype == CV_MOP_OPEN )
|
||||
{
|
||||
cvtest::erode( src, temp, _element, anchor, border );
|
||||
cvtest::dilate( temp, dst, _element, anchor, border );
|
||||
cvtest::erode( src, temp, _element, _anchor, _border );
|
||||
cvtest::dilate( temp, dst, _element, _anchor, _border );
|
||||
}
|
||||
else if( optype == CV_MOP_CLOSE )
|
||||
{
|
||||
cvtest::dilate( src, temp, _element, anchor, border );
|
||||
cvtest::erode( temp, dst, _element, anchor, border );
|
||||
cvtest::dilate( src, temp, _element, _anchor, _border );
|
||||
cvtest::erode( temp, dst, _element, _anchor, _border );
|
||||
}
|
||||
else if( optype == CV_MOP_GRADIENT )
|
||||
{
|
||||
cvtest::erode( src, temp, _element, anchor, border );
|
||||
cvtest::dilate( src, dst, _element, anchor, border );
|
||||
cvtest::erode( src, temp, _element, _anchor, _border );
|
||||
cvtest::dilate( src, dst, _element, _anchor, _border );
|
||||
cvtest::add( dst, 1, temp, -1, Scalar::all(0), dst, dst.type() );
|
||||
}
|
||||
else if( optype == CV_MOP_TOPHAT )
|
||||
{
|
||||
cvtest::erode( src, temp, _element, anchor, border );
|
||||
cvtest::dilate( temp, dst, _element, anchor, border );
|
||||
cvtest::erode( src, temp, _element, _anchor, _border );
|
||||
cvtest::dilate( temp, dst, _element, _anchor, _border );
|
||||
cvtest::add( src, 1, dst, -1, Scalar::all(0), dst, dst.type() );
|
||||
}
|
||||
else if( optype == CV_MOP_BLACKHAT )
|
||||
{
|
||||
cvtest::dilate( src, temp, _element, anchor, border );
|
||||
cvtest::erode( temp, dst, _element, anchor, border );
|
||||
cvtest::dilate( src, temp, _element, _anchor, _border );
|
||||
cvtest::erode( temp, dst, _element, _anchor, _border );
|
||||
cvtest::add( dst, 1, src, -1, Scalar::all(0), dst, dst.type() );
|
||||
}
|
||||
else
|
||||
|
@ -56,7 +56,7 @@ protected:
|
||||
void prepare_to_validation( int );
|
||||
|
||||
void fill_array( int test_case_idx, int i, int j, Mat& arr );
|
||||
|
||||
|
||||
/*int write_default_params(CvFileStorage* fs);
|
||||
void get_timing_test_array_types_and_sizes( int test_case_idx, vector<vector<Size> >& sizes, vector<vector<int> >& types
|
||||
CvSize** whole_sizes, bool *are_images );
|
||||
@ -94,7 +94,7 @@ void CV_FloodFillTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
RNG& rng = ts->get_rng();
|
||||
int depth, cn;
|
||||
int i;
|
||||
double buf[8];
|
||||
double buff[8];
|
||||
cvtest::ArrayTest::get_test_array_types_and_sizes( test_case_idx, sizes, types );
|
||||
|
||||
depth = cvtest::randInt(rng) % 3;
|
||||
@ -111,7 +111,7 @@ void CV_FloodFillTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
types[INPUT_OUTPUT][1] = types[REF_INPUT_OUTPUT][1] = CV_8UC1;
|
||||
types[OUTPUT][0] = types[REF_OUTPUT][0] = CV_64FC1;
|
||||
sizes[OUTPUT][0] = sizes[REF_OUTPUT][0] = cvSize(9,1);
|
||||
|
||||
|
||||
if( !use_mask )
|
||||
sizes[INPUT_OUTPUT][1] = sizes[REF_INPUT_OUTPUT][1] = cvSize(0,0);
|
||||
else
|
||||
@ -119,7 +119,7 @@ void CV_FloodFillTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
CvSize sz = sizes[INPUT_OUTPUT][0];
|
||||
sizes[INPUT_OUTPUT][1] = sizes[REF_INPUT_OUTPUT][1] = cvSize(sz.width+2,sz.height+2);
|
||||
}
|
||||
|
||||
|
||||
seed_pt.x = cvtest::randInt(rng) % sizes[INPUT_OUTPUT][0].width;
|
||||
seed_pt.y = cvtest::randInt(rng) % sizes[INPUT_OUTPUT][0].height;
|
||||
|
||||
@ -127,7 +127,7 @@ void CV_FloodFillTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
l_diff = u_diff = Scalar::all(0.);
|
||||
else
|
||||
{
|
||||
Mat m( 1, 8, CV_16S, buf );
|
||||
Mat m( 1, 8, CV_16S, buff );
|
||||
rng.fill( m, RNG::NORMAL, Scalar::all(0), Scalar::all(32) );
|
||||
for( i = 0; i < 4; i++ )
|
||||
{
|
||||
@ -139,7 +139,7 @@ void CV_FloodFillTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
new_val = Scalar::all(0.);
|
||||
for( i = 0; i < cn; i++ )
|
||||
new_val.val[i] = cvtest::randReal(rng)*255;
|
||||
|
||||
|
||||
test_cpp = (cvtest::randInt(rng) & 256) == 0;
|
||||
}
|
||||
|
||||
@ -153,13 +153,13 @@ double CV_FloodFillTest::get_success_error_level( int /*test_case_idx*/, int i,
|
||||
void CV_FloodFillTest::fill_array( int test_case_idx, int i, int j, Mat& arr )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
|
||||
if( i != INPUT && i != INPUT_OUTPUT )
|
||||
{
|
||||
cvtest::ArrayTest::fill_array( test_case_idx, i, j, arr );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if( j == 0 )
|
||||
{
|
||||
Mat tmp = arr;
|
||||
@ -191,7 +191,7 @@ void CV_FloodFillTest::run_func()
|
||||
int flags = connectivity + (mask_only ? CV_FLOODFILL_MASK_ONLY : 0) +
|
||||
(range_type == 1 ? CV_FLOODFILL_FIXED_RANGE : 0) + (new_mask_val << 8);
|
||||
double* odata = test_mat[OUTPUT][0].ptr<double>();
|
||||
|
||||
|
||||
if(!test_cpp)
|
||||
{
|
||||
CvConnectedComp comp;
|
||||
@ -255,7 +255,7 @@ cvTsFloodFill( CvMat* _img, CvPoint seed_pt, CvScalar new_val,
|
||||
int cols = _img->cols, rows = _img->rows;
|
||||
int u0 = 0, u1 = 0, u2 = 0;
|
||||
double s0 = 0, s1 = 0, s2 = 0;
|
||||
|
||||
|
||||
if( CV_MAT_DEPTH(_img->type) == CV_8U || CV_MAT_DEPTH(_img->type) == CV_32S )
|
||||
{
|
||||
tmp = cvCreateMat( rows, cols, CV_MAKETYPE(CV_32F,CV_MAT_CN(_img->type)) );
|
||||
@ -395,7 +395,7 @@ cvTsFloodFill( CvMat* _img, CvPoint seed_pt, CvScalar new_val,
|
||||
cvSeqPush( seq, &p );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
r.x = r.width = seed_pt.x;
|
||||
|
@ -59,7 +59,7 @@ protected:
|
||||
int prepare_test_case( int test_case_idx );
|
||||
int validate_test_results( int test_case_idx );
|
||||
virtual void init_hist( int test_case_idx, int i );
|
||||
|
||||
|
||||
virtual void get_hist_params( int test_case_idx );
|
||||
virtual float** get_hist_ranges( int test_case_idx );
|
||||
|
||||
@ -73,7 +73,7 @@ protected:
|
||||
int uniform;
|
||||
int gen_random_hist;
|
||||
double gen_hist_max_val, gen_hist_sparse_nz_ratio;
|
||||
|
||||
|
||||
int init_ranges;
|
||||
int img_type;
|
||||
int img_max_log_size;
|
||||
@ -127,7 +127,7 @@ int CV_BaseHistTest::read_params( CvFileStorage* fs )
|
||||
max_log_size = cvtest::clipInt( max_log_size, 1, 20 );
|
||||
img_max_log_size = cvReadInt( find_param( fs, "max_log_array_size" ), img_max_log_size );
|
||||
img_max_log_size = cvtest::clipInt( img_max_log_size, 1, 9 );
|
||||
|
||||
|
||||
max_cdims = cvReadInt( find_param( fs, "max_cdims" ), max_cdims );
|
||||
max_cdims = cvtest::clipInt( max_cdims, 1, 6 );
|
||||
|
||||
@ -146,13 +146,13 @@ void CV_BaseHistTest::get_hist_params( int /*test_case_idx*/ )
|
||||
max_dim_size = cvRound(pow(hist_size,1./cdims));
|
||||
total_size = 1;
|
||||
uniform = cvtest::randInt(rng) % 2;
|
||||
hist_type = cvtest::randInt(rng) % 2 ? CV_HIST_SPARSE : CV_HIST_ARRAY;
|
||||
|
||||
hist_type = cvtest::randInt(rng) % 2 ? CV_HIST_SPARSE : CV_HIST_ARRAY;
|
||||
|
||||
for( i = 0; i < cdims; i++ )
|
||||
{
|
||||
dims[i] = cvtest::randInt(rng) % (max_dim_size + 2) + 2;
|
||||
if( !uniform )
|
||||
dims[i] = MIN(dims[i], max_ni_dim_size);
|
||||
dims[i] = MIN(dims[i], max_ni_dim_size);
|
||||
total_size *= dims[i];
|
||||
}
|
||||
|
||||
@ -178,12 +178,12 @@ void CV_BaseHistTest::get_hist_params( int /*test_case_idx*/ )
|
||||
float** CV_BaseHistTest::get_hist_ranges( int /*test_case_idx*/ )
|
||||
{
|
||||
double _low = low + range_delta, _high = high - range_delta;
|
||||
|
||||
|
||||
if( !init_ranges )
|
||||
return 0;
|
||||
|
||||
|
||||
ranges.resize(cdims);
|
||||
|
||||
|
||||
if( uniform )
|
||||
{
|
||||
_ranges.resize(cdims*2);
|
||||
@ -200,7 +200,7 @@ float** CV_BaseHistTest::get_hist_ranges( int /*test_case_idx*/ )
|
||||
for( i = 0; i < cdims; i++ )
|
||||
dims_sum += dims[i] + 1;
|
||||
_ranges.resize(dims_sum);
|
||||
|
||||
|
||||
for( i = 0; i < cdims; i++ )
|
||||
{
|
||||
int j, n = dims[i];
|
||||
@ -212,7 +212,7 @@ float** CV_BaseHistTest::get_hist_ranges( int /*test_case_idx*/ )
|
||||
if( (pow(q,(double)n)-1)/(q-1.) >= _high-_low )
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if( j == 0 )
|
||||
{
|
||||
delta = (_high-_low)/n;
|
||||
@ -223,9 +223,9 @@ float** CV_BaseHistTest::get_hist_ranges( int /*test_case_idx*/ )
|
||||
q = 1 + j*0.1;
|
||||
delta = cvFloor((_high-_low)*(q-1)/(pow(q,(double)n) - 1));
|
||||
delta = MAX(delta, 1.);
|
||||
}
|
||||
}
|
||||
val = _low;
|
||||
|
||||
|
||||
for( j = 0; j <= n; j++ )
|
||||
{
|
||||
_ranges[j+ofs] = (float)MIN(val,_high);
|
||||
@ -236,7 +236,7 @@ float** CV_BaseHistTest::get_hist_ranges( int /*test_case_idx*/ )
|
||||
ofs += n + 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return &ranges[0];
|
||||
}
|
||||
|
||||
@ -246,7 +246,7 @@ void CV_BaseHistTest::init_hist( int /*test_case_idx*/, int hist_i )
|
||||
if( gen_random_hist )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
|
||||
if( hist_type == CV_HIST_ARRAY )
|
||||
{
|
||||
Mat h = cvarrToMat(hist[hist_i]->bins);
|
||||
@ -255,13 +255,13 @@ void CV_BaseHistTest::init_hist( int /*test_case_idx*/, int hist_i )
|
||||
else
|
||||
{
|
||||
CvArr* arr = hist[hist_i]->bins;
|
||||
int i, j, total_size = 1, nz_count;
|
||||
int i, j, totalSize = 1, nz_count;
|
||||
int idx[CV_MAX_DIM];
|
||||
for( i = 0; i < cdims; i++ )
|
||||
total_size *= dims[i];
|
||||
totalSize *= dims[i];
|
||||
|
||||
nz_count = cvtest::randInt(rng) % MAX( total_size/4, 100 );
|
||||
nz_count = MIN( nz_count, total_size );
|
||||
nz_count = cvtest::randInt(rng) % MAX( totalSize/4, 100 );
|
||||
nz_count = MIN( nz_count, totalSize );
|
||||
|
||||
// a zero number of non-zero elements should be allowed
|
||||
for( i = 0; i < nz_count; i++ )
|
||||
@ -286,7 +286,7 @@ int CV_BaseHistTest::prepare_test_case( int test_case_idx )
|
||||
get_hist_params( test_case_idx );
|
||||
r = get_hist_ranges( test_case_idx );
|
||||
hist.resize(hist_count);
|
||||
|
||||
|
||||
for( i = 0; i < hist_count; i++ )
|
||||
{
|
||||
hist[i] = cvCreateHist( cdims, dims, hist_type, r, uniform );
|
||||
@ -323,7 +323,7 @@ protected:
|
||||
int prepare_test_case( int test_case_idx );
|
||||
int validate_test_results( int test_case_idx );
|
||||
void init_hist( int test_case_idx, int i );
|
||||
|
||||
|
||||
CvMat* indices;
|
||||
CvMat* values;
|
||||
CvMat* values0;
|
||||
@ -376,7 +376,7 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
iters = (cvtest::randInt(rng) % MAX(total_size/10,100)) + 1;
|
||||
iters = MIN( iters, total_size*9/10 + 1 );
|
||||
|
||||
|
||||
indices = cvCreateMat( 1, iters*cdims, CV_32S );
|
||||
values = cvCreateMat( 1, iters, CV_32F );
|
||||
values0 = cvCreateMat( 1, iters, CV_32F );
|
||||
@ -422,7 +422,7 @@ int CV_QueryHistTest::prepare_test_case( int test_case_idx )
|
||||
if( GET_BIT(lin_idx) )
|
||||
values0->data.fl[i] = (float)(lin_idx+1);
|
||||
}
|
||||
|
||||
|
||||
cvReleaseMat( &bit_mask );
|
||||
}
|
||||
|
||||
@ -539,7 +539,7 @@ int CV_QueryHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
int code = cvtest::TS::OK;
|
||||
int i, j, iters = values->cols;
|
||||
|
||||
|
||||
for( i = 0; i < iters; i++ )
|
||||
{
|
||||
float v = values->data.fl[i], v0 = values0->data.fl[i];
|
||||
@ -613,7 +613,7 @@ void CV_MinMaxHistTest::init_hist(int test_case_idx, int hist_i)
|
||||
}
|
||||
if( !eq || total_size == 1 )
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
min_val0 = (float)(-cvtest::randReal(rng)*10 - FLT_EPSILON);
|
||||
max_val0 = (float)(cvtest::randReal(rng)*10 + FLT_EPSILON + gen_hist_max_val);
|
||||
@ -644,7 +644,7 @@ void CV_MinMaxHistTest::run_func(void)
|
||||
int CV_MinMaxHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
int code = cvtest::TS::OK;
|
||||
|
||||
|
||||
if( cvIsNaN(min_val) || cvIsInf(min_val) ||
|
||||
cvIsNaN(max_val) || cvIsInf(max_val) )
|
||||
{
|
||||
@ -728,7 +728,7 @@ void CV_NormHistTest::run_func(void)
|
||||
if( hist_type != CV_HIST_ARRAY && test_cpp )
|
||||
{
|
||||
cv::SparseMat h((CvSparseMat*)hist[0]->bins);
|
||||
cv::normalize(h, h, factor, CV_L1);
|
||||
cv::normalize(h, h, factor, CV_L1);
|
||||
cvReleaseSparseMat((CvSparseMat**)&hist[0]->bins);
|
||||
hist[0]->bins = (CvSparseMat*)h;
|
||||
}
|
||||
@ -741,7 +741,7 @@ int CV_NormHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
int code = cvtest::TS::OK;
|
||||
double sum = 0;
|
||||
|
||||
|
||||
if( hist_type == CV_HIST_ARRAY )
|
||||
{
|
||||
int i;
|
||||
@ -755,7 +755,7 @@ int CV_NormHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
CvSparseMat* sparse = (CvSparseMat*)hist[0]->bins;
|
||||
CvSparseMatIterator iterator;
|
||||
CvSparseNode *node;
|
||||
|
||||
|
||||
for( node = cvInitSparseMatIterator( sparse, &iterator );
|
||||
node != 0; node = cvGetNextSparseNode( &iterator ))
|
||||
{
|
||||
@ -839,7 +839,7 @@ int CV_ThreshHistTest::prepare_test_case( int test_case_idx )
|
||||
if( hist_type == CV_HIST_ARRAY )
|
||||
{
|
||||
orig_nz_count = total_size;
|
||||
|
||||
|
||||
values = cvCreateMat( 1, total_size, CV_32F );
|
||||
memcpy( values->data.fl, cvPtr1D( hist[0]->bins, 0 ), total_size*sizeof(float) );
|
||||
}
|
||||
@ -859,7 +859,7 @@ int CV_ThreshHistTest::prepare_test_case( int test_case_idx )
|
||||
node != 0; node = cvGetNextSparseNode( &iterator ), i++ )
|
||||
{
|
||||
const int* idx = CV_NODE_IDX(sparse,node);
|
||||
|
||||
|
||||
OPENCV_ASSERT( i < orig_nz_count, "CV_ThreshHistTest::prepare_test_case", "Buffer overflow" );
|
||||
|
||||
values->data.fl[i] = *(float*)CV_NODE_VAL(sparse,node);
|
||||
@ -924,7 +924,7 @@ int CV_ThreshHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if( code > 0 && hist_type == CV_HIST_SPARSE )
|
||||
{
|
||||
if( sparse->heap->active_count > 0 )
|
||||
@ -1003,7 +1003,7 @@ int CV_CompareHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
float* ptr0 = (float*)cvPtr1D( hist[0]->bins, 0 );
|
||||
float* ptr1 = (float*)cvPtr1D( hist[1]->bins, 0 );
|
||||
|
||||
|
||||
for( i = 0; i < total_size; i++ )
|
||||
{
|
||||
double v0 = ptr0[i], v1 = ptr1[i];
|
||||
@ -1031,7 +1031,7 @@ int CV_CompareHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
const int* idx = CV_NODE_IDX(sparse0, node);
|
||||
double v0 = *(float*)CV_NODE_VAL(sparse0, node);
|
||||
double v1 = (float)cvGetRealND(sparse1, idx);
|
||||
|
||||
|
||||
result0[CV_COMP_CORREL] += v0*v1;
|
||||
result0[CV_COMP_INTERSECT] += MIN(v0,v1);
|
||||
if( fabs(v0) > DBL_EPSILON )
|
||||
@ -1134,7 +1134,7 @@ CV_CalcHistTest::~CV_CalcHistTest()
|
||||
void CV_CalcHistTest::clear()
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for( i = 0; i <= CV_MAX_DIM; i++ )
|
||||
cvReleaseImage( &images[i] );
|
||||
|
||||
@ -1160,7 +1160,7 @@ int CV_CalcHistTest::prepare_test_case( int test_case_idx )
|
||||
img_type == CV_8U ? IPL_DEPTH_8U : IPL_DEPTH_32F, nch );
|
||||
channels[i] = cvtest::randInt(rng) % nch;
|
||||
Mat images_i = cvarrToMat(images[i]);
|
||||
|
||||
|
||||
cvtest::randUni( rng, images_i, Scalar::all(low), Scalar::all(high) );
|
||||
}
|
||||
else if( i == CV_MAX_DIM && cvtest::randInt(rng) % 2 )
|
||||
@ -1168,7 +1168,7 @@ int CV_CalcHistTest::prepare_test_case( int test_case_idx )
|
||||
// create mask
|
||||
images[i] = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
|
||||
Mat images_i = cvarrToMat(images[i]);
|
||||
|
||||
|
||||
// make ~25% pixels in the mask non-zero
|
||||
cvtest::randUni( rng, images_i, Scalar::all(-2), Scalar::all(2) );
|
||||
}
|
||||
@ -1230,7 +1230,7 @@ cvTsCalcHist( IplImage** _images, CvHistogram* hist, IplImage* _mask, int* chann
|
||||
{
|
||||
float val[CV_MAX_DIM];
|
||||
int idx[CV_MAX_DIM];
|
||||
|
||||
|
||||
if( mptr && !mptr[x] )
|
||||
continue;
|
||||
if( img_depth == IPL_DEPTH_8U )
|
||||
@ -1288,7 +1288,7 @@ int CV_CalcHistTest::validate_test_results( int /*test_case_idx*/ )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "The histogram does not match to the reference one\n" );
|
||||
code = cvtest::TS::FAIL_BAD_ACCURACY;
|
||||
|
||||
|
||||
}
|
||||
|
||||
if( code < 0 )
|
||||
@ -1345,7 +1345,7 @@ CV_CalcBackProjectTest::~CV_CalcBackProjectTest()
|
||||
void CV_CalcBackProjectTest::clear()
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for( i = 0; i < CV_MAX_DIM+3; i++ )
|
||||
cvReleaseImage( &images[i] );
|
||||
|
||||
@ -1399,7 +1399,7 @@ int CV_CalcBackProjectTest::prepare_test_case( int test_case_idx )
|
||||
{
|
||||
int idx = cvtest::randInt(rng) % img_len;
|
||||
double val = cvtest::randReal(rng)*(high - low) + low;
|
||||
|
||||
|
||||
if( img_type == CV_8U )
|
||||
((uchar*)data)[idx] = (uchar)cvRound(val);
|
||||
else
|
||||
@ -1453,7 +1453,7 @@ cvTsCalcBackProject( IplImage** images, IplImage* dst, CvHistogram* hist, int* c
|
||||
float val[CV_MAX_DIM];
|
||||
float bin_val = 0;
|
||||
int idx[CV_MAX_DIM];
|
||||
|
||||
|
||||
if( img_depth == IPL_DEPTH_8U )
|
||||
for( k = 0; k < cdims; k++ )
|
||||
val[k] = plane[k].ptr[x*nch[k]];
|
||||
@ -1569,7 +1569,7 @@ CV_CalcBackProjectPatchTest::~CV_CalcBackProjectPatchTest()
|
||||
void CV_CalcBackProjectPatchTest::clear()
|
||||
{
|
||||
int i;
|
||||
|
||||
|
||||
for( i = 0; i < CV_MAX_DIM+2; i++ )
|
||||
cvReleaseImage( &images[i] );
|
||||
|
||||
@ -1627,7 +1627,7 @@ int CV_CalcBackProjectPatchTest::prepare_test_case( int test_case_idx )
|
||||
{
|
||||
int idx = cvtest::randInt(rng) % img_len;
|
||||
double val = cvtest::randReal(rng)*(high - low) + low;
|
||||
|
||||
|
||||
if( img_type == CV_8U )
|
||||
((uchar*)data)[idx] = (uchar)cvRound(val);
|
||||
else
|
||||
@ -1652,7 +1652,7 @@ cvTsCalcBackProjectPatch( IplImage** images, IplImage* dst, CvSize patch_size,
|
||||
double factor, int* channels )
|
||||
{
|
||||
CvHistogram* model = 0;
|
||||
|
||||
|
||||
IplImage imgstub[CV_MAX_DIM], *img[CV_MAX_DIM];
|
||||
IplROI roi;
|
||||
int i, dims;
|
||||
@ -1679,7 +1679,7 @@ cvTsCalcBackProjectPatch( IplImage** images, IplImage* dst, CvSize patch_size,
|
||||
for( x = 0; x < size.width; x++ )
|
||||
{
|
||||
double result;
|
||||
|
||||
|
||||
roi.xOffset = x;
|
||||
roi.yOffset = y;
|
||||
roi.width = patch_size.width;
|
||||
@ -1703,7 +1703,7 @@ int CV_CalcBackProjectPatchTest::validate_test_results( int /*test_case_idx*/ )
|
||||
|
||||
cvTsCalcBackProjectPatch( images, images[CV_MAX_DIM+1],
|
||||
patch_size, hist[0], method, factor, channels );
|
||||
|
||||
|
||||
Mat a = cvarrToMat(images[CV_MAX_DIM]), b = cvarrToMat(images[CV_MAX_DIM+1]);
|
||||
code = cvtest::cmpEps2( ts, a, b, err_level, true, "BackProjectPatch result" );
|
||||
|
||||
@ -1756,7 +1756,7 @@ void CV_BayesianProbTest::init_hist( int test_case_idx, int hist_i )
|
||||
int CV_BayesianProbTest::prepare_test_case( int test_case_idx )
|
||||
{
|
||||
RNG& rng = ts->get_rng();
|
||||
|
||||
|
||||
hist_count = (cvtest::randInt(rng) % (MAX_HIST/2-1) + 2)*2;
|
||||
hist_count = MIN( hist_count, MAX_HIST );
|
||||
int code = CV_BaseHistTest::prepare_test_case( test_case_idx );
|
||||
@ -1833,5 +1833,5 @@ TEST(Imgproc_Hist_MinMaxVal, accuracy) { CV_MinMaxHistTest test; test.safe_run()
|
||||
TEST(Imgproc_Hist_CalcBackProject, accuracy) { CV_CalcBackProjectTest test; test.safe_run(); }
|
||||
TEST(Imgproc_Hist_CalcBackProjectPatch, accuracy) { CV_CalcBackProjectPatchTest test; test.safe_run(); }
|
||||
TEST(Imgproc_Hist_BayesianProb, accuracy) { CV_BayesianProbTest test; test.safe_run(); }
|
||||
|
||||
|
||||
/* End Of File */
|
||||
|
@ -135,7 +135,7 @@ int CV_ImgWarpBaseTest::prepare_test_case( int test_case_idx )
|
||||
if( test_mat[INPUT_OUTPUT][0].cols >= img.cols &&
|
||||
test_mat[INPUT_OUTPUT][0].rows >= img.rows )
|
||||
space_scale = spatial_scale_zoom;
|
||||
|
||||
|
||||
for( i = 0; i < img.rows; i++ )
|
||||
{
|
||||
uchar* ptr = img.ptr(i);
|
||||
@ -192,7 +192,7 @@ int CV_ImgWarpBaseTest::prepare_test_case( int test_case_idx )
|
||||
}*/
|
||||
cv::Mat src(1, cols*cn, CV_32F, &buffer[0]);
|
||||
cv::Mat dst(1, cols*cn, depth, ptr);
|
||||
src.convertTo(dst, dst.type());
|
||||
src.convertTo(dst, dst.type());
|
||||
}
|
||||
|
||||
return code;
|
||||
@ -279,7 +279,7 @@ void CV_ResizeTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
CvMat* x_idx = cvCreateMat( 1, dst->cols, CV_32SC1 );
|
||||
CvMat* y_idx = cvCreateMat( 1, dst->rows, CV_32SC1 );
|
||||
int* x_tab = x_idx->data.i;
|
||||
int elem_size = CV_ELEM_SIZE(src->type);
|
||||
int elem_size = CV_ELEM_SIZE(src->type);
|
||||
int drows = dst->rows, dcols = dst->cols;
|
||||
|
||||
if( interpolation == CV_INTER_NN )
|
||||
@ -302,7 +302,7 @@ void CV_ResizeTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
{
|
||||
double scale_x = (double)src->cols/dcols;
|
||||
double scale_y = (double)src->rows/drows;
|
||||
|
||||
|
||||
for( j = 0; j < dcols; j++ )
|
||||
{
|
||||
double f = ((j+0.5)*scale_x - 0.5);
|
||||
@ -322,7 +322,7 @@ void CV_ResizeTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
{
|
||||
uchar* dptr = dst->data.ptr + dst->step*i;
|
||||
const uchar* sptr0 = src->data.ptr + src->step*y_idx->data.i[i];
|
||||
|
||||
|
||||
for( j = 0; j < dcols; j++, dptr += elem_size )
|
||||
{
|
||||
const uchar* sptr = sptr0 + x_tab[j];
|
||||
@ -394,7 +394,7 @@ static void test_remap( const Mat& src, Mat& dst, const Mat& mapx, const Mat& ma
|
||||
|
||||
xs -= ixs;
|
||||
ys -= iys;
|
||||
|
||||
|
||||
switch( depth )
|
||||
{
|
||||
case CV_8U:
|
||||
@ -508,7 +508,7 @@ int CV_WarpAffineTest::prepare_test_case( int test_case_idx )
|
||||
RNG& rng = ts->get_rng();
|
||||
int code = CV_ImgWarpBaseTest::prepare_test_case( test_case_idx );
|
||||
const Mat& src = test_mat[INPUT][0];
|
||||
const Mat& dst = test_mat[INPUT_OUTPUT][0];
|
||||
const Mat& dst = test_mat[INPUT_OUTPUT][0];
|
||||
Mat& mat = test_mat[INPUT][1];
|
||||
CvPoint2D32f center;
|
||||
double scale, angle;
|
||||
@ -516,8 +516,8 @@ int CV_WarpAffineTest::prepare_test_case( int test_case_idx )
|
||||
if( code <= 0 )
|
||||
return code;
|
||||
|
||||
double buf[6];
|
||||
Mat tmp( 2, 3, mat.type(), buf );
|
||||
double buffer[6];
|
||||
Mat tmp( 2, 3, mat.type(), buffer );
|
||||
|
||||
center.x = (float)((cvtest::randReal(rng)*1.2 - 0.1)*src.cols);
|
||||
center.y = (float)((cvtest::randReal(rng)*1.2 - 0.1)*src.rows);
|
||||
@ -619,7 +619,7 @@ int CV_WarpPerspectiveTest::prepare_test_case( int test_case_idx )
|
||||
RNG& rng = ts->get_rng();
|
||||
int code = CV_ImgWarpBaseTest::prepare_test_case( test_case_idx );
|
||||
const CvMat& src = test_mat[INPUT][0];
|
||||
const CvMat& dst = test_mat[INPUT_OUTPUT][0];
|
||||
const CvMat& dst = test_mat[INPUT_OUTPUT][0];
|
||||
Mat& mat = test_mat[INPUT][1];
|
||||
Point2f s[4], d[4];
|
||||
int i;
|
||||
@ -636,17 +636,17 @@ int CV_WarpPerspectiveTest::prepare_test_case( int test_case_idx )
|
||||
s[3] = Point2f(0,src.rows-1.f);
|
||||
d[3] = Point2f(0,dst.rows-1.f);
|
||||
|
||||
float buf[16];
|
||||
Mat tmp( 1, 16, CV_32FC1, buf );
|
||||
float bufer[16];
|
||||
Mat tmp( 1, 16, CV_32FC1, bufer );
|
||||
|
||||
rng.fill( tmp, CV_RAND_NORMAL, Scalar::all(0.), Scalar::all(0.1) );
|
||||
|
||||
for( i = 0; i < 4; i++ )
|
||||
{
|
||||
s[i].x += buf[i*4]*src.cols/2;
|
||||
s[i].y += buf[i*4+1]*src.rows/2;
|
||||
d[i].x += buf[i*4+2]*dst.cols/2;
|
||||
d[i].y += buf[i*4+3]*dst.rows/2;
|
||||
s[i].x += bufer[i*4]*src.cols/2;
|
||||
s[i].y += bufer[i*4+1]*src.rows/2;
|
||||
d[i].x += bufer[i*4+2]*dst.cols/2;
|
||||
d[i].y += bufer[i*4+3]*dst.rows/2;
|
||||
}
|
||||
|
||||
cv::getPerspectiveTransform( s, d ).convertTo( mat, mat.depth() );
|
||||
@ -675,11 +675,11 @@ void CV_WarpPerspectiveTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
double xs = x*m[0] + y*m[1] + m[2];
|
||||
double ys = x*m[3] + y*m[4] + m[5];
|
||||
double ds = x*m[6] + y*m[7] + m[8];
|
||||
|
||||
|
||||
ds = ds ? 1./ds : 0;
|
||||
xs *= ds;
|
||||
ys *= ds;
|
||||
|
||||
|
||||
mapx.at<float>(y, x) = (float)xs;
|
||||
mapy.at<float>(y, x) = (float)ys;
|
||||
}
|
||||
@ -806,15 +806,15 @@ protected:
|
||||
void fill_array( int test_case_idx, int i, int j, Mat& arr );
|
||||
|
||||
private:
|
||||
bool useCPlus;
|
||||
cv::Mat input0;
|
||||
cv::Mat input1;
|
||||
cv::Mat input2;
|
||||
cv::Mat input_new_cam;
|
||||
cv::Mat input_output;
|
||||
bool useCPlus;
|
||||
cv::Mat input0;
|
||||
cv::Mat input1;
|
||||
cv::Mat input2;
|
||||
cv::Mat input_new_cam;
|
||||
cv::Mat input_output;
|
||||
|
||||
bool zero_new_cam;
|
||||
bool zero_distortion;
|
||||
bool zero_new_cam;
|
||||
bool zero_distortion;
|
||||
};
|
||||
|
||||
|
||||
@ -823,7 +823,7 @@ CV_UndistortTest::CV_UndistortTest() : CV_ImgWarpBaseTest( false )
|
||||
//spatial_scale_zoom = spatial_scale_decimate;
|
||||
test_array[INPUT].push_back(NULL);
|
||||
test_array[INPUT].push_back(NULL);
|
||||
test_array[INPUT].push_back(NULL);
|
||||
test_array[INPUT].push_back(NULL);
|
||||
|
||||
spatial_scale_decimate = spatial_scale_zoom;
|
||||
}
|
||||
@ -834,14 +834,14 @@ void CV_UndistortTest::get_test_array_types_and_sizes( int test_case_idx, vector
|
||||
RNG& rng = ts->get_rng();
|
||||
CV_ImgWarpBaseTest::get_test_array_types_and_sizes( test_case_idx, sizes, types );
|
||||
int type = types[INPUT][0];
|
||||
type = CV_MAKETYPE( CV_8U, CV_MAT_CN(type) );
|
||||
type = CV_MAKETYPE( CV_8U, CV_MAT_CN(type) );
|
||||
types[INPUT][0] = types[INPUT_OUTPUT][0] = types[REF_INPUT_OUTPUT][0] = type;
|
||||
types[INPUT][1] = cvtest::randInt(rng)%2 ? CV_64F : CV_32F;
|
||||
types[INPUT][2] = cvtest::randInt(rng)%2 ? CV_64F : CV_32F;
|
||||
sizes[INPUT][1] = cvSize(3,3);
|
||||
sizes[INPUT][2] = cvtest::randInt(rng)%2 ? cvSize(4,1) : cvSize(1,4);
|
||||
types[INPUT][3] = types[INPUT][1];
|
||||
sizes[INPUT][3] = sizes[INPUT][1];
|
||||
types[INPUT][3] = types[INPUT][1];
|
||||
sizes[INPUT][3] = sizes[INPUT][1];
|
||||
interpolation = CV_INTER_LINEAR;
|
||||
}
|
||||
|
||||
@ -855,22 +855,22 @@ void CV_UndistortTest::fill_array( int test_case_idx, int i, int j, Mat& arr )
|
||||
|
||||
void CV_UndistortTest::run_func()
|
||||
{
|
||||
if (!useCPlus)
|
||||
{
|
||||
if (!useCPlus)
|
||||
{
|
||||
CvMat a = test_mat[INPUT][1], k = test_mat[INPUT][2];
|
||||
cvUndistort2( test_array[INPUT][0], test_array[INPUT_OUTPUT][0], &a, &k);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (zero_distortion)
|
||||
{
|
||||
cv::undistort(input0,input_output,input1,cv::Mat());
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::undistort(input0,input_output,input1,input2);
|
||||
}
|
||||
}
|
||||
cvUndistort2( test_array[INPUT][0], test_array[INPUT_OUTPUT][0], &a, &k);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (zero_distortion)
|
||||
{
|
||||
cv::undistort(input0,input_output,input1,cv::Mat());
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::undistort(input0,input_output,input1,input2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -888,10 +888,10 @@ int CV_UndistortTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
const Mat& src = test_mat[INPUT][0];
|
||||
double k[4], a[9] = {0,0,0,0,0,0,0,0,1};
|
||||
double new_cam[9] = {0,0,0,0,0,0,0,0,1};
|
||||
double new_cam[9] = {0,0,0,0,0,0,0,0,1};
|
||||
double sz = MAX(src.rows, src.cols);
|
||||
|
||||
Mat& _new_cam0 = test_mat[INPUT][3];
|
||||
|
||||
Mat& _new_cam0 = test_mat[INPUT][3];
|
||||
Mat _new_cam(test_mat[INPUT][3].rows,test_mat[INPUT][3].cols,CV_64F,new_cam);
|
||||
Mat& _a0 = test_mat[INPUT][1];
|
||||
Mat _a(3,3,CV_64F,a);
|
||||
@ -925,21 +925,21 @@ int CV_UndistortTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
_a.convertTo(_a0, _a0.depth());
|
||||
|
||||
zero_distortion = (cvtest::randInt(rng)%2) == 0 ? false : true;
|
||||
zero_distortion = (cvtest::randInt(rng)%2) == 0 ? false : true;
|
||||
_k.convertTo(_k0, _k0.depth());
|
||||
|
||||
zero_new_cam = (cvtest::randInt(rng)%2) == 0 ? false : true;
|
||||
zero_new_cam = (cvtest::randInt(rng)%2) == 0 ? false : true;
|
||||
_new_cam.convertTo(_new_cam0, _new_cam0.depth());
|
||||
|
||||
//Testing C++ code
|
||||
useCPlus = ((cvtest::randInt(rng) % 2)!=0);
|
||||
if (useCPlus)
|
||||
{
|
||||
input0 = test_mat[INPUT][0];
|
||||
input1 = test_mat[INPUT][1];
|
||||
input2 = test_mat[INPUT][2];
|
||||
input_new_cam = test_mat[INPUT][3];
|
||||
}
|
||||
//Testing C++ code
|
||||
useCPlus = ((cvtest::randInt(rng) % 2)!=0);
|
||||
if (useCPlus)
|
||||
{
|
||||
input0 = test_mat[INPUT][0];
|
||||
input1 = test_mat[INPUT][1];
|
||||
input2 = test_mat[INPUT][2];
|
||||
input_new_cam = test_mat[INPUT][3];
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
@ -947,11 +947,11 @@ int CV_UndistortTest::prepare_test_case( int test_case_idx )
|
||||
|
||||
void CV_UndistortTest::prepare_to_validation( int /*test_case_idx*/ )
|
||||
{
|
||||
if (useCPlus)
|
||||
{
|
||||
if (useCPlus)
|
||||
{
|
||||
Mat& output = test_mat[INPUT_OUTPUT][0];
|
||||
input_output.convertTo(output, output.type());
|
||||
}
|
||||
}
|
||||
Mat& src = test_mat[INPUT][0];
|
||||
Mat& dst = test_mat[REF_INPUT_OUTPUT][0];
|
||||
Mat& dst0 = test_mat[INPUT_OUTPUT][0];
|
||||
@ -978,7 +978,7 @@ protected:
|
||||
void fill_array( int test_case_idx, int i, int j, Mat& arr );
|
||||
|
||||
private:
|
||||
bool dualChannel;
|
||||
bool dualChannel;
|
||||
};
|
||||
|
||||
|
||||
@ -1003,8 +1003,8 @@ void CV_UndistortMapTest::get_test_array_types_and_sizes( int test_case_idx, vec
|
||||
|
||||
CvSize sz = sizes[OUTPUT][0];
|
||||
types[INPUT][0] = types[INPUT][1] = depth;
|
||||
dualChannel = cvtest::randInt(rng)%2 == 0;
|
||||
types[OUTPUT][0] = types[OUTPUT][1] =
|
||||
dualChannel = cvtest::randInt(rng)%2 == 0;
|
||||
types[OUTPUT][0] = types[OUTPUT][1] =
|
||||
types[REF_OUTPUT][0] = types[REF_OUTPUT][1] = dualChannel ? CV_32FC2 : CV_32F;
|
||||
sizes[INPUT][0] = cvSize(3,3);
|
||||
sizes[INPUT][1] = cvtest::randInt(rng)%2 ? cvSize(4,1) : cvSize(1,4);
|
||||
@ -1026,11 +1026,11 @@ void CV_UndistortMapTest::fill_array( int test_case_idx, int i, int j, Mat& arr
|
||||
void CV_UndistortMapTest::run_func()
|
||||
{
|
||||
CvMat a = test_mat[INPUT][0], k = test_mat[INPUT][1];
|
||||
|
||||
if (!dualChannel )
|
||||
cvInitUndistortMap( &a, &k, test_array[OUTPUT][0], test_array[OUTPUT][1] );
|
||||
else
|
||||
cvInitUndistortMap( &a, &k, test_array[OUTPUT][0], 0 );
|
||||
|
||||
if (!dualChannel )
|
||||
cvInitUndistortMap( &a, &k, test_array[OUTPUT][0], test_array[OUTPUT][1] );
|
||||
else
|
||||
cvInitUndistortMap( &a, &k, test_array[OUTPUT][0], 0 );
|
||||
}
|
||||
|
||||
|
||||
@ -1069,11 +1069,11 @@ int CV_UndistortMapTest::prepare_test_case( int test_case_idx )
|
||||
_a.convertTo(_a0, _a0.depth());
|
||||
_k.convertTo(_k0, _k0.depth());
|
||||
|
||||
if (dualChannel)
|
||||
{
|
||||
if (dualChannel)
|
||||
{
|
||||
test_mat[REF_OUTPUT][1] = Scalar::all(0);
|
||||
test_mat[OUTPUT][1] = Scalar::all(0);
|
||||
}
|
||||
test_mat[OUTPUT][1] = Scalar::all(0);
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
@ -1102,7 +1102,7 @@ test_getQuadrangeSubPix( const Mat& src, Mat& dst, double* a )
|
||||
{
|
||||
int sstep = (int)(src.step / sizeof(float));
|
||||
int scols = src.cols, srows = src.rows;
|
||||
|
||||
|
||||
CV_Assert( src.depth() == CV_32F && src.type() == dst.type() );
|
||||
|
||||
int cn = dst.channels();
|
||||
@ -1167,11 +1167,11 @@ void CV_GetRectSubPixTest::get_test_array_types_and_sizes( int test_case_idx, ve
|
||||
int src_depth = cvtest::randInt(rng) % 2, dst_depth;
|
||||
int cn = cvtest::randInt(rng) % 2 ? 3 : 1;
|
||||
CvSize src_size, dst_size;
|
||||
|
||||
|
||||
dst_depth = src_depth = src_depth == 0 ? CV_8U : CV_32F;
|
||||
if( src_depth < CV_32F && cvtest::randInt(rng) % 2 )
|
||||
dst_depth = CV_32F;
|
||||
|
||||
|
||||
types[INPUT][0] = CV_MAKETYPE(src_depth,cn);
|
||||
types[INPUT_OUTPUT][0] = types[REF_INPUT_OUTPUT][0] = CV_MAKETYPE(dst_depth,cn);
|
||||
|
||||
@ -1181,11 +1181,11 @@ void CV_GetRectSubPixTest::get_test_array_types_and_sizes( int test_case_idx, ve
|
||||
dst_size.width = MIN(dst_size.width,src_size.width);
|
||||
dst_size.height = MIN(dst_size.width,src_size.height);
|
||||
sizes[INPUT_OUTPUT][0] = sizes[REF_INPUT_OUTPUT][0] = dst_size;
|
||||
|
||||
|
||||
center.x = (float)(cvtest::randReal(rng)*src_size.width);
|
||||
center.y = (float)(cvtest::randReal(rng)*src_size.height);
|
||||
interpolation = CV_INTER_LINEAR;
|
||||
|
||||
|
||||
test_cpp = (cvtest::randInt(rng) & 256) == 0;
|
||||
}
|
||||
|
||||
@ -1274,11 +1274,11 @@ void CV_GetQuadSubPixTest::get_test_array_types_and_sizes( int test_case_idx, ve
|
||||
RNG& rng = ts->get_rng();
|
||||
int msz, src_depth = cvtest::randInt(rng) % 2, dst_depth;
|
||||
int cn = cvtest::randInt(rng) % 2 ? 3 : 1;
|
||||
|
||||
|
||||
dst_depth = src_depth = src_depth == 0 ? CV_8U : CV_32F;
|
||||
if( src_depth < CV_32F && cvtest::randInt(rng) % 2 )
|
||||
dst_depth = CV_32F;
|
||||
|
||||
|
||||
types[INPUT][0] = CV_MAKETYPE(src_depth,cn);
|
||||
types[INPUT_OUTPUT][0] = types[REF_INPUT_OUTPUT][0] = CV_MAKETYPE(dst_depth,cn);
|
||||
|
||||
@ -1333,7 +1333,7 @@ int CV_GetQuadSubPixTest::prepare_test_case( int test_case_idx )
|
||||
center.y = (float)((cvtest::randReal(rng)*1.2 - 0.1)*src.rows);
|
||||
angle = cvtest::randReal(rng)*360;
|
||||
scale = cvtest::randReal(rng)*0.2 + 0.9;
|
||||
|
||||
|
||||
// y = Ax + b -> x = A^-1(y - b) = A^-1*y - A^-1*b
|
||||
scale = 1./scale;
|
||||
angle = angle*(CV_PI/180.);
|
||||
@ -1413,7 +1413,7 @@ TEST(Imgproc_fitLine_vector_2d, regression)
|
||||
|
||||
points_vector.push_back(p21);
|
||||
points_vector.push_back(p22);
|
||||
points_vector.push_back(p23);
|
||||
points_vector.push_back(p23);
|
||||
|
||||
std::vector<float> line;
|
||||
|
||||
|
@ -91,7 +91,8 @@ void CV_ThreshTest::get_test_array_types_and_sizes( int test_case_idx,
|
||||
}
|
||||
else if( depth == CV_16S )
|
||||
{
|
||||
float min_val = SHRT_MIN-100.f, max_val = SHRT_MAX+100.f;
|
||||
float min_val = SHRT_MIN-100.f;
|
||||
max_val = SHRT_MAX+100.f;
|
||||
thresh_val = (float)(cvtest::randReal(rng)*(max_val - min_val) + min_val);
|
||||
max_val = (float)(cvtest::randReal(rng)*(max_val - min_val) + min_val);
|
||||
if( cvtest::randInt(rng)%4 == 0 )
|
||||
|
@ -1347,9 +1347,9 @@ class CV_EXPORTS CvImage
|
||||
{
|
||||
public:
|
||||
CvImage() : image(0), refcount(0) {}
|
||||
CvImage( CvSize size, int depth, int channels )
|
||||
CvImage( CvSize _size, int _depth, int _channels )
|
||||
{
|
||||
image = cvCreateImage( size, depth, channels );
|
||||
image = cvCreateImage( _size, _depth, _channels );
|
||||
refcount = image ? new int(1) : 0;
|
||||
}
|
||||
|
||||
@ -1383,12 +1383,12 @@ public:
|
||||
|
||||
CvImage clone() { return CvImage(image ? cvCloneImage(image) : 0); }
|
||||
|
||||
void create( CvSize size, int depth, int channels )
|
||||
void create( CvSize _size, int _depth, int _channels )
|
||||
{
|
||||
if( !image || !refcount ||
|
||||
image->width != size.width || image->height != size.height ||
|
||||
image->depth != depth || image->nChannels != channels )
|
||||
attach( cvCreateImage( size, depth, channels ));
|
||||
image->width != _size.width || image->height != _size.height ||
|
||||
image->depth != _depth || image->nChannels != _channels )
|
||||
attach( cvCreateImage( _size, _depth, _channels ));
|
||||
}
|
||||
|
||||
void release() { detach(); }
|
||||
@ -1447,9 +1447,9 @@ public:
|
||||
|
||||
int coi() const { return !image || !image->roi ? 0 : image->roi->coi; }
|
||||
|
||||
void set_roi(CvRect roi) { cvSetImageROI(image,roi); }
|
||||
void set_roi(CvRect _roi) { cvSetImageROI(image,_roi); }
|
||||
void reset_roi() { cvResetImageROI(image); }
|
||||
void set_coi(int coi) { cvSetImageCOI(image,coi); }
|
||||
void set_coi(int _coi) { cvSetImageCOI(image,_coi); }
|
||||
int depth() const { return image ? image->depth : 0; }
|
||||
int channels() const { return image ? image->nChannels : 0; }
|
||||
int pix_size() const { return image ? ((image->depth & 255)>>3)*image->nChannels : 0; }
|
||||
@ -1511,18 +1511,18 @@ class CV_EXPORTS CvMatrix
|
||||
{
|
||||
public:
|
||||
CvMatrix() : matrix(0) {}
|
||||
CvMatrix( int rows, int cols, int type )
|
||||
{ matrix = cvCreateMat( rows, cols, type ); }
|
||||
CvMatrix( int _rows, int _cols, int _type )
|
||||
{ matrix = cvCreateMat( _rows, _cols, _type ); }
|
||||
|
||||
CvMatrix( int rows, int cols, int type, CvMat* hdr,
|
||||
void* data=0, int step=CV_AUTOSTEP )
|
||||
{ matrix = cvInitMatHeader( hdr, rows, cols, type, data, step ); }
|
||||
CvMatrix( int _rows, int _cols, int _type, CvMat* hdr,
|
||||
void* _data=0, int _step=CV_AUTOSTEP )
|
||||
{ matrix = cvInitMatHeader( hdr, _rows, _cols, _type, _data, _step ); }
|
||||
|
||||
CvMatrix( int rows, int cols, int type, CvMemStorage* storage, bool alloc_data=true );
|
||||
|
||||
CvMatrix( int rows, int cols, int type, void* data, int step=CV_AUTOSTEP )
|
||||
{ matrix = cvCreateMatHeader( rows, cols, type );
|
||||
cvSetData( matrix, data, step ); }
|
||||
CvMatrix( int _rows, int _cols, int _type, void* _data, int _step=CV_AUTOSTEP )
|
||||
{ matrix = cvCreateMatHeader( _rows, _cols, _type );
|
||||
cvSetData( matrix, _data, _step ); }
|
||||
|
||||
CvMatrix( CvMat* m )
|
||||
{ matrix = m; }
|
||||
@ -1557,12 +1557,12 @@ public:
|
||||
addref();
|
||||
}
|
||||
|
||||
void create( int rows, int cols, int type )
|
||||
void create( int _rows, int _cols, int _type )
|
||||
{
|
||||
if( !matrix || !matrix->refcount ||
|
||||
matrix->rows != rows || matrix->cols != cols ||
|
||||
CV_MAT_TYPE(matrix->type) != type )
|
||||
set( cvCreateMat( rows, cols, type ), false );
|
||||
matrix->rows != _rows || matrix->cols != _cols ||
|
||||
CV_MAT_TYPE(matrix->type) != _type )
|
||||
set( cvCreateMat( _rows, _cols, _type ), false );
|
||||
}
|
||||
|
||||
void addref() const
|
||||
@ -1626,8 +1626,8 @@ public:
|
||||
const uchar* data() const { return matrix ? matrix->data.ptr : 0; }
|
||||
int step() const { return matrix ? matrix->step : 0; }
|
||||
|
||||
void set_data( void* data, int step=CV_AUTOSTEP )
|
||||
{ cvSetData( matrix, data, step ); }
|
||||
void set_data( void* _data, int _step=CV_AUTOSTEP )
|
||||
{ cvSetData( matrix, _data, _step ); }
|
||||
|
||||
uchar* row(int i) { return !matrix ? 0 : matrix->data.ptr + i*matrix->step; }
|
||||
const uchar* row(int i) const
|
||||
@ -2014,8 +2014,8 @@ struct CV_EXPORTS BaseKeypoint
|
||||
: x(0), y(0), image(NULL)
|
||||
{}
|
||||
|
||||
BaseKeypoint(int x, int y, IplImage* image)
|
||||
: x(x), y(y), image(image)
|
||||
BaseKeypoint(int _x, int _y, IplImage* _image)
|
||||
: x(_x), y(_y), image(_image)
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -350,11 +350,10 @@ public:
|
||||
|
||||
virtual void Process(IplImage* pImg, IplImage* /*pFG*/)
|
||||
{
|
||||
int i;
|
||||
double MinTv = pImg->width/1440.0; /* minimal threshold for speed difference */
|
||||
double MinTv2 = MinTv*MinTv;
|
||||
|
||||
for(i=m_Tracks.GetBlobNum(); i>0; --i)
|
||||
for(int i=m_Tracks.GetBlobNum(); i>0; --i)
|
||||
{
|
||||
DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlob(i-1);
|
||||
pF->state = 0;
|
||||
@ -466,14 +465,13 @@ public:
|
||||
|
||||
if(m_Wnd)
|
||||
{ /* Debug output: */
|
||||
int i;
|
||||
|
||||
if(m_pDebugImg==NULL)
|
||||
m_pDebugImg = cvCloneImage(pImg);
|
||||
else
|
||||
cvCopy(pImg, m_pDebugImg);
|
||||
|
||||
for(i=m_TrackDataBase.GetBlobNum(); i>0; --i)
|
||||
for(int i=m_TrackDataBase.GetBlobNum(); i>0; --i)
|
||||
{ /* Draw all elements in track data base: */
|
||||
int j;
|
||||
DefTrackForDist* pF = (DefTrackForDist*)m_TrackDataBase.GetBlob(i-1);
|
||||
@ -497,7 +495,7 @@ public:
|
||||
pF->close = 0;
|
||||
} /* Draw all elements in track data base. */
|
||||
|
||||
for(i=m_Tracks.GetBlobNum(); i>0; --i)
|
||||
for(int i=m_Tracks.GetBlobNum(); i>0; --i)
|
||||
{ /* Draw all elements for all trajectories: */
|
||||
DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlob(i-1);
|
||||
int j;
|
||||
|
@ -301,8 +301,8 @@ public:
|
||||
{ /* Find a neighbour on current frame
|
||||
* for each blob from previous frame:
|
||||
*/
|
||||
CvBlob* pB = m_BlobList.GetBlob(i-1);
|
||||
DefBlobTracker* pBT = (DefBlobTracker*)pB;
|
||||
CvBlob* pBl = m_BlobList.GetBlob(i-1);
|
||||
DefBlobTracker* pBT = (DefBlobTracker*)pBl;
|
||||
//int BlobID = CV_BLOB_ID(pB);
|
||||
//CvBlob* pBBest = NULL;
|
||||
//double DistBest = -1;
|
||||
|
@ -93,18 +93,19 @@ class CvKDTreeWrap : public CvFeatureTree {
|
||||
assert(results->cols == k);
|
||||
assert(dist->cols == k);
|
||||
|
||||
for (int j = 0; j < d->rows; ++j) {
|
||||
const typename __treetype::scalar_type* dj =
|
||||
(const typename __treetype::scalar_type*) dptr;
|
||||
for (int j = 0; j < d->rows; ++j)
|
||||
{
|
||||
const typename __treetype::scalar_type* dj = (const typename __treetype::scalar_type*) dptr;
|
||||
|
||||
int* resultsj = (int*) resultsptr;
|
||||
double* distj = (double*) distptr;
|
||||
tr->find_nn_bbf(dj, k, emax, nn);
|
||||
|
||||
assert((int)nn.size() <= k);
|
||||
for (unsigned int j = 0; j < nn.size(); ++j) {
|
||||
*resultsj++ = *nn[j].p;
|
||||
*distj++ = nn[j].dist;
|
||||
for (unsigned int i = 0; i < nn.size(); ++i)
|
||||
{
|
||||
*resultsj++ = *nn[i].p;
|
||||
*distj++ = nn[i].dist;
|
||||
}
|
||||
std::fill(resultsj, resultsj + k - nn.size(), -1);
|
||||
std::fill(distj, distj + k - nn.size(), 0);
|
||||
|
@ -170,12 +170,7 @@ struct CV_EXPORTS_W_MAP CvParamGrid
|
||||
min_val = max_val = step = 0;
|
||||
}
|
||||
|
||||
CvParamGrid( double min_val, double max_val, double log_step )
|
||||
{
|
||||
this->min_val = min_val;
|
||||
this->max_val = max_val;
|
||||
step = log_step;
|
||||
}
|
||||
CvParamGrid( double min_val, double max_val, double log_step );
|
||||
//CvParamGrid( int param_id );
|
||||
bool check() const;
|
||||
|
||||
@ -184,6 +179,13 @@ struct CV_EXPORTS_W_MAP CvParamGrid
|
||||
CV_PROP_RW double step;
|
||||
};
|
||||
|
||||
inline CvParamGrid::CvParamGrid( double _min_val, double _max_val, double _log_step )
|
||||
{
|
||||
min_val = _min_val;
|
||||
max_val = _max_val;
|
||||
step = _log_step;
|
||||
}
|
||||
|
||||
class CV_EXPORTS_W CvNormalBayesClassifier : public CvStatModel
|
||||
{
|
||||
public:
|
||||
@ -192,10 +194,10 @@ public:
|
||||
|
||||
CvNormalBayesClassifier( const CvMat* trainData, const CvMat* responses,
|
||||
const CvMat* varIdx=0, const CvMat* sampleIdx=0 );
|
||||
|
||||
|
||||
virtual bool train( const CvMat* trainData, const CvMat* responses,
|
||||
const CvMat* varIdx = 0, const CvMat* sampleIdx=0, bool update=false );
|
||||
|
||||
|
||||
virtual float predict( const CvMat* samples, CV_OUT CvMat* results=0 ) const;
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
@ -207,7 +209,7 @@ public:
|
||||
bool update=false );
|
||||
CV_WRAP virtual float predict( const cv::Mat& samples, CV_OUT cv::Mat* results=0 ) const;
|
||||
#endif
|
||||
|
||||
|
||||
virtual void write( CvFileStorage* storage, const char* name ) const;
|
||||
virtual void read( CvFileStorage* storage, CvFileNode* node );
|
||||
|
||||
@ -243,31 +245,31 @@ public:
|
||||
virtual bool train( const CvMat* trainData, const CvMat* responses,
|
||||
const CvMat* sampleIdx=0, bool is_regression=false,
|
||||
int maxK=32, bool updateBase=false );
|
||||
|
||||
|
||||
virtual float find_nearest( const CvMat* samples, int k, CV_OUT CvMat* results=0,
|
||||
const float** neighbors=0, CV_OUT CvMat* neighborResponses=0, CV_OUT CvMat* dist=0 ) const;
|
||||
|
||||
|
||||
#ifndef SWIG
|
||||
CV_WRAP CvKNearest( const cv::Mat& trainData, const cv::Mat& responses,
|
||||
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false, int max_k=32 );
|
||||
|
||||
|
||||
CV_WRAP virtual bool train( const cv::Mat& trainData, const cv::Mat& responses,
|
||||
const cv::Mat& sampleIdx=cv::Mat(), bool isRegression=false,
|
||||
int maxK=32, bool updateBase=false );
|
||||
|
||||
int maxK=32, bool updateBase=false );
|
||||
|
||||
virtual float find_nearest( const cv::Mat& samples, int k, cv::Mat* results=0,
|
||||
const float** neighbors=0, cv::Mat* neighborResponses=0,
|
||||
cv::Mat* dist=0 ) const;
|
||||
CV_WRAP virtual float find_nearest( const cv::Mat& samples, int k, CV_OUT cv::Mat& results,
|
||||
CV_OUT cv::Mat& neighborResponses, CV_OUT cv::Mat& dists) const;
|
||||
#endif
|
||||
|
||||
|
||||
virtual void clear();
|
||||
int get_max_k() const;
|
||||
int get_var_count() const;
|
||||
int get_sample_count() const;
|
||||
bool is_regression() const;
|
||||
|
||||
|
||||
virtual float write_results( int k, int k1, int start, int end,
|
||||
const float* neighbor_responses, const float* dist, CvMat* _results,
|
||||
CvMat* _neighbor_responses, CvMat* _dist, Cv32suf* sort_buf ) const;
|
||||
@ -473,7 +475,7 @@ public:
|
||||
virtual bool train( const CvMat* trainData, const CvMat* responses,
|
||||
const CvMat* varIdx=0, const CvMat* sampleIdx=0,
|
||||
CvSVMParams params=CvSVMParams() );
|
||||
|
||||
|
||||
virtual bool train_auto( const CvMat* trainData, const CvMat* responses,
|
||||
const CvMat* varIdx, const CvMat* sampleIdx, CvSVMParams params,
|
||||
int kfold = 10,
|
||||
@ -487,16 +489,16 @@ public:
|
||||
|
||||
virtual float predict( const CvMat* sample, bool returnDFVal=false ) const;
|
||||
virtual float predict( const CvMat* samples, CvMat* results ) const;
|
||||
|
||||
|
||||
#ifndef SWIG
|
||||
CV_WRAP CvSVM( const cv::Mat& trainData, const cv::Mat& responses,
|
||||
const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(),
|
||||
CvSVMParams params=CvSVMParams() );
|
||||
|
||||
|
||||
CV_WRAP virtual bool train( const cv::Mat& trainData, const cv::Mat& responses,
|
||||
const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(),
|
||||
CvSVMParams params=CvSVMParams() );
|
||||
|
||||
|
||||
CV_WRAP virtual bool train_auto( const cv::Mat& trainData, const cv::Mat& responses,
|
||||
const cv::Mat& varIdx, const cv::Mat& sampleIdx, CvSVMParams params,
|
||||
int k_fold = 10,
|
||||
@ -509,7 +511,7 @@ public:
|
||||
bool balanced=false);
|
||||
CV_WRAP virtual float predict( const cv::Mat& sample, bool returnDFVal=false ) const;
|
||||
#endif
|
||||
|
||||
|
||||
CV_WRAP virtual int get_support_vector_count() const;
|
||||
virtual const float* get_support_vector(int i) const;
|
||||
virtual CvSVMParams get_params() const { return params; };
|
||||
@ -564,14 +566,14 @@ public:
|
||||
|
||||
// Default parameters
|
||||
enum {DEFAULT_NCLUSTERS=5, DEFAULT_MAX_ITERS=100};
|
||||
|
||||
|
||||
// The initial step
|
||||
enum {START_E_STEP=1, START_M_STEP=2, START_AUTO_STEP=0};
|
||||
|
||||
CV_WRAP EM(int nclusters=EM::DEFAULT_NCLUSTERS, int covMatType=EM::COV_MAT_DIAGONAL,
|
||||
const TermCriteria& termCrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,
|
||||
EM::DEFAULT_MAX_ITERS, FLT_EPSILON));
|
||||
|
||||
|
||||
virtual ~EM();
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
@ -579,7 +581,7 @@ public:
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
|
||||
CV_WRAP virtual bool trainE(InputArray samples,
|
||||
InputArray means0,
|
||||
InputArray covs0=noArray(),
|
||||
@ -587,13 +589,13 @@ public:
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
|
||||
CV_WRAP virtual bool trainM(InputArray samples,
|
||||
InputArray probs0,
|
||||
OutputArray logLikelihoods=noArray(),
|
||||
OutputArray labels=noArray(),
|
||||
OutputArray probs=noArray());
|
||||
|
||||
|
||||
CV_WRAP Vec2d predict(InputArray sample,
|
||||
OutputArray probs=noArray()) const;
|
||||
|
||||
@ -603,7 +605,7 @@ public:
|
||||
virtual void read(const FileNode& fn);
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
virtual void setTrainData(int startStep, const Mat& samples,
|
||||
const Mat* probs0,
|
||||
const Mat* means0,
|
||||
@ -802,7 +804,7 @@ struct CV_EXPORTS CvDTreeTrainData
|
||||
int buf_count, buf_size;
|
||||
bool shared;
|
||||
int is_buf_16u;
|
||||
|
||||
|
||||
CvMat* cat_count;
|
||||
CvMat* cat_ofs;
|
||||
CvMat* cat_map;
|
||||
@ -871,12 +873,12 @@ public:
|
||||
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
|
||||
const cv::Mat& missingDataMask=cv::Mat(),
|
||||
CvDTreeParams params=CvDTreeParams() );
|
||||
|
||||
|
||||
CV_WRAP virtual CvDTreeNode* predict( const cv::Mat& sample, const cv::Mat& missingDataMask=cv::Mat(),
|
||||
bool preprocessedInput=false ) const;
|
||||
CV_WRAP virtual cv::Mat getVarImportance();
|
||||
#endif
|
||||
|
||||
|
||||
virtual const CvMat* get_var_importance();
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
@ -900,13 +902,13 @@ protected:
|
||||
virtual void try_split_node( CvDTreeNode* n );
|
||||
virtual void split_node_data( CvDTreeNode* n );
|
||||
virtual CvDTreeSplit* find_best_split( CvDTreeNode* n );
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_surrogate_split_ord( CvDTreeNode* n, int vi, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_surrogate_split_cat( CvDTreeNode* n, int vi, uchar* ext_buf = 0 );
|
||||
@ -1003,7 +1005,7 @@ public:
|
||||
const CvMat* sampleIdx=0, const CvMat* varType=0,
|
||||
const CvMat* missingDataMask=0,
|
||||
CvRTParams params=CvRTParams() );
|
||||
|
||||
|
||||
virtual bool train( CvMLData* data, CvRTParams params=CvRTParams() );
|
||||
virtual float predict( const CvMat* sample, const CvMat* missing = 0 ) const;
|
||||
virtual float predict_prob( const CvMat* sample, const CvMat* missing = 0 ) const;
|
||||
@ -1018,16 +1020,16 @@ public:
|
||||
CV_WRAP virtual float predict_prob( const cv::Mat& sample, const cv::Mat& missing = cv::Mat() ) const;
|
||||
CV_WRAP virtual cv::Mat getVarImportance();
|
||||
#endif
|
||||
|
||||
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
virtual const CvMat* get_var_importance();
|
||||
virtual float get_proximity( const CvMat* sample1, const CvMat* sample2,
|
||||
const CvMat* missing1 = 0, const CvMat* missing2 = 0 ) const;
|
||||
|
||||
|
||||
virtual float calc_error( CvMLData* data, int type , std::vector<float>* resp = 0 ); // type in {CV_TRAIN_ERROR, CV_TEST_ERROR}
|
||||
|
||||
virtual float get_train_error();
|
||||
virtual float get_train_error();
|
||||
|
||||
virtual void read( CvFileStorage* fs, CvFileNode* node );
|
||||
virtual void write( CvFileStorage* fs, const char* name ) const;
|
||||
@ -1083,13 +1085,13 @@ class CV_EXPORTS CvForestERTree : public CvForestTree
|
||||
{
|
||||
protected:
|
||||
virtual double calc_node_dir( CvDTreeNode* node );
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual void split_node_data( CvDTreeNode* n );
|
||||
};
|
||||
@ -1169,13 +1171,13 @@ protected:
|
||||
virtual void try_split_node( CvDTreeNode* n );
|
||||
virtual CvDTreeSplit* find_surrogate_split_ord( CvDTreeNode* n, int vi, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_surrogate_split_cat( CvDTreeNode* n, int vi, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_class( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_ord_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
virtual CvDTreeSplit* find_split_cat_reg( CvDTreeNode* n, int vi,
|
||||
float init_quality = 0, CvDTreeSplit* _split = 0, uchar* ext_buf = 0 );
|
||||
virtual void calc_node_value( CvDTreeNode* n );
|
||||
virtual double calc_node_dir( CvDTreeNode* n );
|
||||
@ -1201,14 +1203,14 @@ public:
|
||||
const CvMat* sampleIdx=0, const CvMat* varType=0,
|
||||
const CvMat* missingDataMask=0,
|
||||
CvBoostParams params=CvBoostParams() );
|
||||
|
||||
|
||||
virtual bool train( const CvMat* trainData, int tflag,
|
||||
const CvMat* responses, const CvMat* varIdx=0,
|
||||
const CvMat* sampleIdx=0, const CvMat* varType=0,
|
||||
const CvMat* missingDataMask=0,
|
||||
CvBoostParams params=CvBoostParams(),
|
||||
bool update=false );
|
||||
|
||||
|
||||
virtual bool train( CvMLData* data,
|
||||
CvBoostParams params=CvBoostParams(),
|
||||
bool update=false );
|
||||
@ -1223,19 +1225,19 @@ public:
|
||||
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
|
||||
const cv::Mat& missingDataMask=cv::Mat(),
|
||||
CvBoostParams params=CvBoostParams() );
|
||||
|
||||
|
||||
CV_WRAP virtual bool train( const cv::Mat& trainData, int tflag,
|
||||
const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(),
|
||||
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
|
||||
const cv::Mat& missingDataMask=cv::Mat(),
|
||||
CvBoostParams params=CvBoostParams(),
|
||||
bool update=false );
|
||||
|
||||
|
||||
CV_WRAP virtual float predict( const cv::Mat& sample, const cv::Mat& missing=cv::Mat(),
|
||||
const cv::Range& slice=cv::Range::all(), bool rawMode=false,
|
||||
bool returnSum=false ) const;
|
||||
#endif
|
||||
|
||||
|
||||
virtual float calc_error( CvMLData* _data, int type , std::vector<float> *resp = 0 ); // type in {CV_TRAIN_ERROR, CV_TEST_ERROR}
|
||||
|
||||
CV_WRAP virtual void prune( CvSlice slice );
|
||||
@ -1315,7 +1317,7 @@ struct CV_EXPORTS_W_MAP CvGBTreesParams : public CvDTreeParams
|
||||
|
||||
// DataType: CLASS CvGBTrees
|
||||
// Gradient Boosting Trees (GBT) algorithm implementation.
|
||||
//
|
||||
//
|
||||
// data - training dataset
|
||||
// params - parameters of the CvGBTrees
|
||||
// weak - array[0..(class_count-1)] of CvSeq
|
||||
@ -1347,7 +1349,7 @@ struct CV_EXPORTS_W_MAP CvGBTreesParams : public CvDTreeParams
|
||||
// missing - mask of the missing values in the training set. This
|
||||
// matrix has the same size as train_data. 1 - missing
|
||||
// value, 0 - not a missing value.
|
||||
// class_labels - output class labels map.
|
||||
// class_labels - output class labels map.
|
||||
// rng - random number generator. Used for spliting the
|
||||
// training set.
|
||||
// class_count - count of output classes.
|
||||
@ -1368,15 +1370,15 @@ public:
|
||||
/*
|
||||
// DataType: ENUM
|
||||
// Loss functions implemented in CvGBTrees.
|
||||
//
|
||||
//
|
||||
// SQUARED_LOSS
|
||||
// problem: regression
|
||||
// loss = (x - x')^2
|
||||
//
|
||||
//
|
||||
// ABSOLUTE_LOSS
|
||||
// problem: regression
|
||||
// loss = abs(x - x')
|
||||
//
|
||||
//
|
||||
// HUBER_LOSS
|
||||
// problem: regression
|
||||
// loss = delta*( abs(x - x') - delta/2), if abs(x - x') > delta
|
||||
@ -1386,18 +1388,18 @@ public:
|
||||
//
|
||||
// DEVIANCE_LOSS
|
||||
// problem: classification
|
||||
//
|
||||
*/
|
||||
//
|
||||
*/
|
||||
enum {SQUARED_LOSS=0, ABSOLUTE_LOSS, HUBER_LOSS=3, DEVIANCE_LOSS};
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
// Default constructor. Creates a model only (without training).
|
||||
// Should be followed by one form of the train(...) function.
|
||||
//
|
||||
// API
|
||||
// CvGBTrees();
|
||||
|
||||
|
||||
// INPUT
|
||||
// OUTPUT
|
||||
// RESULT
|
||||
@ -1415,7 +1417,7 @@ public:
|
||||
const CvMat* sampleIdx=0, const CvMat* varType=0,
|
||||
const CvMat* missingDataMask=0,
|
||||
CvGBTreesParams params=CvGBTreesParams() );
|
||||
|
||||
|
||||
// INPUT
|
||||
// trainData - a set of input feature vectors.
|
||||
// size of matrix is
|
||||
@ -1448,13 +1450,13 @@ public:
|
||||
const CvMat* missingDataMask=0,
|
||||
CvGBTreesParams params=CvGBTreesParams() );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
// Destructor.
|
||||
*/
|
||||
virtual ~CvGBTrees();
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
// Gradient tree boosting model training
|
||||
//
|
||||
@ -1465,7 +1467,7 @@ public:
|
||||
const CvMat* missingDataMask=0,
|
||||
CvGBTreesParams params=CvGBTreesParams(),
|
||||
bool update=false );
|
||||
|
||||
|
||||
// INPUT
|
||||
// trainData - a set of input feature vectors.
|
||||
// size of matrix is
|
||||
@ -1500,8 +1502,8 @@ public:
|
||||
const CvMat* missingDataMask=0,
|
||||
CvGBTreesParams params=CvGBTreesParams(),
|
||||
bool update=false );
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
// Gradient tree boosting model training
|
||||
//
|
||||
@ -1509,7 +1511,7 @@ public:
|
||||
// virtual bool train( CvMLData* data,
|
||||
CvGBTreesParams params=CvGBTreesParams(),
|
||||
bool update=false ) {return false;};
|
||||
|
||||
|
||||
// INPUT
|
||||
// data - training set.
|
||||
// params - parameters of GTB algorithm.
|
||||
@ -1522,7 +1524,7 @@ public:
|
||||
CvGBTreesParams params=CvGBTreesParams(),
|
||||
bool update=false );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
// Response value prediction
|
||||
//
|
||||
@ -1530,7 +1532,7 @@ public:
|
||||
// virtual float predict_serial( const CvMat* sample, const CvMat* missing=0,
|
||||
CvMat* weak_responses=0, CvSlice slice = CV_WHOLE_SEQ,
|
||||
int k=-1 ) const;
|
||||
|
||||
|
||||
// INPUT
|
||||
// sample - input sample of the same type as in the training set.
|
||||
// missing - missing values mask. missing=0 if there are no
|
||||
@ -1541,7 +1543,7 @@ public:
|
||||
// slice = CV_WHOLE_SEQ when all trees are used.
|
||||
// k - number of ensemble used.
|
||||
// k is in {-1,0,1,..,<count of output classes-1>}.
|
||||
// in the case of classification problem
|
||||
// in the case of classification problem
|
||||
// <count of output classes-1> ensembles are built.
|
||||
// If k = -1 ordinary prediction is the result,
|
||||
// otherwise function gives the prediction of the
|
||||
@ -1553,7 +1555,7 @@ public:
|
||||
virtual float predict_serial( const CvMat* sample, const CvMat* missing=0,
|
||||
CvMat* weakResponses=0, CvSlice slice = CV_WHOLE_SEQ,
|
||||
int k=-1 ) const;
|
||||
|
||||
|
||||
/*
|
||||
// Response value prediction.
|
||||
// Parallel version (in the case of TBB existence)
|
||||
@ -1562,7 +1564,7 @@ public:
|
||||
// virtual float predict( const CvMat* sample, const CvMat* missing=0,
|
||||
CvMat* weak_responses=0, CvSlice slice = CV_WHOLE_SEQ,
|
||||
int k=-1 ) const;
|
||||
|
||||
|
||||
// INPUT
|
||||
// sample - input sample of the same type as in the training set.
|
||||
// missing - missing values mask. missing=0 if there are no
|
||||
@ -1573,7 +1575,7 @@ public:
|
||||
// slice = CV_WHOLE_SEQ when all trees are used.
|
||||
// k - number of ensemble used.
|
||||
// k is in {-1,0,1,..,<count of output classes-1>}.
|
||||
// in the case of classification problem
|
||||
// in the case of classification problem
|
||||
// <count of output classes-1> ensembles are built.
|
||||
// If k = -1 ordinary prediction is the result,
|
||||
// otherwise function gives the prediction of the
|
||||
@ -1581,7 +1583,7 @@ public:
|
||||
// OUTPUT
|
||||
// RESULT
|
||||
// Predicted value.
|
||||
*/
|
||||
*/
|
||||
virtual float predict( const CvMat* sample, const CvMat* missing=0,
|
||||
CvMat* weakResponses=0, CvSlice slice = CV_WHOLE_SEQ,
|
||||
int k=-1 ) const;
|
||||
@ -1591,7 +1593,7 @@ public:
|
||||
//
|
||||
// API
|
||||
// virtual void clear();
|
||||
|
||||
|
||||
// INPUT
|
||||
// OUTPUT
|
||||
// delete data, weak, orig_response, sum_response,
|
||||
@ -1622,7 +1624,7 @@ public:
|
||||
std::vector<float> *resp = 0 );
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Write parameters of the gtb model and data. Write learned model.
|
||||
//
|
||||
// API
|
||||
@ -1638,7 +1640,7 @@ public:
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Read parameters of the gtb model and data. Read learned model.
|
||||
//
|
||||
// API
|
||||
@ -1652,14 +1654,14 @@ public:
|
||||
*/
|
||||
virtual void read( CvFileStorage* fs, CvFileNode* node );
|
||||
|
||||
|
||||
|
||||
// new-style C++ interface
|
||||
CV_WRAP CvGBTrees( const cv::Mat& trainData, int tflag,
|
||||
const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(),
|
||||
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
|
||||
const cv::Mat& missingDataMask=cv::Mat(),
|
||||
CvGBTreesParams params=CvGBTreesParams() );
|
||||
|
||||
|
||||
CV_WRAP virtual bool train( const cv::Mat& trainData, int tflag,
|
||||
const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(),
|
||||
const cv::Mat& sampleIdx=cv::Mat(), const cv::Mat& varType=cv::Mat(),
|
||||
@ -1670,7 +1672,7 @@ public:
|
||||
CV_WRAP virtual float predict( const cv::Mat& sample, const cv::Mat& missing=cv::Mat(),
|
||||
const cv::Range& slice = cv::Range::all(),
|
||||
int k=-1 ) const;
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
/*
|
||||
@ -1678,7 +1680,7 @@ protected:
|
||||
//
|
||||
// API
|
||||
// virtual void find_gradient( const int k = 0);
|
||||
|
||||
|
||||
// INPUT
|
||||
// k - used for classification problem, determining current
|
||||
// tree ensemble.
|
||||
@ -1690,9 +1692,9 @@ protected:
|
||||
*/
|
||||
virtual void find_gradient( const int k = 0);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Change values in tree leaves according to the used loss function.
|
||||
//
|
||||
// API
|
||||
@ -1711,7 +1713,7 @@ protected:
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Find optimal constant prediction value according to the used loss
|
||||
// function.
|
||||
// The goal is to find a constant which gives the minimal summary loss
|
||||
@ -1728,9 +1730,9 @@ protected:
|
||||
*/
|
||||
virtual float find_optimal_value( const CvMat* _Idx );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Randomly split the whole training set in two parts according
|
||||
// to params.portion.
|
||||
//
|
||||
@ -1747,7 +1749,7 @@ protected:
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Internal recursive function giving an array of subtree tree leaves.
|
||||
//
|
||||
// API
|
||||
@ -1761,10 +1763,10 @@ protected:
|
||||
// RESULT
|
||||
*/
|
||||
void leaves_get( CvDTreeNode** leaves, int& count, CvDTreeNode* node );
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Get leaves of the tree.
|
||||
//
|
||||
// API
|
||||
@ -1779,9 +1781,9 @@ protected:
|
||||
*/
|
||||
CvDTreeNode** GetLeaves( const CvDTree* dtree, int& len );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Is it a regression or a classification.
|
||||
//
|
||||
// API
|
||||
@ -1797,7 +1799,7 @@ protected:
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Write parameters of the gtb model.
|
||||
//
|
||||
// API
|
||||
@ -1812,7 +1814,7 @@ protected:
|
||||
|
||||
|
||||
/*
|
||||
//
|
||||
//
|
||||
// Read parameters of the gtb model and data.
|
||||
//
|
||||
// API
|
||||
@ -1829,9 +1831,9 @@ protected:
|
||||
// RESULT
|
||||
*/
|
||||
virtual void read_params( CvFileStorage* fs, CvFileNode* fnode );
|
||||
int get_len(const CvMat* mat) const;
|
||||
int get_len(const CvMat* mat) const;
|
||||
|
||||
|
||||
|
||||
CvDTreeTrainData* data;
|
||||
CvGBTreesParams params;
|
||||
|
||||
@ -1894,30 +1896,30 @@ public:
|
||||
virtual void create( const CvMat* layerSizes,
|
||||
int activateFunc=CvANN_MLP::SIGMOID_SYM,
|
||||
double fparam1=0, double fparam2=0 );
|
||||
|
||||
|
||||
virtual int train( const CvMat* inputs, const CvMat* outputs,
|
||||
const CvMat* sampleWeights, const CvMat* sampleIdx=0,
|
||||
CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
|
||||
int flags=0 );
|
||||
virtual float predict( const CvMat* inputs, CV_OUT CvMat* outputs ) const;
|
||||
|
||||
|
||||
#ifndef SWIG
|
||||
CV_WRAP CvANN_MLP( const cv::Mat& layerSizes,
|
||||
int activateFunc=CvANN_MLP::SIGMOID_SYM,
|
||||
double fparam1=0, double fparam2=0 );
|
||||
|
||||
|
||||
CV_WRAP virtual void create( const cv::Mat& layerSizes,
|
||||
int activateFunc=CvANN_MLP::SIGMOID_SYM,
|
||||
double fparam1=0, double fparam2=0 );
|
||||
|
||||
double fparam1=0, double fparam2=0 );
|
||||
|
||||
CV_WRAP virtual int train( const cv::Mat& inputs, const cv::Mat& outputs,
|
||||
const cv::Mat& sampleWeights, const cv::Mat& sampleIdx=cv::Mat(),
|
||||
CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
|
||||
int flags=0 );
|
||||
|
||||
int flags=0 );
|
||||
|
||||
CV_WRAP virtual float predict( const cv::Mat& inputs, CV_OUT cv::Mat& outputs ) const;
|
||||
#endif
|
||||
|
||||
|
||||
CV_WRAP virtual void clear();
|
||||
|
||||
// possible activation functions
|
||||
@ -2031,7 +2033,7 @@ public:
|
||||
virtual ~CvMLData();
|
||||
|
||||
// returns:
|
||||
// 0 - OK
|
||||
// 0 - OK
|
||||
// -1 - file can not be opened or is not correct
|
||||
int read_csv( const char* filename );
|
||||
|
||||
@ -2039,8 +2041,8 @@ public:
|
||||
const CvMat* get_responses();
|
||||
const CvMat* get_missing() const;
|
||||
|
||||
void set_header_lines_number( int n );
|
||||
int get_header_lines_number() const;
|
||||
void set_header_lines_number( int n );
|
||||
int get_header_lines_number() const;
|
||||
|
||||
void set_response_idx( int idx ); // old response become predictors, new response_idx = idx
|
||||
// if idx < 0 there will be no response
|
||||
@ -2050,7 +2052,7 @@ public:
|
||||
const CvMat* get_train_sample_idx() const;
|
||||
const CvMat* get_test_sample_idx() const;
|
||||
void mix_train_and_test_idx();
|
||||
|
||||
|
||||
const CvMat* get_var_idx();
|
||||
void chahge_var_idx( int vi, bool state ); // misspelled (saved for back compitability),
|
||||
// use change_var_idx
|
||||
@ -2064,14 +2066,14 @@ public:
|
||||
void set_var_types( const char* str ); // str examples:
|
||||
// "ord[0-17],cat[18]", "ord[0,2,4,10-12], cat[1,3,5-9,13,14]",
|
||||
// "cat", "ord" (all vars are categorical/ordered)
|
||||
void change_var_type( int var_idx, int type); // type in { CV_VAR_ORDERED, CV_VAR_CATEGORICAL }
|
||||
|
||||
void change_var_type( int var_idx, int type); // type in { CV_VAR_ORDERED, CV_VAR_CATEGORICAL }
|
||||
|
||||
void set_delimiter( char ch );
|
||||
char get_delimiter() const;
|
||||
|
||||
void set_miss_ch( char ch );
|
||||
char get_miss_ch() const;
|
||||
|
||||
|
||||
const std::map<std::string, int>& get_class_labels_map() const;
|
||||
|
||||
protected:
|
||||
@ -2079,7 +2081,7 @@ protected:
|
||||
|
||||
void str_to_flt_elem( const char* token, float& flt_elem, int& type);
|
||||
void free_train_test_idx();
|
||||
|
||||
|
||||
char delimiter;
|
||||
char miss_ch;
|
||||
//char flt_separator;
|
||||
@ -2093,13 +2095,13 @@ protected:
|
||||
CvMat* var_idx_out; // mat
|
||||
CvMat* var_types_out; // mat
|
||||
|
||||
int header_lines_number;
|
||||
int header_lines_number;
|
||||
|
||||
int response_idx;
|
||||
|
||||
int train_sample_count;
|
||||
bool mix;
|
||||
|
||||
|
||||
int total_class_count;
|
||||
std::map<std::string, int> class_map;
|
||||
|
||||
@ -2113,7 +2115,7 @@ protected:
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
typedef CvStatModel StatModel;
|
||||
typedef CvParamGrid ParamGrid;
|
||||
typedef CvNormalBayesClassifier NormalBayesClassifier;
|
||||
@ -2142,7 +2144,7 @@ typedef CvGBTrees GradientBoostingTrees;
|
||||
template<> CV_EXPORTS void Ptr<CvDTreeSplit>::delete_obj();
|
||||
|
||||
CV_EXPORTS bool initModule_ml(void);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __cplusplus
|
||||
|
@ -504,7 +504,7 @@ void CvANN_MLP::calc_activ_func_deriv( CvMat* _xf, CvMat* _df,
|
||||
|
||||
n *= cols;
|
||||
xf -= n; df -= n;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
df[i] *= xf[i];
|
||||
}
|
||||
@ -517,7 +517,7 @@ void CvANN_MLP::calc_activ_func_deriv( CvMat* _xf, CvMat* _df,
|
||||
xf[j] = (xf[j] + bias[j])*scale;
|
||||
df[j] = -fabs(xf[j]);
|
||||
}
|
||||
|
||||
|
||||
cvExp( _df, _df );
|
||||
|
||||
n *= cols;
|
||||
@ -1023,9 +1023,9 @@ int CvANN_MLP::train_backprop( CvVectors x0, CvVectors u, const double* sw )
|
||||
}
|
||||
|
||||
struct rprop_loop {
|
||||
rprop_loop(const CvANN_MLP* _point, double**& _weights, int& _count, int& _ivcount, CvVectors* _x0,
|
||||
rprop_loop(const CvANN_MLP* _point, double**& _weights, int& _count, int& _ivcount, CvVectors* _x0,
|
||||
int& _l_count, CvMat*& _layer_sizes, int& _ovcount, int& _max_count,
|
||||
CvVectors* _u, const double*& _sw, double& _inv_count, CvMat*& _dEdw, int& _dcount0, double* _E, int _buf_sz)
|
||||
CvVectors* _u, const double*& _sw, double& _inv_count, CvMat*& _dEdw, int& _dcount0, double* _E, int _buf_sz)
|
||||
{
|
||||
point = _point;
|
||||
weights = _weights;
|
||||
@ -1044,7 +1044,7 @@ struct rprop_loop {
|
||||
E = _E;
|
||||
buf_sz = _buf_sz;
|
||||
}
|
||||
|
||||
|
||||
const CvANN_MLP* point;
|
||||
double** weights;
|
||||
int count;
|
||||
@ -1062,14 +1062,14 @@ struct rprop_loop {
|
||||
double* E;
|
||||
int buf_sz;
|
||||
|
||||
|
||||
|
||||
void operator()( const cv::BlockedRange& range ) const
|
||||
{
|
||||
double* buf_ptr;
|
||||
double** x = 0;
|
||||
double **df = 0;
|
||||
double **df = 0;
|
||||
int total = 0;
|
||||
|
||||
|
||||
for(int i = 0; i < l_count; i++ )
|
||||
total += layer_sizes->data.i[i];
|
||||
CvMat* buf;
|
||||
@ -1087,7 +1087,7 @@ struct rprop_loop {
|
||||
for(int si = range.begin(); si < range.end(); si++ )
|
||||
{
|
||||
if (si % dcount0 != 0) continue;
|
||||
int n1, n2, j, k;
|
||||
int n1, n2, k;
|
||||
double* w;
|
||||
CvMat _w, _dEdw, hdr1, hdr2, ghdr1, ghdr2, _df;
|
||||
CvMat *x1, *x2, *grad1, *grad2, *temp;
|
||||
@ -1100,23 +1100,23 @@ struct rprop_loop {
|
||||
|
||||
// grab and preprocess input data
|
||||
if( x0->type == CV_32F )
|
||||
{
|
||||
{
|
||||
for(int i = 0; i < dcount; i++ )
|
||||
{
|
||||
const float* x0data = x0->data.fl[si+i];
|
||||
double* xdata = x[0]+i*ivcount;
|
||||
for( j = 0; j < ivcount; j++ )
|
||||
for(int j = 0; j < ivcount; j++ )
|
||||
xdata[j] = x0data[j]*w[j*2] + w[j*2+1];
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
for(int i = 0; i < dcount; i++ )
|
||||
{
|
||||
const double* x0data = x0->data.db[si+i];
|
||||
double* xdata = x[0]+i*ivcount;
|
||||
for( j = 0; j < ivcount; j++ )
|
||||
for(int j = 0; j < ivcount; j++ )
|
||||
xdata[j] = x0data[j]*w[j*2] + w[j*2+1];
|
||||
}
|
||||
}
|
||||
cvInitMatHeader( x1, dcount, ivcount, CV_64F, x[0] );
|
||||
|
||||
// forward pass, compute y[i]=w*x[i-1], x[i]=f(y[i]), df[i]=f'(y[i])
|
||||
@ -1144,7 +1144,7 @@ struct rprop_loop {
|
||||
double* gdata = grad1->data.db + i*ovcount;
|
||||
double sweight = sw ? sw[si+i] : inv_count, E1 = 0;
|
||||
|
||||
for( j = 0; j < ovcount; j++ )
|
||||
for(int j = 0; j < ovcount; j++ )
|
||||
{
|
||||
double t = udata[j]*w[j*2] + w[j*2+1] - xdata[j];
|
||||
gdata[j] = t*sweight;
|
||||
@ -1168,7 +1168,7 @@ struct rprop_loop {
|
||||
}
|
||||
*E += sweight*E1;
|
||||
}
|
||||
|
||||
|
||||
// backward pass, update dEdw
|
||||
#ifdef HAVE_TBB
|
||||
static tbb::spin_mutex mutex;
|
||||
@ -1191,10 +1191,10 @@ struct rprop_loop {
|
||||
{
|
||||
double* dst = _dEdw.data.db + n1*n2;
|
||||
const double* src = grad1->data.db + k*n2;
|
||||
for( j = 0; j < n2; j++ )
|
||||
for(int j = 0; j < n2; j++ )
|
||||
dst[j] += src[j];
|
||||
}
|
||||
|
||||
|
||||
if (i > 1)
|
||||
cvInitMatHeader( &_w, n1, n2, CV_64F, weights[i] );
|
||||
#ifdef HAVE_TBB
|
||||
@ -1215,7 +1215,7 @@ struct rprop_loop {
|
||||
|
||||
int CvANN_MLP::train_rprop( CvVectors x0, CvVectors u, const double* sw )
|
||||
{
|
||||
const int max_buf_sz = 1 << 16;
|
||||
const int max_buf_size = 1 << 16;
|
||||
CvMat* dw = 0;
|
||||
CvMat* dEdw = 0;
|
||||
CvMat* prev_dEdw_sign = 0;
|
||||
@ -1256,7 +1256,7 @@ int CvANN_MLP::train_rprop( CvVectors x0, CvVectors u, const double* sw )
|
||||
cvZero( prev_dEdw_sign );
|
||||
|
||||
inv_count = 1./count;
|
||||
dcount0 = max_buf_sz/(2*total);
|
||||
dcount0 = max_buf_size/(2*total);
|
||||
dcount0 = MAX( dcount0, 1 );
|
||||
dcount0 = MIN( dcount0, count );
|
||||
buf_sz = dcount0*(total + max_count)*2;
|
||||
@ -1297,8 +1297,8 @@ int CvANN_MLP::train_rprop( CvVectors x0, CvVectors u, const double* sw )
|
||||
double E = 0;
|
||||
|
||||
// first, iterate through all the samples and compute dEdw
|
||||
cv::parallel_for(cv::BlockedRange(0, count),
|
||||
rprop_loop(this, weights, count, ivcount, &x0, l_count, layer_sizes,
|
||||
cv::parallel_for(cv::BlockedRange(0, count),
|
||||
rprop_loop(this, weights, count, ivcount, &x0, l_count, layer_sizes,
|
||||
ovcount, max_count, &u, sw, inv_count, dEdw, dcount0, &E, buf_sz)
|
||||
);
|
||||
|
||||
@ -1600,8 +1600,8 @@ CvANN_MLP::CvANN_MLP( const Mat& _layer_sizes, int _activ_func,
|
||||
void CvANN_MLP::create( const Mat& _layer_sizes, int _activ_func,
|
||||
double _f_param1, double _f_param2 )
|
||||
{
|
||||
CvMat layer_sizes = _layer_sizes;
|
||||
create( &layer_sizes, _activ_func, _f_param1, _f_param2 );
|
||||
CvMat cvlayer_sizes = _layer_sizes;
|
||||
create( &cvlayer_sizes, _activ_func, _f_param1, _f_param2 );
|
||||
}
|
||||
|
||||
int CvANN_MLP::train( const Mat& _inputs, const Mat& _outputs,
|
||||
@ -1610,7 +1610,7 @@ int CvANN_MLP::train( const Mat& _inputs, const Mat& _outputs,
|
||||
{
|
||||
CvMat inputs = _inputs, outputs = _outputs, sweights = _sample_weights, sidx = _sample_idx;
|
||||
return train(&inputs, &outputs, sweights.data.ptr ? &sweights : 0,
|
||||
sidx.data.ptr ? &sidx : 0, _params, flags);
|
||||
sidx.data.ptr ? &sidx : 0, _params, flags);
|
||||
}
|
||||
|
||||
float CvANN_MLP::predict( const Mat& _inputs, Mat& _outputs ) const
|
||||
@ -1618,8 +1618,8 @@ float CvANN_MLP::predict( const Mat& _inputs, Mat& _outputs ) const
|
||||
CV_Assert(layer_sizes != 0);
|
||||
_outputs.create(_inputs.rows, layer_sizes->data.i[layer_sizes->cols-1], _inputs.type());
|
||||
CvMat inputs = _inputs, outputs = _outputs;
|
||||
|
||||
return predict(&inputs, &outputs);
|
||||
|
||||
return predict(&inputs, &outputs);
|
||||
}
|
||||
|
||||
/* End of file. */
|
||||
|
@ -129,7 +129,7 @@ CvBoostTree::train( CvDTreeTrainData*, const CvMat* )
|
||||
|
||||
|
||||
void
|
||||
CvBoostTree::scale( double scale )
|
||||
CvBoostTree::scale( double _scale )
|
||||
{
|
||||
CvDTreeNode* node = root;
|
||||
|
||||
@ -139,7 +139,7 @@ CvBoostTree::scale( double scale )
|
||||
CvDTreeNode* parent;
|
||||
for(;;)
|
||||
{
|
||||
node->value *= scale;
|
||||
node->value *= _scale;
|
||||
if( !node->left )
|
||||
break;
|
||||
node = node->left;
|
||||
@ -501,7 +501,7 @@ CvBoostTree::find_split_ord_reg( CvDTreeNode* node, int vi, float init_quality,
|
||||
int i, best_i = -1;
|
||||
double L = 0, R = weights[n];
|
||||
double best_val = init_quality, lsum = 0, rsum = node->value*R;
|
||||
|
||||
|
||||
// compensate for missing values
|
||||
for( i = n1; i < n; i++ )
|
||||
{
|
||||
@ -590,7 +590,7 @@ CvBoostTree::find_split_cat_reg( CvDTreeNode* node, int vi, float init_quality,
|
||||
{
|
||||
R += counts[i];
|
||||
rsum += sum[i];
|
||||
sum[i] = fabs(counts[i]) > DBL_EPSILON ? sum[i]/counts[i] : 0;
|
||||
sum[i] = fabs(counts[i]) > DBL_EPSILON ? sum[i]/counts[i] : 0;
|
||||
sum_ptr[i] = sum + i;
|
||||
}
|
||||
|
||||
@ -1030,7 +1030,7 @@ CvBoost::train( const CvMat* _train_data, int _tflag,
|
||||
__BEGIN__;
|
||||
|
||||
int i;
|
||||
|
||||
|
||||
set_params( _params );
|
||||
|
||||
cvReleaseMat( &active_vars );
|
||||
@ -1057,7 +1057,7 @@ CvBoost::train( const CvMat* _train_data, int _tflag,
|
||||
|
||||
if ( (_params.boost_type == LOGIT) || (_params.boost_type == GENTLE) )
|
||||
data->do_responses_copy();
|
||||
|
||||
|
||||
update_weights( 0 );
|
||||
|
||||
for( i = 0; i < params.weak_count; i++ )
|
||||
@ -1088,7 +1088,7 @@ CvBoost::train( const CvMat* _train_data, int _tflag,
|
||||
}
|
||||
|
||||
bool CvBoost::train( CvMLData* _data,
|
||||
CvBoostParams params,
|
||||
CvBoostParams _params,
|
||||
bool update )
|
||||
{
|
||||
bool result = false;
|
||||
@ -1105,7 +1105,7 @@ bool CvBoost::train( CvMLData* _data,
|
||||
const CvMat* var_idx = _data->get_var_idx();
|
||||
|
||||
CV_CALL( result = train( values, CV_ROW_SAMPLE, response, var_idx,
|
||||
train_sidx, var_types, missing, params, update ) );
|
||||
train_sidx, var_types, missing, _params, update ) );
|
||||
|
||||
__END__;
|
||||
|
||||
@ -1258,7 +1258,7 @@ CvBoost::update_weights( CvBoostTree* tree )
|
||||
// invert the subsample mask
|
||||
cvXorS( subsample_mask, cvScalar(1.), subsample_mask );
|
||||
data->get_vectors( subsample_mask, values, missing, 0 );
|
||||
|
||||
|
||||
_sample = cvMat( 1, data->var_count, CV_32F );
|
||||
_mask = cvMat( 1, data->var_count, CV_8U );
|
||||
|
||||
@ -1458,17 +1458,17 @@ CvBoost::trim_weights()
|
||||
}
|
||||
|
||||
|
||||
const CvMat*
|
||||
const CvMat*
|
||||
CvBoost::get_active_vars( bool absolute_idx )
|
||||
{
|
||||
CvMat* mask = 0;
|
||||
CvMat* inv_map = 0;
|
||||
CvMat* result = 0;
|
||||
|
||||
|
||||
CV_FUNCNAME( "CvBoost::get_active_vars" );
|
||||
|
||||
__BEGIN__;
|
||||
|
||||
|
||||
if( !weak )
|
||||
CV_ERROR( CV_StsError, "The boosted tree ensemble has not been trained yet" );
|
||||
|
||||
@ -1478,7 +1478,7 @@ CvBoost::get_active_vars( bool absolute_idx )
|
||||
int i, j, nactive_vars;
|
||||
CvBoostTree* wtree;
|
||||
const CvDTreeNode* node;
|
||||
|
||||
|
||||
assert(!active_vars && !active_vars_abs);
|
||||
mask = cvCreateMat( 1, data->var_count, CV_8U );
|
||||
inv_map = cvCreateMat( 1, data->var_count, CV_32S );
|
||||
@ -1518,7 +1518,7 @@ CvBoost::get_active_vars( bool absolute_idx )
|
||||
}
|
||||
|
||||
nactive_vars = cvCountNonZero(mask);
|
||||
|
||||
|
||||
//if ( nactive_vars > 0 )
|
||||
{
|
||||
active_vars = cvCreateMat( 1, nactive_vars, CV_32S );
|
||||
@ -1538,7 +1538,7 @@ CvBoost::get_active_vars( bool absolute_idx )
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// second pass: now compute the condensed indices
|
||||
cvStartReadSeq( weak, &reader );
|
||||
@ -1638,7 +1638,7 @@ CvBoost::predict( const CvMat* _sample, const CvMat* _missing,
|
||||
"floating-point vector of the same number of components as the length of input slice" );
|
||||
wstep = CV_IS_MAT_CONT(weak_responses->type) ? 1 : weak_responses->step/sizeof(float);
|
||||
}
|
||||
|
||||
|
||||
int var_count = active_vars->cols;
|
||||
const int* vtype = data->var_type->data.i;
|
||||
const int* cmap = data->cat_map->data.i;
|
||||
@ -1738,7 +1738,7 @@ CvBoost::predict( const CvMat* _sample, const CvMat* _missing,
|
||||
CvBoostTree* wtree;
|
||||
const CvDTreeNode* node;
|
||||
CV_READ_SEQ_ELEM( wtree, reader );
|
||||
|
||||
|
||||
node = wtree->get_root();
|
||||
while( node->left )
|
||||
{
|
||||
@ -1757,14 +1757,14 @@ CvBoost::predict( const CvMat* _sample, const CvMat* _missing,
|
||||
{
|
||||
const int* avars = active_vars->data.i;
|
||||
const uchar* m = _missing ? _missing->data.ptr : 0;
|
||||
|
||||
|
||||
// full-featured version
|
||||
for( i = 0; i < weak_count; i++ )
|
||||
{
|
||||
CvBoostTree* wtree;
|
||||
const CvDTreeNode* node;
|
||||
CV_READ_SEQ_ELEM( wtree, reader );
|
||||
|
||||
|
||||
node = wtree->get_root();
|
||||
while( node->left )
|
||||
{
|
||||
@ -1841,9 +1841,9 @@ float CvBoost::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
|
||||
{
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 );
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
@ -1859,15 +1859,15 @@ float CvBoost::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 );
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
float d = r - response->data.fl[si*r_step];
|
||||
err += d*d;
|
||||
}
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -2097,10 +2097,10 @@ CvBoost::CvBoost( const Mat& _train_data, int _tflag,
|
||||
default_model_name = "my_boost_tree";
|
||||
active_vars = active_vars_abs = orig_response = sum_response = weak_eval =
|
||||
subsample_mask = weights = subtree_weights = 0;
|
||||
|
||||
|
||||
train( _train_data, _tflag, _responses, _var_idx, _sample_idx,
|
||||
_var_type, _missing_mask, _params );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
@ -2130,7 +2130,7 @@ CvBoost::predict( const Mat& _sample, const Mat& _missing,
|
||||
weak_count = weak->total;
|
||||
slice.start_index = 0;
|
||||
}
|
||||
|
||||
|
||||
if( !(weak_responses->data && weak_responses->type() == CV_32FC1 &&
|
||||
(weak_responses->cols == 1 || weak_responses->rows == 1) &&
|
||||
weak_responses->cols + weak_responses->rows - 1 == weak_count) )
|
||||
|
@ -71,7 +71,7 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
CV_FUNCNAME( "CvERTreeTrainData::set_data" );
|
||||
|
||||
__BEGIN__;
|
||||
|
||||
|
||||
int sample_all = 0, r_type, cv_n;
|
||||
int total_c_count = 0;
|
||||
int tree_block_size, temp_block_size, max_split_size, nv_size, cv_size = 0;
|
||||
@ -79,10 +79,10 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
int vi, i, size;
|
||||
char err[100];
|
||||
const int *sidx = 0, *vidx = 0;
|
||||
|
||||
|
||||
if ( _params.use_surrogates )
|
||||
CV_ERROR(CV_StsBadArg, "CvERTrees do not support surrogate splits");
|
||||
|
||||
|
||||
if( _update_data && data_root )
|
||||
{
|
||||
CV_ERROR(CV_StsBadArg, "CvERTrees do not support data update");
|
||||
@ -143,17 +143,17 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
CV_ERROR( CV_StsBadArg, "The array of _responses must be an integer or "
|
||||
"floating-point vector containing as many elements as "
|
||||
"the total number of samples in the training data matrix" );
|
||||
|
||||
|
||||
is_buf_16u = false;
|
||||
if ( sample_count < 65536 )
|
||||
is_buf_16u = true;
|
||||
|
||||
if ( sample_count < 65536 )
|
||||
is_buf_16u = true;
|
||||
|
||||
r_type = CV_VAR_CATEGORICAL;
|
||||
if( _var_type )
|
||||
CV_CALL( var_type0 = cvPreprocessVarType( _var_type, var_idx, var_count, &r_type ));
|
||||
|
||||
CV_CALL( var_type = cvCreateMat( 1, var_count+2, CV_32SC1 ));
|
||||
|
||||
|
||||
cat_var_count = 0;
|
||||
ord_var_count = -1;
|
||||
|
||||
@ -182,7 +182,7 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
buf_size = (work_var_count + 1)*sample_count;
|
||||
shared = _shared;
|
||||
buf_count = shared ? 2 : 1;
|
||||
|
||||
|
||||
if ( is_buf_16u )
|
||||
{
|
||||
CV_CALL( buf = cvCreateMat( buf_count, buf_size, CV_16UC1 ));
|
||||
@ -192,13 +192,13 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
CV_CALL( buf = cvCreateMat( buf_count, buf_size, CV_32SC1 ));
|
||||
CV_CALL( int_ptr = (int**)cvAlloc( sample_count*sizeof(int_ptr[0]) ));
|
||||
}
|
||||
}
|
||||
|
||||
size = is_classifier ? cat_var_count+1 : cat_var_count;
|
||||
size = !size ? 1 : size;
|
||||
CV_CALL( cat_count = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
CV_CALL( cat_ofs = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
|
||||
|
||||
size = is_classifier ? (cat_var_count + 1)*params.max_categories : cat_var_count*params.max_categories;
|
||||
size = !size ? 1 : size;
|
||||
CV_CALL( cat_map = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
@ -283,12 +283,12 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
int c_count, prev_label;
|
||||
int* c_map;
|
||||
|
||||
|
||||
if (is_buf_16u)
|
||||
udst = (unsigned short*)(buf->data.s + ci*sample_count);
|
||||
else
|
||||
idst = buf->data.i + ci*sample_count;
|
||||
|
||||
|
||||
// copy data
|
||||
for( i = 0; i < sample_count; i++ )
|
||||
{
|
||||
@ -322,7 +322,7 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
_idst[i] = val;
|
||||
pair16u32s_ptr[i].u = udst + i;
|
||||
pair16u32s_ptr[i].i = _idst + i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
idst[i] = val;
|
||||
@ -397,7 +397,7 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
// replace labels for missing values with -1
|
||||
for( ; i < sample_count; i++ )
|
||||
*int_ptr[i] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( ci < 0 ) // process ordered variable
|
||||
{
|
||||
@ -442,15 +442,15 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
|
||||
if( cv_n )
|
||||
{
|
||||
unsigned short* udst = 0;
|
||||
int* idst = 0;
|
||||
unsigned short* usdst = 0;
|
||||
int* idst2 = 0;
|
||||
|
||||
if (is_buf_16u)
|
||||
{
|
||||
udst = (unsigned short*)(buf->data.s + (get_work_var_count()-1)*sample_count);
|
||||
usdst = (unsigned short*)(buf->data.s + (get_work_var_count()-1)*sample_count);
|
||||
for( i = vi = 0; i < sample_count; i++ )
|
||||
{
|
||||
udst[i] = (unsigned short)vi++;
|
||||
usdst[i] = (unsigned short)vi++;
|
||||
vi &= vi < cv_n ? -1 : 0;
|
||||
}
|
||||
|
||||
@ -459,15 +459,15 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
int a = (*rng)(sample_count);
|
||||
int b = (*rng)(sample_count);
|
||||
unsigned short unsh = (unsigned short)vi;
|
||||
CV_SWAP( udst[a], udst[b], unsh );
|
||||
CV_SWAP( usdst[a], usdst[b], unsh );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
idst = buf->data.i + (get_work_var_count()-1)*sample_count;
|
||||
idst2 = buf->data.i + (get_work_var_count()-1)*sample_count;
|
||||
for( i = vi = 0; i < sample_count; i++ )
|
||||
{
|
||||
idst[i] = vi++;
|
||||
idst2[i] = vi++;
|
||||
vi &= vi < cv_n ? -1 : 0;
|
||||
}
|
||||
|
||||
@ -475,12 +475,12 @@ void CvERTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
int a = (*rng)(sample_count);
|
||||
int b = (*rng)(sample_count);
|
||||
CV_SWAP( idst[a], idst[b], vi );
|
||||
CV_SWAP( idst2[a], idst2[b], vi );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( cat_map )
|
||||
if ( cat_map )
|
||||
cat_map->cols = MAX( total_c_count, 1 );
|
||||
|
||||
max_split_size = cvAlign(sizeof(CvDTreeSplit) +
|
||||
@ -532,7 +532,7 @@ void CvERTreeTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord_val
|
||||
const float** ord_values, const int** missing, int* sample_indices_buf )
|
||||
{
|
||||
int vidx = var_idx ? var_idx->data.i[vi] : vi;
|
||||
int node_sample_count = n->sample_count;
|
||||
int node_sample_count = n->sample_count;
|
||||
// may use missing_buf as buffer for sample indices!
|
||||
const int* sample_indices = get_sample_indices(n, sample_indices_buf ? sample_indices_buf : missing_buf);
|
||||
|
||||
@ -580,7 +580,7 @@ const int* CvERTreeTrainData::get_cat_var_data( CvDTreeNode* n, int vi, int* cat
|
||||
if( !is_buf_16u )
|
||||
cat_values = buf->data.i + n->buf_idx*buf->cols + ci*sample_count + n->offset;
|
||||
else {
|
||||
const unsigned short* short_values = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
const unsigned short* short_values = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
ci*sample_count + n->offset);
|
||||
for( int i = 0; i < n->sample_count; i++ )
|
||||
cat_values_buf[i] = short_values[i];
|
||||
@ -591,7 +591,7 @@ const int* CvERTreeTrainData::get_cat_var_data( CvDTreeNode* n, int vi, int* cat
|
||||
|
||||
void CvERTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
float* values, uchar* missing,
|
||||
float* responses, bool get_class_idx )
|
||||
float* _responses, bool get_class_idx )
|
||||
{
|
||||
CvMat* subsample_idx = 0;
|
||||
CvMat* subsample_co = 0;
|
||||
@ -664,7 +664,7 @@ void CvERTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
}
|
||||
|
||||
// copy responses
|
||||
if( responses )
|
||||
if( _responses )
|
||||
{
|
||||
if( is_classifier )
|
||||
{
|
||||
@ -675,10 +675,10 @@ void CvERTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
int idx = sidx ? sidx[i] : i;
|
||||
int val = get_class_idx ? src[idx] :
|
||||
cat_map->data.i[cat_ofs->data.i[cat_var_count]+src[idx]];
|
||||
responses[i] = (float)val;
|
||||
_responses[i] = (float)val;
|
||||
}
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
float* _values_buf = (float*)(uchar*)inn_buf;
|
||||
int* sample_idx_buf = (int*)(_values_buf + sample_count);
|
||||
@ -686,7 +686,7 @@ void CvERTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
for( i = 0; i < count; i++ )
|
||||
{
|
||||
int idx = sidx ? sidx[i] : i;
|
||||
responses[i] = _values[idx];
|
||||
_responses[i] = _values[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -700,7 +700,7 @@ void CvERTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
CvDTreeNode* CvERTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
{
|
||||
CvDTreeNode* root = 0;
|
||||
|
||||
|
||||
CV_FUNCNAME( "CvERTreeTrainData::subsample_data" );
|
||||
|
||||
__BEGIN__;
|
||||
@ -853,7 +853,7 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
const float epsilon = FLT_EPSILON*2;
|
||||
const float split_delta = (1 + FLT_EPSILON) * FLT_EPSILON;
|
||||
|
||||
int n = node->sample_count, i;
|
||||
int n = node->sample_count;
|
||||
int m = data->get_num_classes();
|
||||
|
||||
cv::AutoBuffer<uchar> inn_buf;
|
||||
@ -882,8 +882,8 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
for (; smpi < n; smpi++)
|
||||
{
|
||||
float ptemp = values[smpi];
|
||||
int m = missing[smpi];
|
||||
if (m) continue;
|
||||
int ms = missing[smpi];
|
||||
if (ms) continue;
|
||||
if ( ptemp < pmin)
|
||||
pmin = ptemp;
|
||||
if ( ptemp > pmax)
|
||||
@ -898,7 +898,7 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
if (split_val - pmin <= FLT_EPSILON)
|
||||
split_val = pmin + split_delta;
|
||||
if (pmax - split_val <= FLT_EPSILON)
|
||||
split_val = pmax - split_delta;
|
||||
split_val = pmax - split_delta;
|
||||
|
||||
// calculate Gini index
|
||||
if ( !priors )
|
||||
@ -906,9 +906,9 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
cv::AutoBuffer<int> lrc(m*2);
|
||||
int *lc = lrc, *rc = lc + m;
|
||||
int L = 0, R = 0;
|
||||
|
||||
|
||||
// init arrays of class instance counters on both sides of the split
|
||||
for( i = 0; i < m; i++ )
|
||||
for(int i = 0; i < m; i++ )
|
||||
{
|
||||
lc[i] = 0;
|
||||
rc[i] = 0;
|
||||
@ -917,8 +917,8 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
{
|
||||
int r = responses[si];
|
||||
float val = values[si];
|
||||
int m = missing[si];
|
||||
if (m) continue;
|
||||
int ms = missing[si];
|
||||
if (ms) continue;
|
||||
if ( val < split_val )
|
||||
{
|
||||
lc[r]++;
|
||||
@ -942,9 +942,9 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
cv::AutoBuffer<double> lrc(m*2);
|
||||
double *lc = lrc, *rc = lc + m;
|
||||
double L = 0, R = 0;
|
||||
|
||||
|
||||
// init arrays of class instance counters on both sides of the split
|
||||
for( i = 0; i < m; i++ )
|
||||
for(int i = 0; i < m; i++ )
|
||||
{
|
||||
lc[i] = 0;
|
||||
rc[i] = 0;
|
||||
@ -953,9 +953,9 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
{
|
||||
int r = responses[si];
|
||||
float val = values[si];
|
||||
int m = missing[si];
|
||||
int ms = missing[si];
|
||||
double p = priors[r];
|
||||
if (m) continue;
|
||||
if (ms) continue;
|
||||
if ( val < split_val )
|
||||
{
|
||||
lc[r] += p;
|
||||
@ -974,7 +974,7 @@ CvDTreeSplit* CvForestERTree::find_split_ord_class( CvDTreeNode* node, int vi, f
|
||||
}
|
||||
best_val = (lbest_val*R + rbest_val*L) / (L*R);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
CvDTreeSplit* split = 0;
|
||||
@ -995,7 +995,7 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
{
|
||||
int ci = data->get_var_type(vi);
|
||||
int n = node->sample_count;
|
||||
int cm = data->get_num_classes();
|
||||
int cm = data->get_num_classes();
|
||||
int vm = data->cat_count->data.i[ci];
|
||||
double best_val = init_quality;
|
||||
CvDTreeSplit *split = 0;
|
||||
@ -1009,8 +1009,8 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
|
||||
const int* labels = data->get_cat_var_data( node, vi, ext_buf );
|
||||
const int* responses = data->get_class_labels( node, ext_buf + n );
|
||||
|
||||
const double* priors = data->have_priors ? data->priors_mult->data.db : 0;
|
||||
|
||||
const double* priors = data->have_priors ? data->priors_mult->data.db : 0;
|
||||
|
||||
// create random class mask
|
||||
cv::AutoBuffer<int> valid_cidx(vm);
|
||||
@ -1078,7 +1078,7 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
if (var_class_mask->data.ptr[mask_class_idx])
|
||||
{
|
||||
lc[r]++;
|
||||
L++;
|
||||
L++;
|
||||
split->subset[var_class_idx >> 5] |= 1 << (var_class_idx & 31);
|
||||
}
|
||||
else
|
||||
@ -1091,7 +1091,7 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
{
|
||||
lbest_val += lc[i]*lc[i];
|
||||
rbest_val += rc[i]*rc[i];
|
||||
}
|
||||
}
|
||||
best_val = (lbest_val*R + rbest_val*L) / ((double)(L*R));
|
||||
}
|
||||
else
|
||||
@ -1113,11 +1113,11 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
continue;
|
||||
double p = priors[si];
|
||||
int mask_class_idx = valid_cidx[var_class_idx];
|
||||
|
||||
|
||||
if (var_class_mask->data.ptr[mask_class_idx])
|
||||
{
|
||||
lc[r]+=(int)p;
|
||||
L+=p;
|
||||
L+=p;
|
||||
split->subset[var_class_idx >> 5] |= 1 << (var_class_idx & 31);
|
||||
}
|
||||
else
|
||||
@ -1136,8 +1136,8 @@ CvDTreeSplit* CvForestERTree::find_split_cat_class( CvDTreeNode* node, int vi, f
|
||||
split->quality = (float)best_val;
|
||||
|
||||
cvReleaseMat(&var_class_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return split;
|
||||
}
|
||||
@ -1193,7 +1193,7 @@ CvDTreeSplit* CvForestERTree::find_split_ord_reg( CvDTreeNode* node, int vi, flo
|
||||
if (split_val - pmin <= FLT_EPSILON)
|
||||
split_val = pmin + split_delta;
|
||||
if (pmax - split_val <= FLT_EPSILON)
|
||||
split_val = pmax - split_delta;
|
||||
split_val = pmax - split_delta;
|
||||
|
||||
for (int si = 0; si < n; si++)
|
||||
{
|
||||
@ -1209,7 +1209,7 @@ CvDTreeSplit* CvForestERTree::find_split_ord_reg( CvDTreeNode* node, int vi, flo
|
||||
else
|
||||
{
|
||||
rsum += r;
|
||||
R++;
|
||||
R++;
|
||||
}
|
||||
}
|
||||
best_val = (lsum*lsum*R + rsum*rsum*L)/((double)L*R);
|
||||
@ -1306,7 +1306,7 @@ CvDTreeSplit* CvForestERTree::find_split_cat_reg( CvDTreeNode* node, int vi, flo
|
||||
if (var_class_mask->data.ptr[mask_class_idx])
|
||||
{
|
||||
lsum += r;
|
||||
L++;
|
||||
L++;
|
||||
split->subset[var_class_idx >> 5] |= 1 << (var_class_idx & 31);
|
||||
}
|
||||
else
|
||||
@ -1320,8 +1320,8 @@ CvDTreeSplit* CvForestERTree::find_split_cat_reg( CvDTreeNode* node, int vi, flo
|
||||
split->quality = (float)best_val;
|
||||
|
||||
cvReleaseMat(&var_class_mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return split;
|
||||
}
|
||||
@ -1358,7 +1358,7 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
{
|
||||
int ci = data->get_var_type(vi);
|
||||
if (ci >= 0) continue;
|
||||
|
||||
|
||||
int n1 = node->get_num_valid(vi), nr1 = 0;
|
||||
float* values_buf = (float*)(uchar*)inn_buf;
|
||||
int* missing_buf = (int*)(values_buf + n);
|
||||
@ -1369,7 +1369,7 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
for( i = 0; i < n; i++ )
|
||||
nr1 += ((!missing[i]) & dir[i]);
|
||||
left->set_num_valid(vi, n1 - nr1);
|
||||
right->set_num_valid(vi, nr1);
|
||||
right->set_num_valid(vi, nr1);
|
||||
}
|
||||
// split categorical vars, responses and cv_labels using new_idx relocation table
|
||||
for( vi = 0; vi < data->get_work_var_count() + data->ord_var_count; vi++ )
|
||||
@ -1385,11 +1385,11 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
|
||||
if (data->is_buf_16u)
|
||||
{
|
||||
unsigned short *ldst = (unsigned short *)(buf->data.s + left->buf_idx*buf->cols +
|
||||
unsigned short *ldst = (unsigned short *)(buf->data.s + left->buf_idx*buf->cols +
|
||||
ci*scount + left->offset);
|
||||
unsigned short *rdst = (unsigned short *)(buf->data.s + right->buf_idx*buf->cols +
|
||||
unsigned short *rdst = (unsigned short *)(buf->data.s + right->buf_idx*buf->cols +
|
||||
ci*scount + right->offset);
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
int d = dir[i];
|
||||
@ -1415,11 +1415,11 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
else
|
||||
{
|
||||
int *ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
int *ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
ci*scount + left->offset;
|
||||
int *rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
int *rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
ci*scount + right->offset;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
int d = dir[i];
|
||||
@ -1435,7 +1435,7 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
*ldst = idx;
|
||||
ldst++;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if( vi < data->var_count )
|
||||
@ -1443,7 +1443,7 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
left->set_num_valid(vi, n1 - nr1);
|
||||
right->set_num_valid(vi, nr1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// split sample indices
|
||||
@ -1457,14 +1457,14 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
temp_buf[i] = sample_idx_src[i];
|
||||
|
||||
int pos = data->get_work_var_count();
|
||||
|
||||
|
||||
if (data->is_buf_16u)
|
||||
{
|
||||
unsigned short* ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
unsigned short* ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
pos*scount + left->offset);
|
||||
unsigned short* rdst = (unsigned short*)(buf->data.s + right->buf_idx*buf->cols +
|
||||
unsigned short* rdst = (unsigned short*)(buf->data.s + right->buf_idx*buf->cols +
|
||||
pos*scount + right->offset);
|
||||
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
int d = dir[i];
|
||||
@ -1483,9 +1483,9 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
else
|
||||
{
|
||||
int* ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
int* ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
pos*scount + left->offset;
|
||||
int* rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
int* rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
pos*scount + right->offset;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
@ -1504,9 +1504,9 @@ void CvForestERTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// deallocate the parent node data that is not needed anymore
|
||||
data->free_node_data(node);
|
||||
data->free_node_data(node);
|
||||
}
|
||||
|
||||
CvERTrees::CvERTrees()
|
||||
@ -1576,10 +1576,10 @@ bool CvERTrees::train( const CvMat* _train_data, int _tflag,
|
||||
|
||||
__END__
|
||||
return result;
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool CvERTrees::train( CvMLData* data, CvRTParams params)
|
||||
bool CvERTrees::train( CvMLData* _data, CvRTParams params)
|
||||
{
|
||||
bool result = false;
|
||||
|
||||
@ -1587,7 +1587,7 @@ bool CvERTrees::train( CvMLData* data, CvRTParams params)
|
||||
|
||||
__BEGIN__;
|
||||
|
||||
CV_CALL( result = CvRTrees::train( data, params) );
|
||||
CV_CALL( result = CvRTrees::train( _data, params) );
|
||||
|
||||
__END__;
|
||||
|
||||
@ -1609,7 +1609,7 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
const int dims = data->var_count;
|
||||
float maximal_response = 0;
|
||||
|
||||
CvMat* oob_sample_votes = 0;
|
||||
CvMat* oob_sample_votes = 0;
|
||||
CvMat* oob_responses = 0;
|
||||
|
||||
float* oob_samples_perm_ptr= 0;
|
||||
@ -1625,7 +1625,7 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
// initialize these variable to avoid warning C4701
|
||||
CvMat oob_predictions_sum = cvMat( 1, 1, CV_32FC1 );
|
||||
CvMat oob_num_of_predictions = cvMat( 1, 1, CV_32FC1 );
|
||||
|
||||
|
||||
nsamples = data->sample_count;
|
||||
nclasses = data->get_num_classes();
|
||||
|
||||
@ -1647,11 +1647,11 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
cvGetRow( oob_responses, &oob_predictions_sum, 0 );
|
||||
cvGetRow( oob_responses, &oob_num_of_predictions, 1 );
|
||||
}
|
||||
|
||||
|
||||
CV_CALL(oob_samples_perm_ptr = (float*)cvAlloc( sizeof(float)*nsamples*dims ));
|
||||
CV_CALL(samples_ptr = (float*)cvAlloc( sizeof(float)*nsamples*dims ));
|
||||
CV_CALL(missing_ptr = (uchar*)cvAlloc( sizeof(uchar)*nsamples*dims ));
|
||||
CV_CALL(true_resp_ptr = (float*)cvAlloc( sizeof(float)*nsamples ));
|
||||
CV_CALL(true_resp_ptr = (float*)cvAlloc( sizeof(float)*nsamples ));
|
||||
|
||||
CV_CALL(data->get_vectors( 0, samples_ptr, missing_ptr, true_resp_ptr ));
|
||||
{
|
||||
@ -1661,7 +1661,7 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
maximal_response = (float)MAX( MAX( fabs(minval), fabs(maxval) ), 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
trees = (CvForestTree**)cvAlloc( sizeof(trees[0])*max_ntrees );
|
||||
memset( trees, 0, sizeof(trees[0])*max_ntrees );
|
||||
|
||||
@ -1692,7 +1692,7 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
sample.data.fl += dims, missing.data.ptr += dims )
|
||||
{
|
||||
CvDTreeNode* predicted_node = 0;
|
||||
|
||||
|
||||
// predict oob samples
|
||||
if( !predicted_node )
|
||||
CV_CALL(predicted_node = tree->predict(&sample, &missing, true));
|
||||
@ -1796,12 +1796,12 @@ bool CvERTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
}
|
||||
|
||||
result = true;
|
||||
|
||||
|
||||
cvFree( &oob_samples_perm_ptr );
|
||||
cvFree( &samples_ptr );
|
||||
cvFree( &missing_ptr );
|
||||
cvFree( &true_resp_ptr );
|
||||
|
||||
|
||||
cvReleaseMat( &sample_idx_for_tree );
|
||||
|
||||
cvReleaseMat( &oob_sample_votes );
|
||||
|
@ -166,13 +166,13 @@ bool CvGBTrees::problem_type() const
|
||||
//===========================================================================
|
||||
|
||||
bool
|
||||
CvGBTrees::train( CvMLData* data, CvGBTreesParams params, bool update )
|
||||
CvGBTrees::train( CvMLData* _data, CvGBTreesParams _params, bool update )
|
||||
{
|
||||
bool result;
|
||||
result = train ( data->get_values(), CV_ROW_SAMPLE,
|
||||
data->get_responses(), data->get_var_idx(),
|
||||
data->get_train_sample_idx(), data->get_var_types(),
|
||||
data->get_missing(), params, update);
|
||||
result = train ( _data->get_values(), CV_ROW_SAMPLE,
|
||||
_data->get_responses(), _data->get_var_idx(),
|
||||
_data->get_train_sample_idx(), _data->get_var_types(),
|
||||
_data->get_missing(), _params, update);
|
||||
//update is not supported
|
||||
return result;
|
||||
}
|
||||
@ -1294,12 +1294,12 @@ CvGBTrees::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
|
||||
{
|
||||
|
||||
float err = 0.0f;
|
||||
const CvMat* sample_idx = (type == CV_TRAIN_ERROR) ?
|
||||
const CvMat* _sample_idx = (type == CV_TRAIN_ERROR) ?
|
||||
_data->get_train_sample_idx() :
|
||||
_data->get_test_sample_idx();
|
||||
const CvMat* response = _data->get_responses();
|
||||
|
||||
int n = sample_idx ? get_len(sample_idx) : 0;
|
||||
int n = _sample_idx ? get_len(_sample_idx) : 0;
|
||||
n = (type == CV_TRAIN_ERROR && n == 0) ? _data->get_values()->rows : n;
|
||||
|
||||
if (!n)
|
||||
@ -1315,7 +1315,7 @@ CvGBTrees::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
|
||||
pred_resp = new float[n];
|
||||
|
||||
Sample_predictor predictor = Sample_predictor(this, pred_resp, _data->get_values(),
|
||||
_data->get_missing(), sample_idx);
|
||||
_data->get_missing(), _sample_idx);
|
||||
|
||||
//#ifdef HAVE_TBB
|
||||
// tbb::parallel_for(cv::BlockedRange(0,n), predictor, tbb::auto_partitioner());
|
||||
@ -1323,7 +1323,7 @@ CvGBTrees::calc_error( CvMLData* _data, int type, std::vector<float> *resp )
|
||||
cv::parallel_for(cv::BlockedRange(0,n), predictor);
|
||||
//#endif
|
||||
|
||||
int* sidx = sample_idx ? sample_idx->data.i : 0;
|
||||
int* sidx = _sample_idx ? _sample_idx->data.i : 0;
|
||||
int r_step = CV_IS_MAT_CONT(response->type) ?
|
||||
1 : response->step / CV_ELEM_SIZE(response->type);
|
||||
|
||||
@ -1357,7 +1357,7 @@ CvGBTrees::CvGBTrees( const cv::Mat& trainData, int tflag,
|
||||
const cv::Mat& responses, const cv::Mat& varIdx,
|
||||
const cv::Mat& sampleIdx, const cv::Mat& varType,
|
||||
const cv::Mat& missingDataMask,
|
||||
CvGBTreesParams params )
|
||||
CvGBTreesParams _params )
|
||||
{
|
||||
data = 0;
|
||||
weak = 0;
|
||||
@ -1371,14 +1371,14 @@ CvGBTrees::CvGBTrees( const cv::Mat& trainData, int tflag,
|
||||
|
||||
clear();
|
||||
|
||||
train(trainData, tflag, responses, varIdx, sampleIdx, varType, missingDataMask, params, false);
|
||||
train(trainData, tflag, responses, varIdx, sampleIdx, varType, missingDataMask, _params, false);
|
||||
}
|
||||
|
||||
bool CvGBTrees::train( const cv::Mat& trainData, int tflag,
|
||||
const cv::Mat& responses, const cv::Mat& varIdx,
|
||||
const cv::Mat& sampleIdx, const cv::Mat& varType,
|
||||
const cv::Mat& missingDataMask,
|
||||
CvGBTreesParams params,
|
||||
CvGBTreesParams _params,
|
||||
bool update )
|
||||
{
|
||||
CvMat _trainData = trainData, _responses = responses;
|
||||
@ -1387,13 +1387,13 @@ bool CvGBTrees::train( const cv::Mat& trainData, int tflag,
|
||||
|
||||
return train( &_trainData, tflag, &_responses, varIdx.empty() ? 0 : &_varIdx,
|
||||
sampleIdx.empty() ? 0 : &_sampleIdx, varType.empty() ? 0 : &_varType,
|
||||
missingDataMask.empty() ? 0 : &_missingDataMask, params, update);
|
||||
missingDataMask.empty() ? 0 : &_missingDataMask, _params, update);
|
||||
}
|
||||
|
||||
float CvGBTrees::predict( const cv::Mat& sample, const cv::Mat& missing,
|
||||
float CvGBTrees::predict( const cv::Mat& sample, const cv::Mat& _missing,
|
||||
const cv::Range& slice, int k ) const
|
||||
{
|
||||
CvMat _sample = sample, _missing = missing;
|
||||
return predict(&_sample, missing.empty() ? 0 : &_missing, 0,
|
||||
CvMat _sample = sample, miss = _missing;
|
||||
return predict(&_sample, _missing.empty() ? 0 : &miss, 0,
|
||||
slice==cv::Range::all() ? CV_WHOLE_SEQ : cvSlice(slice.start, slice.end), k);
|
||||
}
|
||||
|
@ -141,7 +141,7 @@ bool CvKNearest::train( const CvMat* _train_data, const CvMat* _responses,
|
||||
ok = true;
|
||||
|
||||
__END__;
|
||||
|
||||
|
||||
if( responses && responses->data.ptr != _responses->data.ptr )
|
||||
cvReleaseMat(&responses);
|
||||
|
||||
@ -318,7 +318,7 @@ struct P1 {
|
||||
result = _result;
|
||||
buf_sz = _buf_sz;
|
||||
}
|
||||
|
||||
|
||||
const CvKNearest* pointer;
|
||||
int k;
|
||||
const CvMat* _samples;
|
||||
@ -329,7 +329,7 @@ struct P1 {
|
||||
CvMat* _dist;
|
||||
float* result;
|
||||
int buf_sz;
|
||||
|
||||
|
||||
void operator()( const cv::BlockedRange& range ) const
|
||||
{
|
||||
cv::AutoBuffer<float> buf(buf_sz);
|
||||
@ -429,7 +429,7 @@ bool CvKNearest::train( const Mat& _train_data, const Mat& _responses,
|
||||
int _max_k, bool _update_base )
|
||||
{
|
||||
CvMat tdata = _train_data, responses = _responses, sidx = _sample_idx;
|
||||
|
||||
|
||||
return train(&tdata, &responses, sidx.data.ptr ? &sidx : 0, _is_regression, _max_k, _update_base );
|
||||
}
|
||||
|
||||
@ -439,7 +439,7 @@ float CvKNearest::find_nearest( const Mat& _samples, int k, Mat* _results,
|
||||
Mat* _dist ) const
|
||||
{
|
||||
CvMat s = _samples, results, *presults = 0, nresponses, *pnresponses = 0, dist, *pdist = 0;
|
||||
|
||||
|
||||
if( _results )
|
||||
{
|
||||
if(!(_results->data && (_results->type() == CV_32F ||
|
||||
@ -449,7 +449,7 @@ float CvKNearest::find_nearest( const Mat& _samples, int k, Mat* _results,
|
||||
_results->create(_samples.rows, 1, CV_32F);
|
||||
presults = &(results = *_results);
|
||||
}
|
||||
|
||||
|
||||
if( _neighbor_responses )
|
||||
{
|
||||
if(!(_neighbor_responses->data && _neighbor_responses->type() == CV_32F &&
|
||||
@ -457,7 +457,7 @@ float CvKNearest::find_nearest( const Mat& _samples, int k, Mat* _results,
|
||||
_neighbor_responses->create(_samples.rows, k, CV_32F);
|
||||
pnresponses = &(nresponses = *_neighbor_responses);
|
||||
}
|
||||
|
||||
|
||||
if( _dist )
|
||||
{
|
||||
if(!(_dist->data && _dist->type() == CV_32F &&
|
||||
@ -465,15 +465,15 @@ float CvKNearest::find_nearest( const Mat& _samples, int k, Mat* _results,
|
||||
_dist->create(_samples.rows, k, CV_32F);
|
||||
pdist = &(dist = *_dist);
|
||||
}
|
||||
|
||||
|
||||
return find_nearest(&s, k, presults, _neighbors, pnresponses, pdist );
|
||||
}
|
||||
|
||||
|
||||
float CvKNearest::find_nearest( const cv::Mat& samples, int k, CV_OUT cv::Mat& results,
|
||||
float CvKNearest::find_nearest( const cv::Mat& _samples, int k, CV_OUT cv::Mat& results,
|
||||
CV_OUT cv::Mat& neighborResponses, CV_OUT cv::Mat& dists) const
|
||||
{
|
||||
return find_nearest(samples, k, &results, 0, &neighborResponses, &dists);
|
||||
return find_nearest(_samples, k, &results, 0, &neighborResponses, &dists);
|
||||
}
|
||||
|
||||
/* End of file */
|
||||
|
@ -241,13 +241,13 @@ bool CvNormalBayesClassifier::train( const CvMat* _train_data, const CvMat* _res
|
||||
double* cov_data = cov->data.db + i*_var_count;
|
||||
double s1val = sum1[i];
|
||||
double avg1 = avg_data[i];
|
||||
int count = count_data[i];
|
||||
int _count = count_data[i];
|
||||
|
||||
for( j = 0; j <= i; j++ )
|
||||
{
|
||||
double avg2 = avg2_data[j];
|
||||
double cov_val = prod_data[j] - avg1 * sum2[j] - avg2 * s1val + avg1 * avg2 * count;
|
||||
cov_val = (count > 1) ? cov_val / (count - 1) : cov_val;
|
||||
double cov_val = prod_data[j] - avg1 * sum2[j] - avg2 * s1val + avg1 * avg2 * _count;
|
||||
cov_val = (_count > 1) ? cov_val / (_count - 1) : cov_val;
|
||||
cov_data[j] = cov_val;
|
||||
}
|
||||
}
|
||||
@ -294,7 +294,7 @@ struct predict_body {
|
||||
value = _value;
|
||||
var_count1 = _var_count1;
|
||||
}
|
||||
|
||||
|
||||
CvMat* c;
|
||||
CvMat** cov_rotate_mats;
|
||||
CvMat** inv_eigen_values;
|
||||
@ -306,15 +306,15 @@ struct predict_body {
|
||||
CvMat* results;
|
||||
float* value;
|
||||
int var_count1;
|
||||
|
||||
|
||||
void operator()( const cv::BlockedRange& range ) const
|
||||
{
|
||||
|
||||
int cls = -1;
|
||||
int rtype = 0, rstep = 0;
|
||||
int rtype = 0, rstep = 0;
|
||||
int nclasses = cls_labels->cols;
|
||||
int _var_count = avg[0]->cols;
|
||||
|
||||
|
||||
if (results)
|
||||
{
|
||||
rtype = CV_MAT_TYPE(results->type);
|
||||
@ -323,7 +323,7 @@ struct predict_body {
|
||||
// allocate memory and initializing headers for calculating
|
||||
cv::AutoBuffer<double> buffer(nclasses + var_count1);
|
||||
CvMat diff = cvMat( 1, var_count1, CV_64FC1, &buffer[0] );
|
||||
|
||||
|
||||
for(int k = range.begin(); k < range.end(); k += 1 )
|
||||
{
|
||||
int ival;
|
||||
@ -592,7 +592,7 @@ CvNormalBayesClassifier::CvNormalBayesClassifier( const Mat& _train_data, const
|
||||
cov_rotate_mats = 0;
|
||||
c = 0;
|
||||
default_model_name = "my_nb";
|
||||
|
||||
|
||||
CvMat tdata = _train_data, responses = _responses, vidx = _var_idx, sidx = _sample_idx;
|
||||
train(&tdata, &responses, vidx.data.ptr ? &vidx : 0,
|
||||
sidx.data.ptr ? &sidx : 0);
|
||||
@ -609,7 +609,7 @@ bool CvNormalBayesClassifier::train( const Mat& _train_data, const Mat& _respons
|
||||
float CvNormalBayesClassifier::predict( const Mat& _samples, Mat* _results ) const
|
||||
{
|
||||
CvMat samples = _samples, results, *presults = 0;
|
||||
|
||||
|
||||
if( _results )
|
||||
{
|
||||
if( !(_results->data && _results->type() == CV_32F &&
|
||||
@ -618,7 +618,7 @@ float CvNormalBayesClassifier::predict( const Mat& _samples, Mat* _results ) con
|
||||
_results->create(_samples.rows, 1, CV_32F);
|
||||
presults = &(results = *_results);
|
||||
}
|
||||
|
||||
|
||||
return predict(&samples, presults);
|
||||
}
|
||||
|
||||
|
@ -307,14 +307,14 @@ bool CvRTrees::train( const CvMat* _train_data, int _tflag,
|
||||
return grow_forest( params.term_crit );
|
||||
}
|
||||
|
||||
bool CvRTrees::train( CvMLData* data, CvRTParams params )
|
||||
bool CvRTrees::train( CvMLData* _data, CvRTParams params )
|
||||
{
|
||||
const CvMat* values = data->get_values();
|
||||
const CvMat* response = data->get_responses();
|
||||
const CvMat* missing = data->get_missing();
|
||||
const CvMat* var_types = data->get_var_types();
|
||||
const CvMat* train_sidx = data->get_train_sample_idx();
|
||||
const CvMat* var_idx = data->get_var_idx();
|
||||
const CvMat* values = _data->get_values();
|
||||
const CvMat* response = _data->get_responses();
|
||||
const CvMat* missing = _data->get_missing();
|
||||
const CvMat* var_types = _data->get_var_types();
|
||||
const CvMat* train_sidx = _data->get_train_sample_idx();
|
||||
const CvMat* var_idx = _data->get_var_idx();
|
||||
|
||||
return train( values, CV_ROW_SAMPLE, response, var_idx,
|
||||
train_sidx, var_types, missing, params );
|
||||
@ -331,7 +331,7 @@ bool CvRTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
const int dims = data->var_count;
|
||||
float maximal_response = 0;
|
||||
|
||||
CvMat* oob_sample_votes = 0;
|
||||
CvMat* oob_sample_votes = 0;
|
||||
CvMat* oob_responses = 0;
|
||||
|
||||
float* oob_samples_perm_ptr= 0;
|
||||
@ -347,7 +347,7 @@ bool CvRTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
// initialize these variable to avoid warning C4701
|
||||
CvMat oob_predictions_sum = cvMat( 1, 1, CV_32FC1 );
|
||||
CvMat oob_num_of_predictions = cvMat( 1, 1, CV_32FC1 );
|
||||
|
||||
|
||||
nsamples = data->sample_count;
|
||||
nclasses = data->get_num_classes();
|
||||
|
||||
@ -369,14 +369,14 @@ bool CvRTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
cvGetRow( oob_responses, &oob_predictions_sum, 0 );
|
||||
cvGetRow( oob_responses, &oob_num_of_predictions, 1 );
|
||||
}
|
||||
|
||||
|
||||
oob_samples_perm_ptr = (float*)cvAlloc( sizeof(float)*nsamples*dims );
|
||||
samples_ptr = (float*)cvAlloc( sizeof(float)*nsamples*dims );
|
||||
missing_ptr = (uchar*)cvAlloc( sizeof(uchar)*nsamples*dims );
|
||||
true_resp_ptr = (float*)cvAlloc( sizeof(float)*nsamples );
|
||||
true_resp_ptr = (float*)cvAlloc( sizeof(float)*nsamples );
|
||||
|
||||
data->get_vectors( 0, samples_ptr, missing_ptr, true_resp_ptr );
|
||||
|
||||
|
||||
double minval, maxval;
|
||||
CvMat responses = cvMat(1, nsamples, CV_32FC1, true_resp_ptr);
|
||||
cvMinMaxLoc( &responses, &minval, &maxval );
|
||||
@ -536,7 +536,7 @@ bool CvRTrees::grow_forest( const CvTermCriteria term_crit )
|
||||
cvFree( &samples_ptr );
|
||||
cvFree( &missing_ptr );
|
||||
cvFree( &true_resp_ptr );
|
||||
|
||||
|
||||
cvReleaseMat( &sample_idx_mask_for_tree );
|
||||
cvReleaseMat( &sample_idx_for_tree );
|
||||
|
||||
@ -592,9 +592,9 @@ float CvRTrees::calc_error( CvMLData* _data, int type , std::vector<float> *resp
|
||||
{
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 );
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
@ -610,15 +610,15 @@ float CvRTrees::calc_error( CvMLData* _data, int type , std::vector<float> *resp
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 );
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
float d = r - response->data.fl[si*r_step];
|
||||
err += d*d;
|
||||
}
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -635,12 +635,12 @@ float CvRTrees::get_train_error()
|
||||
float *responses_ptr = (float*)cvAlloc( sizeof(float)*sample_count );
|
||||
|
||||
data->get_vectors( 0, values_ptr, missing_ptr, responses_ptr);
|
||||
|
||||
|
||||
if (data->is_classifier)
|
||||
{
|
||||
int err_count = 0;
|
||||
float *vp = values_ptr;
|
||||
uchar *mp = missing_ptr;
|
||||
uchar *mp = missing_ptr;
|
||||
for (int si = 0; si < sample_count; si++, vp += var_count, mp += var_count)
|
||||
{
|
||||
CvMat sample = cvMat( 1, var_count, CV_32FC1, vp );
|
||||
@ -653,10 +653,10 @@ float CvRTrees::get_train_error()
|
||||
}
|
||||
else
|
||||
CV_Error( CV_StsBadArg, "This method is not supported for regression problems" );
|
||||
|
||||
|
||||
cvFree( &values_ptr );
|
||||
cvFree( &missing_ptr );
|
||||
cvFree( &responses_ptr );
|
||||
cvFree( &responses_ptr );
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -701,7 +701,7 @@ float CvRTrees::predict( const CvMat* sample, const CvMat* missing ) const
|
||||
|
||||
float CvRTrees::predict_prob( const CvMat* sample, const CvMat* missing) const
|
||||
{
|
||||
if( nclasses == 2 ) //classification
|
||||
if( nclasses == 2 ) //classification
|
||||
{
|
||||
cv::AutoBuffer<int> _votes(nclasses);
|
||||
int* votes = _votes;
|
||||
@ -711,15 +711,15 @@ float CvRTrees::predict_prob( const CvMat* sample, const CvMat* missing) const
|
||||
CvDTreeNode* predicted_node = trees[k]->predict( sample, missing );
|
||||
int class_idx = predicted_node->class_idx;
|
||||
CV_Assert( 0 <= class_idx && class_idx < nclasses );
|
||||
|
||||
|
||||
++votes[class_idx];
|
||||
}
|
||||
|
||||
return float(votes[1])/ntrees;
|
||||
|
||||
return float(votes[1])/ntrees;
|
||||
}
|
||||
else // regression
|
||||
CV_Error(CV_StsBadArg, "This function works for binary classification problems only...");
|
||||
|
||||
CV_Error(CV_StsBadArg, "This function works for binary classification problems only...");
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -809,15 +809,15 @@ void CvRTrees::read( CvFileStorage* fs, CvFileNode* fnode )
|
||||
{
|
||||
// initialize active variables mask
|
||||
CvMat submask1;
|
||||
cvGetCols( active_var_mask, &submask1, 0, nactive_vars );
|
||||
cvGetCols( active_var_mask, &submask1, 0, nactive_vars );
|
||||
cvSet( &submask1, cvScalar(1) );
|
||||
|
||||
if( nactive_vars < var_count )
|
||||
{
|
||||
CvMat submask2;
|
||||
cvGetCols( active_var_mask, &submask2, nactive_vars, var_count );
|
||||
cvZero( &submask2 );
|
||||
}
|
||||
if( nactive_vars < var_count )
|
||||
{
|
||||
CvMat submask2;
|
||||
cvGetCols( active_var_mask, &submask2, nactive_vars, var_count );
|
||||
cvZero( &submask2 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1065,10 +1065,10 @@ bool CvSVMSolver::solve_eps_svr( int _sample_count, int _var_count, const float*
|
||||
CvSVMKernel* _kernel, double* _alpha, CvSVMSolutionInfo& _si )
|
||||
{
|
||||
int i;
|
||||
double p = _kernel->params->p, C = _kernel->params->C;
|
||||
double p = _kernel->params->p, _C = _kernel->params->C;
|
||||
|
||||
if( !create( _sample_count, _var_count, _samples, 0,
|
||||
_sample_count*2, 0, C, C, _storage, _kernel, &CvSVMSolver::get_row_svr,
|
||||
_sample_count*2, 0, _C, _C, _storage, _kernel, &CvSVMSolver::get_row_svr,
|
||||
&CvSVMSolver::select_working_set, &CvSVMSolver::calc_rho ))
|
||||
return false;
|
||||
|
||||
@ -1101,7 +1101,7 @@ bool CvSVMSolver::solve_nu_svr( int _sample_count, int _var_count, const float**
|
||||
CvSVMKernel* _kernel, double* _alpha, CvSVMSolutionInfo& _si )
|
||||
{
|
||||
int i;
|
||||
double C = _kernel->params->C, sum;
|
||||
double _C = _kernel->params->C, sum;
|
||||
|
||||
if( !create( _sample_count, _var_count, _samples, 0,
|
||||
_sample_count*2, 0, 1., 1., _storage, _kernel, &CvSVMSolver::get_row_svr,
|
||||
@ -1110,11 +1110,11 @@ bool CvSVMSolver::solve_nu_svr( int _sample_count, int _var_count, const float**
|
||||
|
||||
y = (schar*)cvMemStorageAlloc( storage, sample_count*2*sizeof(y[0]) );
|
||||
alpha = (double*)cvMemStorageAlloc( storage, alpha_count*sizeof(alpha[0]) );
|
||||
sum = C * _kernel->params->nu * sample_count * 0.5;
|
||||
sum = _C * _kernel->params->nu * sample_count * 0.5;
|
||||
|
||||
for( i = 0; i < sample_count; i++ )
|
||||
{
|
||||
alpha[i] = alpha[i + sample_count] = MIN(sum, C);
|
||||
alpha[i] = alpha[i + sample_count] = MIN(sum, _C);
|
||||
sum -= alpha[i];
|
||||
|
||||
b[i] = -_y[i];
|
||||
@ -1628,12 +1628,11 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
int svm_type, sample_count, var_count, sample_size;
|
||||
int block_size = 1 << 16;
|
||||
double* alpha;
|
||||
int i, k;
|
||||
RNG* rng = &theRNG();
|
||||
|
||||
// all steps are logarithmic and must be > 1
|
||||
double degree_step = 10, g_step = 10, coef_step = 10, C_step = 10, nu_step = 10, p_step = 10;
|
||||
double gamma = 0, C = 0, degree = 0, coef = 0, p = 0, nu = 0;
|
||||
double gamma = 0, _C = 0, degree = 0, coef = 0, p = 0, nu = 0;
|
||||
double best_degree = 0, best_gamma = 0, best_coef = 0, best_C = 0, best_nu = 0, best_p = 0;
|
||||
float min_error = FLT_MAX, error;
|
||||
|
||||
@ -1760,7 +1759,7 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
cvZero( responses_local );
|
||||
|
||||
// randomly permute samples and responses
|
||||
for( i = 0; i < sample_count; i++ )
|
||||
for(int i = 0; i < sample_count; i++ )
|
||||
{
|
||||
int i1 = (*rng)(sample_count);
|
||||
int i2 = (*rng)(sample_count);
|
||||
@ -1779,7 +1778,7 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
{
|
||||
// count class samples
|
||||
int num_0=0,num_1=0;
|
||||
for (i=0; i<sample_count; ++i)
|
||||
for (int i=0; i<sample_count; ++i)
|
||||
{
|
||||
if (responses->data.i[i]==class_labels->data.i[0])
|
||||
++num_0;
|
||||
@ -1875,10 +1874,10 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
}
|
||||
|
||||
int* cls_lbls = class_labels ? class_labels->data.i : 0;
|
||||
C = C_grid.min_val;
|
||||
_C = C_grid.min_val;
|
||||
do
|
||||
{
|
||||
params.C = C;
|
||||
params.C = _C;
|
||||
gamma = gamma_grid.min_val;
|
||||
do
|
||||
{
|
||||
@ -1906,7 +1905,7 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
int train_size = trainset_size;
|
||||
|
||||
error = 0;
|
||||
for( k = 0; k < k_fold; k++ )
|
||||
for(int k = 0; k < k_fold; k++ )
|
||||
{
|
||||
memcpy( samples_local, samples, sizeof(samples[0])*test_size*k );
|
||||
memcpy( samples_local + test_size*k, test_samples_ptr + test_size,
|
||||
@ -1930,7 +1929,7 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
EXIT;
|
||||
|
||||
// Compute test set error on <test_size> samples
|
||||
for( i = 0; i < test_size; i++, true_resp += resp_elem_size, test_samples_ptr++ )
|
||||
for(int i = 0; i < test_size; i++, true_resp += resp_elem_size, test_samples_ptr++ )
|
||||
{
|
||||
float resp = predict( *test_samples_ptr, var_count );
|
||||
error += is_regression ? powf( resp - *(float*)true_resp, 2 )
|
||||
@ -1943,7 +1942,7 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
best_degree = degree;
|
||||
best_gamma = gamma;
|
||||
best_coef = coef;
|
||||
best_C = C;
|
||||
best_C = _C;
|
||||
best_nu = nu;
|
||||
best_p = p;
|
||||
}
|
||||
@ -1962,9 +1961,9 @@ bool CvSVM::train_auto( const CvMat* _train_data, const CvMat* _responses,
|
||||
gamma *= gamma_grid.step;
|
||||
}
|
||||
while( gamma < gamma_grid.max_val );
|
||||
C *= C_grid.step;
|
||||
_C *= C_grid.step;
|
||||
}
|
||||
while( C < C_grid.max_val );
|
||||
while( _C < C_grid.max_val );
|
||||
}
|
||||
|
||||
min_error /= (float) sample_count;
|
||||
|
@ -156,7 +156,7 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
int vi, i, size;
|
||||
char err[100];
|
||||
const int *sidx = 0, *vidx = 0;
|
||||
|
||||
|
||||
if( _update_data && data_root )
|
||||
{
|
||||
data = new CvDTreeTrainData( _train_data, _tflag, _responses, _var_idx,
|
||||
@ -224,7 +224,7 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
|
||||
sample_count = sample_all;
|
||||
var_count = var_all;
|
||||
|
||||
|
||||
if( _sample_idx )
|
||||
{
|
||||
CV_CALL( sample_indices = cvPreprocessIndexArray( _sample_idx, sample_all ));
|
||||
@ -239,10 +239,10 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
var_count = var_idx->rows + var_idx->cols - 1;
|
||||
}
|
||||
|
||||
is_buf_16u = false;
|
||||
if ( sample_count < 65536 )
|
||||
is_buf_16u = true;
|
||||
|
||||
is_buf_16u = false;
|
||||
if ( sample_count < 65536 )
|
||||
is_buf_16u = true;
|
||||
|
||||
if( !CV_IS_MAT(_responses) ||
|
||||
(CV_MAT_TYPE(_responses->type) != CV_32SC1 &&
|
||||
CV_MAT_TYPE(_responses->type) != CV_32FC1) ||
|
||||
@ -251,13 +251,13 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
CV_ERROR( CV_StsBadArg, "The array of _responses must be an integer or "
|
||||
"floating-point vector containing as many elements as "
|
||||
"the total number of samples in the training data matrix" );
|
||||
|
||||
|
||||
r_type = CV_VAR_CATEGORICAL;
|
||||
if( _var_type )
|
||||
CV_CALL( var_type0 = cvPreprocessVarType( _var_type, var_idx, var_count, &r_type ));
|
||||
|
||||
CV_CALL( var_type = cvCreateMat( 1, var_count+2, CV_32SC1 ));
|
||||
|
||||
|
||||
cat_var_count = 0;
|
||||
ord_var_count = -1;
|
||||
|
||||
@ -284,11 +284,11 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
|
||||
work_var_count = var_count + (is_classifier ? 1 : 0) // for responses class_labels
|
||||
+ (have_labels ? 1 : 0); // for cv_labels
|
||||
|
||||
|
||||
buf_size = (work_var_count + 1 /*for sample_indices*/) * sample_count;
|
||||
shared = _shared;
|
||||
buf_count = shared ? 2 : 1;
|
||||
|
||||
|
||||
if ( is_buf_16u )
|
||||
{
|
||||
CV_CALL( buf = cvCreateMat( buf_count, buf_size, CV_16UC1 ));
|
||||
@ -298,13 +298,13 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
CV_CALL( buf = cvCreateMat( buf_count, buf_size, CV_32SC1 ));
|
||||
CV_CALL( int_ptr = (int**)cvAlloc( sample_count*sizeof(int_ptr[0]) ));
|
||||
}
|
||||
}
|
||||
|
||||
size = is_classifier ? (cat_var_count+1) : cat_var_count;
|
||||
size = !size ? 1 : size;
|
||||
CV_CALL( cat_count = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
CV_CALL( cat_ofs = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
|
||||
|
||||
size = is_classifier ? (cat_var_count + 1)*params.max_categories : cat_var_count*params.max_categories;
|
||||
size = !size ? 1 : size;
|
||||
CV_CALL( cat_map = cvCreateMat( 1, size, CV_32SC1 ));
|
||||
@ -389,12 +389,12 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
int c_count, prev_label;
|
||||
int* c_map;
|
||||
|
||||
|
||||
if (is_buf_16u)
|
||||
udst = (unsigned short*)(buf->data.s + vi*sample_count);
|
||||
else
|
||||
idst = buf->data.i + vi*sample_count;
|
||||
|
||||
|
||||
// copy data
|
||||
for( i = 0; i < sample_count; i++ )
|
||||
{
|
||||
@ -428,7 +428,7 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
_idst[i] = val;
|
||||
pair16u32s_ptr[i].u = udst + i;
|
||||
pair16u32s_ptr[i].i = _idst + i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
idst[i] = val;
|
||||
@ -502,7 +502,7 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
// replace labels for missing values with -1
|
||||
for( ; i < sample_count; i++ )
|
||||
*int_ptr[i] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( ci < 0 ) // process ordered variable
|
||||
{
|
||||
@ -536,14 +536,14 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
else
|
||||
idst[i] = i;
|
||||
_fdst[i] = val;
|
||||
|
||||
|
||||
}
|
||||
if (is_buf_16u)
|
||||
icvSortUShAux( udst, sample_count, _fdst);
|
||||
else
|
||||
icvSortIntAux( idst, sample_count, _fdst );
|
||||
}
|
||||
|
||||
|
||||
if( vi < var_count )
|
||||
data_root->set_num_valid(vi, num_valid);
|
||||
}
|
||||
@ -564,15 +564,15 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
|
||||
if( cv_n )
|
||||
{
|
||||
unsigned short* udst = 0;
|
||||
int* idst = 0;
|
||||
unsigned short* usdst = 0;
|
||||
int* idst2 = 0;
|
||||
|
||||
if (is_buf_16u)
|
||||
{
|
||||
udst = (unsigned short*)(buf->data.s + (get_work_var_count()-1)*sample_count);
|
||||
usdst = (unsigned short*)(buf->data.s + (get_work_var_count()-1)*sample_count);
|
||||
for( i = vi = 0; i < sample_count; i++ )
|
||||
{
|
||||
udst[i] = (unsigned short)vi++;
|
||||
usdst[i] = (unsigned short)vi++;
|
||||
vi &= vi < cv_n ? -1 : 0;
|
||||
}
|
||||
|
||||
@ -581,15 +581,15 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
int a = (*rng)(sample_count);
|
||||
int b = (*rng)(sample_count);
|
||||
unsigned short unsh = (unsigned short)vi;
|
||||
CV_SWAP( udst[a], udst[b], unsh );
|
||||
CV_SWAP( usdst[a], usdst[b], unsh );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
idst = buf->data.i + (get_work_var_count()-1)*sample_count;
|
||||
idst2 = buf->data.i + (get_work_var_count()-1)*sample_count;
|
||||
for( i = vi = 0; i < sample_count; i++ )
|
||||
{
|
||||
idst[i] = vi++;
|
||||
idst2[i] = vi++;
|
||||
vi &= vi < cv_n ? -1 : 0;
|
||||
}
|
||||
|
||||
@ -597,12 +597,12 @@ void CvDTreeTrainData::set_data( const CvMat* _train_data, int _tflag,
|
||||
{
|
||||
int a = (*rng)(sample_count);
|
||||
int b = (*rng)(sample_count);
|
||||
CV_SWAP( idst[a], idst[b], vi );
|
||||
CV_SWAP( idst2[a], idst2[b], vi );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( cat_map )
|
||||
if ( cat_map )
|
||||
cat_map->cols = MAX( total_c_count, 1 );
|
||||
|
||||
max_split_size = cvAlign(sizeof(CvDTreeSplit) +
|
||||
@ -751,7 +751,7 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
|
||||
if (is_buf_16u)
|
||||
{
|
||||
unsigned short* udst = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
unsigned short* udst = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
vi*sample_count + root->offset);
|
||||
for( i = 0; i < count; i++ )
|
||||
{
|
||||
@ -762,7 +762,7 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
}
|
||||
else
|
||||
{
|
||||
int* idst = buf->data.i + root->buf_idx*buf->cols +
|
||||
int* idst = buf->data.i + root->buf_idx*buf->cols +
|
||||
vi*sample_count + root->offset;
|
||||
for( i = 0; i < count; i++ )
|
||||
{
|
||||
@ -788,7 +788,7 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
|
||||
if (is_buf_16u)
|
||||
{
|
||||
unsigned short* udst_idx = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
unsigned short* udst_idx = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
vi*sample_count + data_root->offset);
|
||||
for( i = 0; i < num_valid; i++ )
|
||||
{
|
||||
@ -812,7 +812,7 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
}
|
||||
else
|
||||
{
|
||||
int* idst_idx = buf->data.i + root->buf_idx*buf->cols +
|
||||
int* idst_idx = buf->data.i + root->buf_idx*buf->cols +
|
||||
vi*sample_count + root->offset;
|
||||
for( i = 0; i < num_valid; i++ )
|
||||
{
|
||||
@ -840,14 +840,14 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
const int* sample_idx_src = get_sample_indices(data_root, (int*)(uchar*)inn_buf);
|
||||
if (is_buf_16u)
|
||||
{
|
||||
unsigned short* sample_idx_dst = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
unsigned short* sample_idx_dst = (unsigned short*)(buf->data.s + root->buf_idx*buf->cols +
|
||||
workVarCount*sample_count + root->offset);
|
||||
for (i = 0; i < count; i++)
|
||||
sample_idx_dst[i] = (unsigned short)sample_idx_src[sidx[i]];
|
||||
}
|
||||
else
|
||||
{
|
||||
int* sample_idx_dst = buf->data.i + root->buf_idx*buf->cols +
|
||||
int* sample_idx_dst = buf->data.i + root->buf_idx*buf->cols +
|
||||
workVarCount*sample_count + root->offset;
|
||||
for (i = 0; i < count; i++)
|
||||
sample_idx_dst[i] = sample_idx_src[sidx[i]];
|
||||
@ -865,7 +865,7 @@ CvDTreeNode* CvDTreeTrainData::subsample_data( const CvMat* _subsample_idx )
|
||||
|
||||
void CvDTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
float* values, uchar* missing,
|
||||
float* responses, bool get_class_idx )
|
||||
float* _responses, bool get_class_idx )
|
||||
{
|
||||
CvMat* subsample_idx = 0;
|
||||
CvMat* subsample_co = 0;
|
||||
@ -962,7 +962,7 @@ void CvDTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
}
|
||||
|
||||
// copy responses
|
||||
if( responses )
|
||||
if( _responses )
|
||||
{
|
||||
if( is_classifier )
|
||||
{
|
||||
@ -972,7 +972,7 @@ void CvDTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
int idx = sidx ? sidx[i] : i;
|
||||
int val = get_class_idx ? src[idx] :
|
||||
cat_map->data.i[cat_ofs->data.i[cat_var_count]+src[idx]];
|
||||
responses[i] = (float)val;
|
||||
_responses[i] = (float)val;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -983,7 +983,7 @@ void CvDTreeTrainData::get_vectors( const CvMat* _subsample_idx,
|
||||
for( i = 0; i < count; i++ )
|
||||
{
|
||||
int idx = sidx ? sidx[i] : i;
|
||||
responses[i] = _values[idx];
|
||||
_responses[i] = _values[idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1122,7 +1122,7 @@ void CvDTreeTrainData::clear()
|
||||
cvReleaseMat( &cat_map );
|
||||
cvReleaseMat( &priors );
|
||||
cvReleaseMat( &priors_mult );
|
||||
|
||||
|
||||
node_heap = split_heap = 0;
|
||||
|
||||
sample_count = var_all = var_count = max_c_count = ord_var_count = cat_var_count = 0;
|
||||
@ -1130,7 +1130,7 @@ void CvDTreeTrainData::clear()
|
||||
|
||||
buf_count = buf_size = 0;
|
||||
shared = false;
|
||||
|
||||
|
||||
data_root = 0;
|
||||
|
||||
rng = &cv::theRNG();
|
||||
@ -1152,7 +1152,7 @@ void CvDTreeTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord_valu
|
||||
const float** ord_values, const int** sorted_indices, int* sample_indices_buf )
|
||||
{
|
||||
int vidx = var_idx ? var_idx->data.i[vi] : vi;
|
||||
int node_sample_count = n->sample_count;
|
||||
int node_sample_count = n->sample_count;
|
||||
int td_step = train_data->step/CV_ELEM_SIZE(train_data->type);
|
||||
|
||||
const int* sample_indices = get_sample_indices(n, sample_indices_buf);
|
||||
@ -1161,16 +1161,16 @@ void CvDTreeTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord_valu
|
||||
*sorted_indices = buf->data.i + n->buf_idx*buf->cols +
|
||||
vi*sample_count + n->offset;
|
||||
else {
|
||||
const unsigned short* short_indices = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
const unsigned short* short_indices = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
vi*sample_count + n->offset );
|
||||
for( int i = 0; i < node_sample_count; i++ )
|
||||
sorted_indices_buf[i] = short_indices[i];
|
||||
*sorted_indices = sorted_indices_buf;
|
||||
}
|
||||
|
||||
|
||||
if( tflag == CV_ROW_SAMPLE )
|
||||
{
|
||||
for( int i = 0; i < node_sample_count &&
|
||||
for( int i = 0; i < node_sample_count &&
|
||||
((((*sorted_indices)[i] >= 0) && !is_buf_16u) || (((*sorted_indices)[i] != 65535) && is_buf_16u)); i++ )
|
||||
{
|
||||
int idx = (*sorted_indices)[i];
|
||||
@ -1179,14 +1179,14 @@ void CvDTreeTrainData::get_ord_var_data( CvDTreeNode* n, int vi, float* ord_valu
|
||||
}
|
||||
}
|
||||
else
|
||||
for( int i = 0; i < node_sample_count &&
|
||||
for( int i = 0; i < node_sample_count &&
|
||||
((((*sorted_indices)[i] >= 0) && !is_buf_16u) || (((*sorted_indices)[i] != 65535) && is_buf_16u)); i++ )
|
||||
{
|
||||
int idx = (*sorted_indices)[i];
|
||||
idx = sample_indices[idx];
|
||||
ord_values_buf[i] = *(train_data->data.fl + vidx* td_step + idx);
|
||||
}
|
||||
|
||||
|
||||
*ord_values = ord_values_buf;
|
||||
}
|
||||
|
||||
@ -1205,17 +1205,17 @@ const int* CvDTreeTrainData::get_sample_indices( CvDTreeNode* n, int* indices_bu
|
||||
|
||||
const float* CvDTreeTrainData::get_ord_responses( CvDTreeNode* n, float* values_buf, int*sample_indices_buf )
|
||||
{
|
||||
int sample_count = n->sample_count;
|
||||
int _sample_count = n->sample_count;
|
||||
int r_step = CV_IS_MAT_CONT(responses->type) ? 1 : responses->step/CV_ELEM_SIZE(responses->type);
|
||||
const int* indices = get_sample_indices(n, sample_indices_buf);
|
||||
|
||||
for( int i = 0; i < sample_count &&
|
||||
for( int i = 0; i < _sample_count &&
|
||||
(((indices[i] >= 0) && !is_buf_16u) || ((indices[i] != 65535) && is_buf_16u)); i++ )
|
||||
{
|
||||
int idx = indices[i];
|
||||
values_buf[i] = *(responses->data.fl + idx * r_step);
|
||||
}
|
||||
|
||||
|
||||
return values_buf;
|
||||
}
|
||||
|
||||
@ -1235,7 +1235,7 @@ const int* CvDTreeTrainData::get_cat_var_data( CvDTreeNode* n, int vi, int* cat_
|
||||
cat_values = buf->data.i + n->buf_idx*buf->cols +
|
||||
vi*sample_count + n->offset;
|
||||
else {
|
||||
const unsigned short* short_values = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
const unsigned short* short_values = (const unsigned short*)(buf->data.s + n->buf_idx*buf->cols +
|
||||
vi*sample_count + n->offset);
|
||||
for( int i = 0; i < n->sample_count; i++ )
|
||||
cat_values_buf[i] = short_values[i];
|
||||
@ -1562,7 +1562,7 @@ bool CvDTree::train( const Mat& _train_data, int _tflag,
|
||||
const Mat& _missing_mask, CvDTreeParams _params )
|
||||
{
|
||||
CvMat tdata = _train_data, responses = _responses, vidx=_var_idx,
|
||||
sidx=_sample_idx, vtype=_var_type, mmask=_missing_mask;
|
||||
sidx=_sample_idx, vtype=_var_type, mmask=_missing_mask;
|
||||
return train(&tdata, _tflag, &responses, vidx.data.ptr ? &vidx : 0, sidx.data.ptr ? &sidx : 0,
|
||||
vtype.data.ptr ? &vtype : 0, mmask.data.ptr ? &mmask : 0, _params);
|
||||
}
|
||||
@ -1794,7 +1794,7 @@ double CvDTree::calc_node_dir( CvDTreeNode* node )
|
||||
const float* val = 0;
|
||||
const int* sorted = 0;
|
||||
data->get_ord_var_data( node, vi, val_buf, sorted_buf, &val, &sorted, sample_idx_buf);
|
||||
|
||||
|
||||
assert( 0 <= split_point && split_point < n1-1 );
|
||||
|
||||
if( !data->have_priors )
|
||||
@ -1848,7 +1848,7 @@ template<> CV_EXPORTS void Ptr<CvDTreeSplit>::delete_obj()
|
||||
{
|
||||
fastFree(obj);
|
||||
}
|
||||
|
||||
|
||||
DTreeBestSplitFinder::DTreeBestSplitFinder( CvDTree* _tree, CvDTreeNode* _node)
|
||||
{
|
||||
tree = _tree;
|
||||
@ -2310,7 +2310,7 @@ CvDTreeSplit* CvDTree::find_split_cat_class( CvDTreeNode* node, int vi, float in
|
||||
}
|
||||
|
||||
CvDTreeSplit* split = 0;
|
||||
if( best_subset >= 0 )
|
||||
if( best_subset >= 0 )
|
||||
{
|
||||
split = _split ? _split : data->new_split_cat( 0, -1.0f );
|
||||
split->var_idx = vi;
|
||||
@ -2933,7 +2933,7 @@ void CvDTree::complete_node_dir( CvDTreeNode* node )
|
||||
{
|
||||
int idx = labels[i];
|
||||
if( !dir[i] && ( ((idx >= 0)&&(!data->is_buf_16u)) || ((idx != 65535)&&(data->is_buf_16u)) ))
|
||||
|
||||
|
||||
{
|
||||
int d = CV_DTREE_CAT_DIR(idx,subset);
|
||||
dir[i] = (char)((d ^ inversed_mask) - inversed_mask);
|
||||
@ -3049,7 +3049,7 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
{
|
||||
unsigned short *ldst, *rdst, *ldst0, *rdst0;
|
||||
//unsigned short tl, tr;
|
||||
ldst0 = ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
ldst0 = ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
vi*scount + left->offset);
|
||||
rdst0 = rdst = (unsigned short*)(ldst + nl);
|
||||
|
||||
@ -3095,9 +3095,9 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
else
|
||||
{
|
||||
int *ldst0, *ldst, *rdst0, *rdst;
|
||||
ldst0 = ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
ldst0 = ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
vi*scount + left->offset;
|
||||
rdst0 = rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
rdst0 = rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
vi*scount + right->offset;
|
||||
|
||||
// split sorted
|
||||
@ -3146,7 +3146,7 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
{
|
||||
int ci = data->get_var_type(vi);
|
||||
int n1 = node->get_num_valid(vi), nr1 = 0;
|
||||
|
||||
|
||||
if( ci < 0 || (vi < data->var_count && !split_input_data) )
|
||||
continue;
|
||||
|
||||
@ -3158,11 +3158,11 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
|
||||
if (data->is_buf_16u)
|
||||
{
|
||||
unsigned short *ldst = (unsigned short *)(buf->data.s + left->buf_idx*buf->cols +
|
||||
unsigned short *ldst = (unsigned short *)(buf->data.s + left->buf_idx*buf->cols +
|
||||
vi*scount + left->offset);
|
||||
unsigned short *rdst = (unsigned short *)(buf->data.s + right->buf_idx*buf->cols +
|
||||
unsigned short *rdst = (unsigned short *)(buf->data.s + right->buf_idx*buf->cols +
|
||||
vi*scount + right->offset);
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
int d = dir[i];
|
||||
@ -3188,11 +3188,11 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
else
|
||||
{
|
||||
int *ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
int *ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
vi*scount + left->offset;
|
||||
int *rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
int *rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
vi*scount + right->offset;
|
||||
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
{
|
||||
int d = dir[i];
|
||||
@ -3208,7 +3208,7 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
*ldst = idx;
|
||||
ldst++;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if( vi < data->var_count )
|
||||
@ -3216,7 +3216,7 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
left->set_num_valid(vi, n1 - nr1);
|
||||
right->set_num_valid(vi, nr1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3230,9 +3230,9 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
int pos = data->get_work_var_count();
|
||||
if (data->is_buf_16u)
|
||||
{
|
||||
unsigned short* ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
unsigned short* ldst = (unsigned short*)(buf->data.s + left->buf_idx*buf->cols +
|
||||
pos*scount + left->offset);
|
||||
unsigned short* rdst = (unsigned short*)(buf->data.s + right->buf_idx*buf->cols +
|
||||
unsigned short* rdst = (unsigned short*)(buf->data.s + right->buf_idx*buf->cols +
|
||||
pos*scount + right->offset);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
@ -3252,9 +3252,9 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
else
|
||||
{
|
||||
int* ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
int* ldst = buf->data.i + left->buf_idx*buf->cols +
|
||||
pos*scount + left->offset;
|
||||
int* rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
int* rdst = buf->data.i + right->buf_idx*buf->cols +
|
||||
pos*scount + right->offset;
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
@ -3272,9 +3272,9 @@ void CvDTree::split_node_data( CvDTreeNode* node )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// deallocate the parent node data that is not needed anymore
|
||||
data->free_node_data(node);
|
||||
data->free_node_data(node);
|
||||
}
|
||||
|
||||
float CvDTree::calc_error( CvMLData* _data, int type, vector<float> *resp )
|
||||
@ -3304,9 +3304,9 @@ float CvDTree::calc_error( CvMLData* _data, int type, vector<float> *resp )
|
||||
{
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 )->value;
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
@ -3321,16 +3321,16 @@ float CvDTree::calc_error( CvMLData* _data, int type, vector<float> *resp )
|
||||
{
|
||||
CvMat sample, miss;
|
||||
int si = sidx ? sidx[i] : i;
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
cvGetRow( values, &sample, si );
|
||||
if( missing )
|
||||
cvGetRow( missing, &miss, si );
|
||||
float r = (float)predict( &sample, missing ? &miss : 0 )->value;
|
||||
if( pred_resp )
|
||||
pred_resp[i] = r;
|
||||
float d = r - response->data.fl[si*r_step];
|
||||
err += d*d;
|
||||
}
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
err = sample_count ? err / (float)sample_count : -FLT_MAX;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
@ -3527,7 +3527,7 @@ int CvDTree::cut_tree( int T, int fold, double min_alpha )
|
||||
}
|
||||
|
||||
|
||||
void CvDTree::free_prune_data(bool cut_tree)
|
||||
void CvDTree::free_prune_data(bool _cut_tree)
|
||||
{
|
||||
CvDTreeNode* node = root;
|
||||
|
||||
@ -3548,7 +3548,7 @@ void CvDTree::free_prune_data(bool cut_tree)
|
||||
for( parent = node->parent; parent && parent->right == node;
|
||||
node = parent, parent = parent->parent )
|
||||
{
|
||||
if( cut_tree && parent->Tn <= pruned_tree_idx )
|
||||
if( _cut_tree && parent->Tn <= pruned_tree_idx )
|
||||
{
|
||||
data->free_node( parent->left );
|
||||
data->free_node( parent->right );
|
||||
@ -3650,12 +3650,12 @@ CvDTreeNode* CvDTree::predict( const CvMat* _sample,
|
||||
{
|
||||
int a = c = cofs[ci];
|
||||
int b = (ci+1 >= data->cat_ofs->cols) ? data->cat_map->cols : cofs[ci+1];
|
||||
|
||||
|
||||
int ival = cvRound(val);
|
||||
if( ival != val )
|
||||
CV_Error( CV_StsBadArg,
|
||||
"one of input categorical variable is not an integer" );
|
||||
|
||||
|
||||
int sh = 0;
|
||||
while( a < b )
|
||||
{
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user