domains / / opencv/opencv
Use optimized functions
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.
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:
- Use
inRange()instead of custom saturation checks (Discussion 7) - Use
cv::sum()for channel operations instead of manually splitting and summing (Discussion 9) - Consider converting frequently used operations to vectorized functions that can leverage SIMD instructions (Discussion 10, 17)
- Use mathematical functions with scalar parameters when available, such as
divide(src, 2, dst)instead of creating intermediate matrices (Discussion 20) - Use OpenCV’s metrics functions like
cv::PSNR()instead of custom implementations (Discussion 42) - Prefer
cv::RNGover 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;
}