void CropLayerImpl::allocate(const std::vector<Blob *> &inputs, std::vector<Blob> &outputs) { CV_Assert(2 == inputs.size()); const Blob &inpBlob = *inputs[0]; const Blob &inpSzBlob = *inputs[1]; int start_axis = inpBlob.canonicalAxis(startAxis); int dims = inpBlob.dims(); std::vector<int> offset_final(dims, 0); if (offset.size() == 1) { for (int i = start_axis; i < dims; i++) offset_final[i] = offset[0]; } else if (offset.size() > 1) { if ((int)offset.size() != dims - start_axis) CV_Error(Error::StsBadArg, "number of offset values specified must be equal to the number of dimensions following axis."); for (int i = start_axis; i < dims; i++) offset_final[i] = offset[i - start_axis]; } BlobShape dstShape = inpBlob.shape(); crop_ranges.resize(dims, Range::all()); for (int i = start_axis; i < dims; i++) { dstShape[i] = inpSzBlob.size(i); if (!offset.empty()) //normal case { if (offset_final[i] < 0 || offset_final[i] + inpSzBlob.size(i) > inpBlob.size(i)) CV_Error(Error::StsBadArg, "invalid crop parameters"); crop_ranges[i] = Range(offset_final[i], offset_final[i] + inpSzBlob.size(i)); } else //detect offset automatically so that cropped image is center of original one { if (inpSzBlob.size(i) > inpBlob.size(i)) CV_Error(Error::StsBadArg, "invalid output blob size"); int cur_crop = (inpBlob.size(i) - inpSzBlob.size(i)) / 2; crop_ranges[i] = Range(cur_crop, cur_crop + inpSzBlob.size(i)); } } outputs.resize(1); outputs[0].create(dstShape); }
void finalize(const std::vector<Mat *> &inputs, std::vector<Mat> &outputs) { CV_Assert(2 == inputs.size()); const Mat &inpBlob = *inputs[0]; const Mat &inpSzBlob = *inputs[1]; int dims = inpBlob.dims; int start_axis = clamp(startAxis, dims); std::vector<int> offset_final(dims, 0); if (offset.size() == 1) { for (int i = start_axis; i < dims; i++) offset_final[i] = offset[0]; } else if (offset.size() > 1) { if ((int)offset.size() != dims - start_axis) CV_Error(Error::StsBadArg, "number of offset values specified must be " "equal to the number of dimensions following axis."); for (int i = start_axis; i < dims; i++) offset_final[i] = offset[i - start_axis]; } crop_ranges.resize(dims, Range::all()); for (int i = 0; i < dims; i++) { if( i < start_axis ) continue; if (!offset.empty()) //normal case { if (offset_final[i] < 0 || offset_final[i] + inpSzBlob.size[i] > inpBlob.size[i]) CV_Error(Error::StsBadArg, "invalid crop parameters"); crop_ranges[i] = Range(offset_final[i], offset_final[i] + inpSzBlob.size[i]); } else //detect offset automatically so that cropped image is center of original one { if (inpSzBlob.size[i] > inpBlob.size[i]) CV_Error(Error::StsBadArg, "invalid output blob size"); int cur_crop = (inpBlob.size[i] - inpSzBlob.size[i]) / 2; crop_ranges[i] = Range(cur_crop, cur_crop + inpSzBlob.size[i]); } } }