//void matchBp( bool * pr, const bool * pa, const bool * pb, int W, int H, double max_r ) { // using namespace EvalPrivate; // matchAny( pr, pa, pb, W, H, max_r ); // float r2 = max_r*max_r*(W*W+H*H); // const int rd = (int) ceil(sqrt(r2)); // // Compute the bipartite graph size // std::vector<int> ia(W*H,-1), ib(W*H,-1); // int ca=0,cb=0; // for( int j=0; j<H; j++ ) // for( int i=0; i<W; i++ ) { // if( pr[j*W+i+0] ) // ia[j*W+i] = ca++; // if( pr[j*W+i+W*H] ) // ib[j*W+i] = cb++; // } // // std::vector< BipartiteMatch::Edge > edges; // for( int j=0; j<H; j++ ) // for( int i=0; i<W; i++ ) // if( ia[j*W+i]>=0 ) // for( int jj=std::max(j-rd,0); jj<=std::min(j+rd,H-1); jj++ ) // for( int ii=std::max(i-rd,0); ii<=std::min(i+rd,W-1); ii++ ) // if( (i-ii)*(i-ii)+(j-jj)*(j-jj) <= r2 ) // if( ib[jj*W+ii]>=0 ) // edges.push_back( BipartiteMatch::Edge(ia[j*W+i],ib[jj*W+ii]) ); // // BipartiteMatch match( ca, cb, edges ); // for( int j=0; j<H; j++ ) // for( int i=0; i<W; i++ ) { // if( ia[j*W+i]>=0 ) // pr[j*W+i+0] = (match.match_a[ ia[j*W+i] ]>=0); // if( ib[j*W+i]>=0 ) // pr[j*W+i+W*H] = (match.match_b[ ib[j*W+i] ]>=0); // } //} //np::ndarray matchBp(const np::ndarray & a, const np::ndarray & b, double max_r ) { // checkArray( a, bool, 2, 2, true ); // checkArray( b, bool, 2, 2, true ); // int H = a.shape(0), W = a.shape(1); // if( H != b.shape(0) || W != b.shape(1) ) // throw std::invalid_argument( "a and b need to have the same shape!\n" ); // np::ndarray r = np::zeros( make_tuple(2,H,W), a.get_dtype() ); // matchBp( (bool*)r.get_data(), (const bool*)a.get_data(), (const bool*)b.get_data(), W, H, max_r ); // return r; //} Vector4i evalBoundaryBinary( const RMatrixXb & d, const std::vector<RMatrixXb> & bnd, double max_r, const RMatrixXb & mask ) { const int W = d.cols(), H = d.rows(), D = bnd.size(); eassert( mask.cols() == W && mask.rows() == H ); int sum_r=0, cnt_r=0; RMatrixXb ma, mb, acc = RMatrixXb::Zero(H,W); for( int k=0; k<D; k++ ) { eassert( W == bnd[k].cols() && H == bnd[k].rows() ); std::tie(ma,mb) = matchBp( d, bnd[k], max_r ); acc = acc.array() || (ma.array() && mask.array()); sum_r += (bnd[k].array() && mask.array()).cast<int>().sum(); cnt_r += (mb.array() && mask.array()).cast<int>().sum(); } int sum_p = (d.array() && mask.array()).cast<int>().sum(); int cnt_p = (acc.array() && mask.array()).cast<int>().sum(); return Vector4i(cnt_r,sum_r,cnt_p,sum_p); }
TEST(Vision, load_default_color_config) { RMatrixXb config = load_single_color_config(default_yellow_config, Vision::COLOR_MASK_TYPE::YELLOW); ASSERT_TRUE((config.array() > 0).any()); config *=4; write_png_file("/tmp/conf.png",config.cast<uint8_t>()); }