圆形 LBP 特征

template <typename _Tp> static
	inline void elbp_(InputArray _src, OutputArray _dst,
		int radius, int neighbors) {
		// 得到数据矩阵
		Mat src = _src.getMat();
		// 输出矩阵
		_dst.create(src.rows-2*radius, 
           src.cols-2*radius, CV_32SC1);
		Mat dst = _dst.getMat();
		// 初始化
		dst.setTo(0);
		for(int n=0; n<neighbors; n++) {
			// 相同点
			float x = static_cast<float>(-radius * sin(2.0
				*CV_PI*n/static_cast<float>(neighbors)));
			float y = static_cast<float>(radius * cos(2.0
				*CV_PI*n/static_cast<float>(neighbors)));
			// 相关索引
			int fx = static_cast<int>(floor(x));
			int fy = static_cast<int>(floor(y));
			int cx = static_cast<int>(ceil(x));
			int cy = static_cast<int>(ceil(y));
			// 小数部分
			float ty = y - fy;
			float tx = x - fx;
			// 集插值权重
			float w1 = (1 - tx) * (1 - ty);
			float w2 =      tx  * (1 - ty);
			float w3 = (1 - tx) *      ty;
			float w4 =      tx  *      ty;
			// 遍历数据
			for(int i=radius; i < src.rows-radius;i++) {
				for(int j=radius;j < src.cols-radius;j++) {
					// 插值计算值
					float t = static_cast<float>(
                      w1*src.at<_Tp>(i+fy,j+fx) 
						+ w2*src.at<_Tp>(i+fy,j+cx) + 
                     w3*src.at<_Tp>(i+cy,j+fx)
						+ w4*src.at<_Tp>(i+cy,j+cx));
					// 限定浮点精度,生成输出图像
					dst.at<int>(i-radius,j-radius) += ((t > 
                   src.at<_Tp>(i,j)) || 
                   (std::abs(t-src.at<_Tp>(i,j)) < 
                   std::numeric_limits<float>::epsilon())) << n;
				}
			}
		}
}



转载:http://blog.csdn.net/zhuwei1988

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值