标签:mask color rate enter 源码 size nbsp exp spec
getStructuringElement函数归属于形态学,可以建立指定大小、形状的结构;
原型:
/** @brief Returns a structuring element of the specified size and shape for morphological operations. The function constructs and returns the structuring element that can be further passed to cv::erode, cv::dilate or cv::morphologyEx. But you can also construct an arbitrary binary mask yourself and use it as the structuring element. @param shape Element shape that could be one of cv::MorphShapes @param ksize Size of the structuring element. @param anchor Anchor position within the element. The default value \f$(-1, -1)\f$ means that the anchor is at the center. Note that only the shape of a cross-shaped element depends on the anchor position. In other cases the anchor just regulates how much the result of the morphological operation is shifted. */ CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
源码解析:
cv::Mat cv::getStructuringElement(int shape, Size ksize, Point anchor) { int i, j; int r = 0, c = 0; double inv_r2 = 0; CV_Assert( shape == MORPH_RECT || shape == MORPH_CROSS || shape == MORPH_ELLIPSE ); //目前支持三种形状的单元创建: 矩形, 十字形, 椭圆形; anchor = normalizeAnchor(anchor, ksize); //当默认为-1,-1时, 计算anchor; if( ksize == Size(1,1) ) //当给定大小为1,1时,表明是一个点, 可以用矩形来表示; shape = MORPH_RECT; if( shape == MORPH_ELLIPSE ) //椭圆; { r = ksize.height/2; c = ksize.width/2; inv_r2 = r ? 1./((double)r*r) : 0; } Mat elem(ksize, CV_8U); for( i = 0; i < ksize.height; i++ ) //对每一行,计算0,1的范围; { uchar* ptr = elem.ptr(i); int j1 = 0, j2 = 0; if( shape == MORPH_RECT || (shape == MORPH_CROSS && i == anchor.y) ) //矩形,或十字y锚点时 j2为ksize.width; j2 = ksize.width; else if( shape == MORPH_CROSS ) j1 = anchor.x, j2 = j1 + 1; else //椭圆; { int dy = i - r; if( std::abs(dy) <= r ) { int dx = saturate_cast<int>(c*std::sqrt((r*r - dy*dy)*inv_r2)); //计算得到x的偏移; j1 = std::max( c - dx, 0 ); j2 = std::min( c + dx + 1, ksize.width ); } } for( j = 0; j < j1; j++ ) //从这三个for可以看出, (0,j1)之间为 0, (j1, j2)之间为1, (j2, ksize.width)之间为0; ptr[j] = 0; for( ; j < j2; j++ ) ptr[j] = 1; for( ; j < ksize.width; j++ ) ptr[j] = 0; } return elem; }
opencv源码学习: getStructuringElement函数;
标签:mask color rate enter 源码 size nbsp exp spec
原文地址:https://www.cnblogs.com/yinwei-space/p/9833294.html