When implementing algorithms, prefer using OpenCV’s built-in optimized functions over writing custom implementations. OpenCV’s library functions are typically vectorized, extensively tested, and optimized for performance across different platforms and hardware architectures.
Key examples:
inRange()
instead of custom saturation checks (Discussion 7)cv::sum()
for channel operations instead of manually splitting and summing (Discussion 9)divide(src, 2, dst)
instead of creating intermediate matrices (Discussion 20)cv::PSNR()
instead of custom implementations (Discussion 42)cv::RNG
over standard library random generators for deterministic behavior and testability (Discussion 47)Example - Instead of this:
Mat saturate(Mat& src, const double& low, const double& up)
{
Mat dst = Mat::ones(src.size(), CV_8UC1);
MatIterator_<Vec3d> it_src = src.begin<Vec3d>(), end_src = src.end<Vec3d>();
MatIterator_<uchar> it_dst = dst.begin<uchar>();
for (; it_src != end_src; ++it_src, ++it_dst)
{
for (int i = 0; i < 3; ++i)
{
if ((*it_src)[i] > up || (*it_src)[i] < low)
{
*it_dst = 0;
break;
}
}
}
return dst;
}
Use this:
Mat saturate(Mat& src, const double& low, const double& up)
{
Mat dst;
inRange(src, Scalar(low, low, low), Scalar(up, up, up), dst);
return dst;
}
Enter the URL of a public GitHub repository