OpenCV——LBP(Local Binary Patterns)特征检测
#include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h" using namespace cv;
using namespace std; Mat src, gray_src; const char* output_tt = "LBP Result"; int main(int argc, char** argv) {
src = imread("test.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
} namedWindow("input image", CV_WINDOW_AUTOSIZE);
namedWindow(output_tt, CV_WINDOW_AUTOSIZE);
imshow("input image", src); // convert to gray
cvtColor(src, gray_src, COLOR_BGR2GRAY);
int width = gray_src.cols;
int height = gray_src.rows; // 基本LBP演示
Mat lbpImage = Mat::zeros(gray_src.rows - , gray_src.cols - , CV_8UC1);//3*3窗口,边界有左右各1个像素不处理
for (int row = ; row < height - ; row++) {
for (int col = ; col < width - ; col++) {
uchar c = gray_src.at<uchar>(row, col);//获取中心像素值
uchar code = ;//特征码
code |= (gray_src.at<uchar>(row - , col - ) > c) << ;
code |= (gray_src.at<uchar>(row - , col) > c) << ;
code |= (gray_src.at<uchar>(row - , col + ) > c) << ;
code |= (gray_src.at<uchar>(row, col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col) > c) << ;
code |= (gray_src.at<uchar>(row + , col - ) > c) << ;
code |= (gray_src.at<uchar>(row, col - ) > c) << ;
lbpImage.at<uchar>(row - , col - ) = code;//原图1,1=效果图0,0
}
}
imshow(output_tt, lbpImage); waitKey();
return ;
}
LBP的扩展(多尺度表达):
#include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h" using namespace cv;
using namespace std; Mat src, gray_src;
int current_radius = ;
int max_count = ; const char* output_tt = "LBP Result"; void ELBP_Demo(int, void*);
int main(int argc, char** argv) {
src = imread("test.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -;
} namedWindow("input image", CV_WINDOW_AUTOSIZE);
namedWindow(output_tt, CV_WINDOW_AUTOSIZE);
imshow("input image", src); // convert to gray
cvtColor(src, gray_src, COLOR_BGR2GRAY);
int width = gray_src.cols;
int height = gray_src.rows; // 基本LBP演示
Mat lbpImage = Mat::zeros(gray_src.rows - , gray_src.cols - , CV_8UC1);//3*3窗口,边界有左右各1个像素不处理
for (int row = ; row < height - ; row++) {
for (int col = ; col < width - ; col++) {
uchar c = gray_src.at<uchar>(row, col);//获取中心像素值
uchar code = ;//特征码
code |= (gray_src.at<uchar>(row - , col - ) > c) << ;
code |= (gray_src.at<uchar>(row - , col) > c) << ;
code |= (gray_src.at<uchar>(row - , col + ) > c) << ;
code |= (gray_src.at<uchar>(row, col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col + ) > c) << ;
code |= (gray_src.at<uchar>(row + , col) > c) << ;
code |= (gray_src.at<uchar>(row + , col - ) > c) << ;
code |= (gray_src.at<uchar>(row, col - ) > c) << ;
lbpImage.at<uchar>(row - , col - ) = code;
}
}
imshow(output_tt, lbpImage); // ELBP 演示 namedWindow("ELBP Result", CV_WINDOW_AUTOSIZE);
createTrackbar("ELBP Radius:", "ELBP Result", ¤t_radius, max_count, ELBP_Demo);
ELBP_Demo(, ); waitKey();
return ;
} void ELBP_Demo(int, void*) {
int offset = current_radius * ;//输出图无法计算到的边界宽度
Mat elbpImage = Mat::zeros(gray_src.rows - offset, gray_src.cols - offset, CV_8UC1);
int width = gray_src.cols;
int height = gray_src.rows; int numNeighbors = ;//应根据半径变化,为了简便这里固定为8
for (int n = ; n < numNeighbors; n++) {
float x = static_cast<float>(current_radius) * cos(2.0 * CV_PI*n / static_cast<float>(numNeighbors));//x=r*cos(2*PI*n/8)
float y = static_cast<float>(current_radius) * -sin(2.0 * CV_PI*n / static_cast<float>(numNeighbors)); int fx = static_cast<int>(floor(x));//floor“向下取整”
int fy = static_cast<int>(floor(y));
int cx = static_cast<int>(ceil(x));//ceil“向上取整”
int cy = static_cast<int>(ceil(y)); //双线性插值
float ty = y - fy;
float tx = x - fx; //双线性插值,周边4个点的权重
float w1 = ( - tx)*( - ty);
float w2 = tx * ( - ty);
float w3 = ( - tx)* ty;
float w4 = tx * ty; for (int row = current_radius; row < (height - current_radius); row++) {
for (int col = current_radius; col < (width - current_radius); col++) {
float t = w1 * gray_src.at<uchar>(row + fy, col + fx) + w2 * gray_src.at<uchar>(row + fy, col + cx) +
w3 * gray_src.at<uchar>(row + cy, col + fx) + w4 * gray_src.at<uchar>(row + cy, col + cx);
elbpImage.at<uchar>(row - current_radius, col - current_radius) +=
((t > gray_src.at<uchar>(row, col)) && (abs(t - gray_src.at<uchar>(row, col)) > std::numeric_limits<float>::epsilon())) << n;
}
}
}
imshow("ELBP Result", elbpImage);
return;
}
OpenCV——LBP(Local Binary Patterns)特征检测的更多相关文章
- 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性
Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...
- LBP(Local Binary Patterns)局部二进制模式
1. LBP 用于人脸识别 为了预测每个像素属于哪个脸部器官(眼睛.鼻子.嘴.头发),通常的作法是在该像素周围取一个小的区域,提取纹理特征(例如局部二值模式),再基于该特征利用支持向量机等浅层模型分类 ...
- 机器视觉 Local Binary Pattern (LBP)
Local binary pattern (LBP),在机器视觉领域,是非常重要的一种特征.LBP可以有效地处理光照变化,在纹理分析,纹理识别方面被广泛应用. LBP 的算法非常简单,简单来说,就是对 ...
- 【C++版】Face Alignment at 3000 FPS by Regressing Local Binary Features源码下载
下载地址: 本帖隐藏的内容 <ignore_js_op> face-alignment-in-3000fps-master.zip (794.42 KB, 下载次数: 1076) 该源码采 ...
- Local Binary Convolutional Neural Networks ---卷积深度网络移植到嵌入式设备上?
前言:今天他给大家带来一篇发表在CVPR 2017上的文章. 原文:LBCNN 原文代码:https://github.com/juefeix/lbcnn.torch 本文主要内容:把局部二值与卷积神 ...
- Vulkan移植GpuImage(三)从A到C的滤镜
前面移植了几个比较复杂的效果后,算是确认了复杂滤镜不会对框架造成比较大的改动,开始从头移植,现已把A到C的所有滤镜用vulkan的ComputeShader实现了,讲一些其中实现的过程. Averag ...
- 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法
opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...
- [分享] 采用opencv_cascadetrain进行训练的步骤及注意事项 [复制链接]
http://f.dataguru.cn/thread-725364-1-1.html 很有用的一个帖子 转自:http://blog.csdn.net/xidianzhimeng/article/d ...
- Opencv之LBP特征(算法)
LBP(Local Binary Pattern),即局部二进制模式,对一个像素点以半径r画一个圈,在圈上取K个点(一般为8),这K个点的值(像素值大于中心点为1,否则为0)组成K位二进制数.此即局部 ...
随机推荐
- HDU1054(KB10-H 最小顶点覆盖)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- CSS计数器(序列数字字符自动递增)详解———张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4303 一.挖坟不可耻 ...
- python学习之老男孩python全栈第九期_day014作业
0. 默写a. 生成器函数获取移动平均值例子: def init(func): def inner(*args,**kwargs): ret = func(*args,**kwargs) ret.__ ...
- python-建造者模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 假如要组装一台电脑,将主板,CPU,内存等部件按照某个稳定的步骤组合,基本过程是 ...
- Gruntfile.js文件配置项
GRUNT安装与配置 Posted on 2016-08-19 18:13 听风吹来的种子 阅读(47) 评论(0) 编辑 收藏 安装 CLI npm install -g grunt-cli//全局 ...
- 解读 --- 基于微软企业商务应用平台 (Microsoft Dynamics 365) 之上的人工智能 (AI) 解决方案
9月25日微软今年一年一度的Ignite 2017在佛罗里达州奥兰多市还是如期开幕了.为啥这么说?因为9月初五级飓风厄玛(Hurricane Irma) 在佛罗里达州登陆,在当地造成了挺大的麻烦.在这 ...
- VBoxManage翕令
VBoxManage list vms VBoxManage startvm dcsvr08 -type vrdp VBoxHeadless -startvm "dcsvr08" ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- SVN switch 用法总结
一直知道SVN有个switch命令,但是对它的介绍教程却很少,大多是生硬的svn帮助文档里的文字,从而一直不怎么会用.今天看了这篇文章,突觉豁然开朗,整理下来以备查阅. 使用SVN,自然是需要与别人合 ...
- Array常用方法总结
一.[常用语法] 1.1.数组的创建var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定 ...