Skip to content

Instantly share code, notes, and snippets.

@jordoh
Created October 7, 2011 16:17
Show Gist options
  • Save jordoh/1270701 to your computer and use it in GitHub Desktop.
Save jordoh/1270701 to your computer and use it in GitHub Desktop.
Patch for grabCut asserts in OpenCV 2.3.1
*** ../modules/imgproc/src/grabcut.cpp 2011-09-12 11:43:02.000000000 -0700
--- ../modules/imgproc/src/grabcut.cpp 2011-10-05 10:59:40.646173736 -0700
***************
*** 119,125 ****
double res = 0;
if( coefs[ci] > 0 )
{
! CV_Assert( covDeterms[ci] > std::numeric_limits<double>::epsilon() );
Vec3d diff = color;
double* m = mean + 3*ci;
diff[0] -= m[0]; diff[1] -= m[1]; diff[2] -= m[2];
--- 119,125 ----
double res = 0;
if( coefs[ci] > 0 )
{
! CV_Assert( covDeterms[ci] > std::numeric_limits<double>::epsilon() );
Vec3d diff = color;
double* m = mean + 3*ci;
diff[0] -= m[0]; diff[1] -= m[1]; diff[2] -= m[2];
***************
*** 173,179 ****
void GMM::endLearning()
{
- const double variance = 0.01;
for( int ci = 0; ci < componentsCount; ci++ )
{
int n = sampleCounts[ci];
--- 173,178 ----
***************
*** 191,205 ****
c[3] = prods[ci][1][0]/n - m[1]*m[0]; c[4] = prods[ci][1][1]/n - m[1]*m[1]; c[5] = prods[ci][1][2]/n - m[1]*m[2];
c[6] = prods[ci][2][0]/n - m[2]*m[0]; c[7] = prods[ci][2][1]/n - m[2]*m[1]; c[8] = prods[ci][2][2]/n - m[2]*m[2];
- double dtrm = c[0]*(c[4]*c[8]-c[5]*c[7]) - c[1]*(c[3]*c[8]-c[5]*c[6]) + c[2]*(c[3]*c[7]-c[4]*c[6]);
- if( dtrm <= std::numeric_limits<double>::epsilon() )
- {
- // Adds the white noise to avoid singular covariance matrix.
- c[0] += variance;
- c[4] += variance;
- c[8] += variance;
- }
-
calcInverseCovAndDeterm(ci);
}
}
--- 190,195 ----
***************
*** 210,217 ****
if( coefs[ci] > 0 )
{
double *c = cov + 9*ci;
! double dtrm =
! covDeterms[ci] = c[0]*(c[4]*c[8]-c[5]*c[7]) - c[1]*(c[3]*c[8]-c[5]*c[6]) + c[2]*(c[3]*c[7]-c[4]*c[6]);
CV_Assert( dtrm > std::numeric_limits<double>::epsilon() );
inverseCovs[ci][0][0] = (c[4]*c[8] - c[5]*c[7]) / dtrm;
--- 200,214 ----
if( coefs[ci] > 0 )
{
double *c = cov + 9*ci;
! double dtrm = c[0]*(c[4]*c[8]-c[5]*c[7]) - c[1]*(c[3]*c[8]-c[5]*c[6]) + c[2]*(c[3]*c[7]-c[4]*c[6]);
!
! if( !( dtrm > std::numeric_limits<double>::epsilon() ) )
! {
! const double epsilon = 0.00001;
! dtrm = (c[0] + epsilon)*((c[4]+epsilon)*(c[8]+epsilon)-c[5]*c[7]) - c[1]*(c[3]*(c[8]+epsilon)-c[5]*c[6]) + c[2]*(c[3]*c[7]-(c[4]+epsilon)*c[6]);
! }
!
! covDeterms[ci] = dtrm;
CV_Assert( dtrm > std::numeric_limits<double>::epsilon() );
inverseCovs[ci][0][0] = (c[4]*c[8] - c[5]*c[7]) / dtrm;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment