bool intersects(const vector<Point> &contour, const Mat_<uchar> &mask) { Mat_<uchar> c = Mat_<uchar>::zeros(mask.size()); fillConvexPoly(c, contour.data(), contour.size(), 255); /* Below is: bitwise_and(mask, c, c); return countNonZero(c); optimized. */ auto it_m = mask.begin(); auto it_c = c.begin(); while (it_m != mask.end()) { if (*it_m && *it_c) return true; ++it_m, ++it_c; } return false; }
static int inner_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<int>& N,vector<int>& B,vector<unsigned int>& indexToRow){ int count=0; for(;;){ dprintf(("iteration #%d\n",count)); count++; static MatIterator_<double> pos_ptr; int e=-1,pos_ctr=0,min_var=INT_MAX; bool all_nonzero=true; for(pos_ptr=c.begin();pos_ptr!=c.end();pos_ptr++,pos_ctr++){ if(*pos_ptr==0){ all_nonzero=false; } if(*pos_ptr>0){ if(N[pos_ctr]<min_var){ e=pos_ctr; min_var=N[pos_ctr]; } } } if(e==-1){ dprintf(("hello from e==-1\n")); print_matrix(c); if(all_nonzero==true){ return SOLVELP_SINGLE; }else{ return SOLVELP_MULTI; } } int l=-1; min_var=INT_MAX; double min=DBL_MAX; int row_it=0; MatIterator_<double> min_row_ptr=b.begin(); for(MatIterator_<double> it=b.begin();it!=b.end();it+=b.cols,row_it++){ double myite=0; //check constraints, select the tightest one, reinforcing Bland's rule if((myite=it[e])>0){ double val=it[b.cols-1]/myite; if(val<min || (val==min && B[row_it]<min_var)){ min_var=B[row_it]; min_row_ptr=it; min=val; l=row_it; } } } if(l==-1){ return SOLVELP_UNBOUNDED; } dprintf(("the tightest constraint is in row %d with %g\n",l,min)); pivot(c,b,v,N,B,l,e,indexToRow); dprintf(("objective, v=%g\n",v)); print_matrix(c); dprintf(("constraints\n")); print_matrix(b); dprintf(("non-basic: ")); print_matrix(Mat(N)); dprintf(("basic: ")); print_matrix(Mat(B)); } }