imgproc模块中常用函数源码
来源:互联网 发布:mysql 查询记录行号 编辑:程序博客网 时间:2024/04/24 07:34
imgproc模块中常用函数源码
一、滤波
1、方框滤波boxFilter()
//! smooths the image using the box filter. Each pixel is processed in O(1) timeCV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT );
void cv::boxFilter( InputArray _src, OutputArray _dst, int ddepth, Size ksize, Point anchor, bool normalize, int borderType ){ Mat src = _src.getMat(); int sdepth = src.depth(), cn = src.channels(); if( ddepth < 0 ) ddepth = sdepth; _dst.create( src.size(), CV_MAKETYPE(ddepth, cn) ); Mat dst = _dst.getMat(); if( borderType != BORDER_CONSTANT && normalize && (borderType & BORDER_ISOLATED) != 0 ) { if( src.rows == 1 ) ksize.height = 1; if( src.cols == 1 ) ksize.width = 1; }#ifdef HAVE_TEGRA_OPTIMIZATION if ( tegra::box(src, dst, ksize, anchor, normalize, borderType) ) return;#endif Ptr<FilterEngine> f = createBoxFilter( src.type(), dst.type(), ksize, anchor, normalize, borderType ); f->apply( src, dst );}
cv::Ptr<cv::FilterEngine> cv::createBoxFilter( int srcType, int dstType, Size ksize, Point anchor, bool normalize, int borderType ){ int sdepth = CV_MAT_DEPTH(srcType); int cn = CV_MAT_CN(srcType), sumType = CV_64F; if( sdepth <= CV_32S && (!normalize || ksize.width*ksize.height <= (sdepth == CV_8U ? (1<<23) : sdepth == CV_16U ? (1 << 15) : (1 << 16))) ) sumType = CV_32S; sumType = CV_MAKETYPE( sumType, cn ); Ptr<BaseRowFilter> rowFilter = getRowSumFilter(srcType, sumType, ksize.width, anchor.x ); Ptr<BaseColumnFilter> columnFilter = getColumnSumFilter(sumType, dstType, ksize.height, anchor.y, normalize ? 1./(ksize.width*ksize.height) : 1); return Ptr<FilterEngine>(new FilterEngine(Ptr<BaseFilter>(0), rowFilter, columnFilter, srcType, dstType, sumType, borderType ));}
2、均值滤波blur()
//! a synonym for normalized box filterCV_EXPORTS_W void blur( InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT );
void cv::blur( InputArray src, OutputArray dst, Size ksize, Point anchor, int borderType ){ boxFilter( src, dst, -1, ksize, anchor, true, borderType );}
3、高斯滤波GaussianBlur()
//! smooths the image using Gaussian filter.CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT );
void cv::GaussianBlur( InputArray _src, OutputArray _dst, Size ksize, double sigma1, double sigma2, int borderType ){ Mat src = _src.getMat(); _dst.create( src.size(), src.type() ); Mat dst = _dst.getMat(); if( borderType != BORDER_CONSTANT && (borderType & BORDER_ISOLATED) != 0 ) { if( src.rows == 1 ) ksize.height = 1; if( src.cols == 1 ) ksize.width = 1; } if( ksize.width == 1 && ksize.height == 1 ) { src.copyTo(dst); return; }#ifdef HAVE_TEGRA_OPTIMIZATION if(sigma1 == 0 && sigma2 == 0 && tegra::gaussian(src, dst, ksize, borderType)) return;#endif#if defined HAVE_IPP && (IPP_VERSION_MAJOR >= 7) if(src.type() == CV_32FC1 && sigma1 == sigma2 && ksize.width == ksize.height && sigma1 != 0.0 ) { IppiSize roi = {src.cols, src.rows}; int bufSize = 0; ippiFilterGaussGetBufferSize_32f_C1R(roi, ksize.width, &bufSize); AutoBuffer<uchar> buf(bufSize+128); if( ippiFilterGaussBorder_32f_C1R((const Ipp32f *)src.data, (int)src.step, (Ipp32f *)dst.data, (int)dst.step, roi, ksize.width, (Ipp32f)sigma1, (IppiBorderType)borderType, 0.0, alignPtr(&buf[0],32)) >= 0 ) return; }#endif Ptr<FilterEngine> f = createGaussianFilter( src.type(), ksize, sigma1, sigma2, borderType ); f->apply( src, dst );}
二、边缘检测
1、Sobel算子
//! applies generalized Sobel operator to the imageCV_EXPORTS_W void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT );
void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy, int ksize, double scale, double delta, int borderType ){ Mat src = _src.getMat(); if (ddepth < 0) ddepth = src.depth(); _dst.create( src.size(), CV_MAKETYPE(ddepth, src.channels()) ); Mat dst = _dst.getMat();#ifdef HAVE_TEGRA_OPTIMIZATION if (scale == 1.0 && delta == 0) { if (ksize == 3 && tegra::sobel3x3(src, dst, dx, dy, borderType)) return; if (ksize == -1 && tegra::scharr(src, dst, dx, dy, borderType)) return; }#endif#if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) if(dx < 3 && dy < 3 && src.channels() == 1 && borderType == 1) { if(IPPDeriv(src, dst, ddepth, dx, dy, ksize,scale)) return; }#endif int ktype = std::max(CV_32F, std::max(ddepth, src.depth())); Mat kx, ky; getDerivKernels( kx, ky, dx, dy, ksize, false, ktype ); if( scale != 1 ) { // usually the smoothing part is the slowest to compute, // so try to scale it instead of the faster differenciating part if( dx == 0 ) kx *= scale; else ky *= scale; } sepFilter2D( src, dst, ddepth, kx, ky, Point(-1,-1), delta, borderType );}
void cv::getDerivKernels( OutputArray kx, OutputArray ky, int dx, int dy, int ksize, bool normalize, int ktype ){ if( ksize <= 0 ) getScharrKernels( kx, ky, dx, dy, normalize, ktype ); else getSobelKernels( kx, ky, dx, dy, ksize, normalize, ktype );}
static void getScharrKernels( OutputArray _kx, OutputArray _ky, int dx, int dy, bool normalize, int ktype ){ const int ksize = 3; CV_Assert( ktype == CV_32F || ktype == CV_64F ); _kx.create(ksize, 1, ktype, -1, true); _ky.create(ksize, 1, ktype, -1, true); Mat kx = _kx.getMat(); Mat ky = _ky.getMat(); CV_Assert( dx >= 0 && dy >= 0 && dx+dy == 1 ); for( int k = 0; k < 2; k++ ) { Mat* kernel = k == 0 ? &kx : &ky; int order = k == 0 ? dx : dy; int kerI[3]; if( order == 0 ) kerI[0] = 3, kerI[1] = 10, kerI[2] = 3; else if( order == 1 ) kerI[0] = -1, kerI[1] = 0, kerI[2] = 1; Mat temp(kernel->rows, kernel->cols, CV_32S, &kerI[0]); double scale = !normalize || order == 1 ? 1. : 1./32; temp.convertTo(*kernel, ktype, scale); }}static void getSobelKernels( OutputArray _kx, OutputArray _ky, int dx, int dy, int _ksize, bool normalize, int ktype ){ int i, j, ksizeX = _ksize, ksizeY = _ksize; if( ksizeX == 1 && dx > 0 ) ksizeX = 3; if( ksizeY == 1 && dy > 0 ) ksizeY = 3; CV_Assert( ktype == CV_32F || ktype == CV_64F ); _kx.create(ksizeX, 1, ktype, -1, true); _ky.create(ksizeY, 1, ktype, -1, true); Mat kx = _kx.getMat(); Mat ky = _ky.getMat(); if( _ksize % 2 == 0 || _ksize > 31 ) CV_Error( CV_StsOutOfRange, "The kernel size must be odd and not larger than 31" ); vector<int> kerI(std::max(ksizeX, ksizeY) + 1); CV_Assert( dx >= 0 && dy >= 0 && dx+dy > 0 ); for( int k = 0; k < 2; k++ ) { Mat* kernel = k == 0 ? &kx : &ky; int order = k == 0 ? dx : dy; int ksize = k == 0 ? ksizeX : ksizeY; CV_Assert( ksize > order ); if( ksize == 1 ) kerI[0] = 1; else if( ksize == 3 ) { if( order == 0 ) kerI[0] = 1, kerI[1] = 2, kerI[2] = 1; else if( order == 1 ) kerI[0] = -1, kerI[1] = 0, kerI[2] = 1; else kerI[0] = 1, kerI[1] = -2, kerI[2] = 1; } else { int oldval, newval; kerI[0] = 1; for( i = 0; i < ksize; i++ ) kerI[i+1] = 0; for( i = 0; i < ksize - order - 1; i++ ) { oldval = kerI[0]; for( j = 1; j <= ksize; j++ ) { newval = kerI[j]+kerI[j-1]; kerI[j-1] = oldval; oldval = newval; } } for( i = 0; i < order; i++ ) { oldval = -kerI[0]; for( j = 1; j <= ksize; j++ ) { newval = kerI[j-1] - kerI[j]; kerI[j-1] = oldval; oldval = newval; } } } Mat temp(kernel->rows, kernel->cols, CV_32S, &kerI[0]); double scale = !normalize ? 1. : 1./(1 << (ksize-order-1)); temp.convertTo(*kernel, ktype, scale); }}
2、
0 0
- imgproc模块中常用函数源码
- highgui模块中常用函数源码
- opencv c++函数 imgproc模块 20 在图像中寻找轮廓
- opencv c++函数 imgproc模块1 图像平滑处理
- opencv c++函数 imgproc模块 3 更多形态学变换
- opencv c++函数 imgproc模块 4 图像金字塔
- opencv c++函数 imgproc模块 5 基本的阈值操作
- opencv c++函数 imgproc模块 7 给图像添加边界
- opencv c++函数 imgproc模块 8 Sobel 导数
- opencv c++函数 imgproc模块 9 Laplace 算子
- opencv c++函数 imgproc模块 10 Canny 边缘检测
- opencv c++函数 imgproc模块 11 霍夫线变换
- opencv c++函数 imgproc模块 12 霍夫圆变换
- opencv c++函数 imgproc模块 13 Remapping 重映射
- opencv c++函数 imgproc模块 14 仿射变换
- opencv c++函数 imgproc模块 15 直方图均衡化
- opencv c++函数 imgproc模块 16 直方图计算
- opencv c++函数 imgproc模块 17 直方图对比
- 桌面小部件创建?
- Google浏览器调试前端代码
- 如何让Alarm类更像一个“闹钟”
- Python操作MySQL
- 目录:LUA深入浅出
- imgproc模块中常用函数源码
- CSS3背景颜色渐变
- C#扩展方法示例
- C++ 虚函数表解析
- android四大组件启动流程 - Service启动流程
- 这些求职名词你真的看得懂吗?
- 庄子_齐物论
- 翻币问题 1457
- Java语法学习4