inline void bi::SparseStaticUpdaterVisitorHost<B,S,L,PX,OX>::accept( State<B,ON_HOST>& s, const Mask<L>& mask, const int p, const PX& pax, OX& x) { typedef typename front<S>::type front; typedef typename pop_front<S>::type pop_front; typedef typename front::target_type target_type; typedef typename front::coord_type coord_type; const int id = var_id<target_type>::value; int ix = 0; coord_type cox; if (mask.isDense(id)) { while (ix < mask.getSize(id)) { front::simulates(s, p, ix, cox, pax, x); ++cox; ++ix; } } else if (mask.isSparse(id)) { while (ix < mask.getSize(id)) { cox.setIndex(mask.getIndex(id, ix)); front::simulates(s, p, ix, cox, pax, x); ++ix; } } SparseStaticUpdaterVisitorHost<B,pop_front,L,PX,OX>::accept(s, mask, p, pax, x); }
float operator*(const Mask& mask1, const Mask& mask2) { if(mask1.getSize() != mask2.getSize()) return 0.0; int size = mask1.getSize(); double sum = 0.0; for(int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { sum += mask1.get(i, j)*mask2.get(size - i - 1, size - j - 1); } } sum /= size*size; return sum; }
void convolution(Mat& img, Mask mask) { Mat image; img.copyTo(image); int cols = image.cols; int rows = image.rows; int size = mask.getSize(); Mask mask_temp; if(cols < size || rows < size) return; for (int i = size/2; i < rows-size/2; i++) { for (int j = size/2; j < cols-size/2; j++) { for (int k = 0; k < 3; ++k) { mask_temp.extractMaskFromImage(image, i, j, size, k); float convolution = mask_temp*mask; img.at<Vec3b>(i, j)[k] = convolution; } } } }