Merge remote-tracking branch 'origin/2.4'
Original pull requests: #996 from jet47:gpu-nvcuvid-libraries #995 from jet47:fix-bug-2985 #999 from snosov1:unreliable-results-fix #1005 from alekcac:doc_fix #1004 from jet47:fix-bug-3068 #987 from jet47:bug-3085-fix #969 from pengx17:2.4_binary_cache #929 from dominikrose:mingw-libdc1394-2-windows #1000 from ivan-korolev:fix_sift_bug_2892 #1001 from ivan-korolev:fix_stitching_bug_2405 #998 from asmorkalov:android_cmake_mips_fix #993 from ivan-korolev:fix_videostab_bug_3023 #988 from snosov1:3071-fix #986 from pengx17:2.4_initiated_context #982 from pengx17:2.4_fix_two_bugs #981 from SeninAndrew:ximea_camera_support_fix #991 from asmorkalov:android_javadoc_fix #972 from jet47:mog2-params-bug-2168 #980 from SpecLad:include-config #973 from pengx17:2.4_oclclahe #903 from aks2:2.4 #968 from asmorkalov:android_na_cproj_fix #971 from SpecLad:matchers-ctor #970 from asmorkalov:dshow_valid_check_fix #965 from apavlenko:fix_java_empty_mats Conflicts: cmake/OpenCVModule.cmake modules/core/src/matmul.cpp modules/gpu/CMakeLists.txt modules/ocl/include/opencv2/ocl/ocl.hpp modules/ocl/perf/perf_imgproc.cpp modules/ocl/src/imgproc.cpp modules/ocl/src/initialization.cpp modules/stitching/src/matchers.cpp modules/video/src/video_init.cpp modules/videostab/src/global_motion.cpp
This commit is contained in:
@@ -2850,9 +2850,9 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComp
|
||||
|
||||
if( _mean.data )
|
||||
{
|
||||
CV_Assert( _mean.size() == mean_sz );
|
||||
CV_Assert( _mean.size() == mean_sz );
|
||||
_mean.convertTo(mean, ctype);
|
||||
covar_flags |= CV_COVAR_USE_AVG;
|
||||
covar_flags |= CV_COVAR_USE_AVG;
|
||||
}
|
||||
|
||||
calcCovarMatrix( data, covar, mean, covar_flags, ctype );
|
||||
@@ -2896,6 +2896,36 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComp
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
int computeCumulativeEnergy(const Mat& eigenvalues, double retainedVariance)
|
||||
{
|
||||
CV_DbgAssert( eigenvalues.type() == DataType<T>::type );
|
||||
|
||||
Mat g(eigenvalues.size(), DataType<T>::type);
|
||||
|
||||
for(int ig = 0; ig < g.rows; ig++)
|
||||
{
|
||||
g.at<T>(ig, 0) = 0;
|
||||
for(int im = 0; im <= ig; im++)
|
||||
{
|
||||
g.at<T>(ig,0) += eigenvalues.at<T>(im,0);
|
||||
}
|
||||
}
|
||||
|
||||
int L;
|
||||
|
||||
for(L = 0; L < eigenvalues.rows; L++)
|
||||
{
|
||||
double energy = g.at<T>(L, 0) / g.at<T>(g.rows - 1, 0);
|
||||
if(energy > retainedVariance)
|
||||
break;
|
||||
}
|
||||
|
||||
L = std::max(2, L);
|
||||
|
||||
return L;
|
||||
}
|
||||
|
||||
PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, double retainedVariance)
|
||||
{
|
||||
Mat data = _data.getMat(), _mean = __mean.getMat();
|
||||
@@ -2972,26 +3002,11 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, double reta
|
||||
}
|
||||
|
||||
// compute the cumulative energy content for each eigenvector
|
||||
Mat g(eigenvalues.size(), ctype);
|
||||
|
||||
for(int ig = 0; ig < g.rows; ig++)
|
||||
{
|
||||
g.at<float>(ig,0) = 0;
|
||||
for(int im = 0; im <= ig; im++)
|
||||
{
|
||||
g.at<float>(ig,0) += eigenvalues.at<float>(im,0);
|
||||
}
|
||||
}
|
||||
|
||||
int L;
|
||||
for(L = 0; L < eigenvalues.rows; L++)
|
||||
{
|
||||
double energy = g.at<float>(L, 0) / g.at<float>(g.rows - 1, 0);
|
||||
if(energy > retainedVariance)
|
||||
break;
|
||||
}
|
||||
|
||||
L = std::max(2, L);
|
||||
if (ctype == CV_32F)
|
||||
L = computeCumulativeEnergy<float>(eigenvalues, retainedVariance);
|
||||
else
|
||||
L = computeCumulativeEnergy<double>(eigenvalues, retainedVariance);
|
||||
|
||||
// use clone() to physically copy the data and thus deallocate the original matrices
|
||||
eigenvalues = eigenvalues.rowRange(0,L).clone();
|
||||
|
Reference in New Issue
Block a user