// special case to handle "integer" overflow in accumulator
const size_t esz = src1.elemSize();
const int total = (int)it.size;
- const int intSumBlockSize = normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15);
+ const int intSumBlockSize = (normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15))/cn;
const int blockSize = std::min(total, intSumBlockSize);
int isum = 0;
int count = 0;
EXPECT_EQ((double)20*cn, cv::norm(a, b, NORM_L1, mask));
}
+TEST(Core_Norm, NORM_L2_8UC4)
+{
+ // Tests there is no integer overflow in norm computation for multiple channels.
+ const int kSide = 100;
+ cv::Mat4b a(kSide, kSide, cv::Scalar(255, 255, 255, 255));
+ cv::Mat4b b = cv::Mat4b::zeros(kSide, kSide);
+ const double kNorm = 2.*kSide*255.;
+ EXPECT_EQ(kNorm, cv::norm(a, b, NORM_L2));
+}
TEST(Core_ConvertTo, regression_12121)
{