我一直在OpenCV(开源计算机视觉库)中进行面部检测实验,发现可以使用Haar级联来检测面部,因为其中有几个提供了OpenCV.但是,我注意到还有几个LBP级联.根据OpenCV人脸检测文档,经过一些研究,我发现LBP代表局部二进制模式,也可以用于人脸检测.
我想知道的是哪个更好?哪一个表现得更快,哪一个更准确?似乎LBP表现得更快,但我也不是100%肯定.谢谢.
有人试图在opencv或C++中实现DWT吗?我看到关于这个主题的老帖子,我发现它们对我没用,因为我需要一个近似系数和细节作为小波变换的结果.
我试图将这个(http://wavelet2d.sourceforge.net/)添加到我的项目中,但它没有按计划运行.
这很简单,因为参数我需要近似系数和细节:
void haar1(float *vec, int n, int w)
{
int i=0;
float *vecp = new float[n];
for(i=0;i<n;i++)
vecp[i] = 0;
w/=2;
for(i=0;i<w;i++)
{
vecp[i] = (vec[2*i] + vec[2*i+1])/sqrt(2.0);
vecp[i+w] = (vec[2*i] - vec[2*i+1])/sqrt(2.0);
}
for(i=0;i<(w*2);i++)
vec[i] = vecp[i];
delete [] vecp;
}
void haar2(float **matrix, int rows, int cols)
{
float *temp_row = new float[cols];
float *temp_col = new float[rows];
int i=0,j=0;
int w = cols, h=rows;
while(w>1 || h>1)
{
if(w>1)
{
for(i=0;i<h;i++)
{
for(j=0;j<cols;j++) …Run Code Online (Sandbox Code Playgroud) 我正在开发一个iOS应用程序,需要检测用户何时打哈欠.
我所做的是包括Open CV并使用haar级联找到面孔,然后在面部内找到嘴(也使用haarcascade).
我遇到的麻烦是,我相信能够很容易地发现哈欠像做某事(face.y - mouth.y)<something = yawn.
但我所遇到的问题是面部和嘴部的面积是"不稳定的",我的意思是每次循环运行时,面部和嘴部的X和Y值都是(显然)不一样.
我可以使用任何"张开嘴"的haar级联,或者我怎么知道用户何时张开嘴?
所以我有一个像这样的图像:

我想得到这样的东西(我没有绘制我想要的所有行,但我希望你能得到我的想法):

我想使用SURF((Speeded Up Robust Features)是一个强大的图像描述符,首先由Herbert Bay等人在2006年提出)或基于2D Haar小波响应之和的东西,并有效地使用积分图像找到图像上的所有直线.我想得到相对于图片像素坐标线的起点和终点.
所以在这张照片上找到瓷砖和顶部的那两条黑线之间的所有线条.
是否有任何此类代码示例(具有行搜索功能)从哪个开始?
我喜欢C和C++,但任何其他可读的代码都可能适用于我=)
algorithm image-processing haar-wavelet straight-line-detection
我想基于级联分类器创建一个物体探测器,唯一的问题是LBP和Haar特征不是旋转不变的.我想到的第一件事就是以不同的角度旋转训练样本,但我怀疑得到的分类器会有很好的质量,而且,对象可能有拉长的比例.有许多旋转不变的探测器,例如,iPhone可以在任何方向实时识别面部,所以我想知道它们是如何实现这一目标的?我更喜欢使用OpenCV.
opencv image-processing object-detection computer-vision haar-wavelet
使用CvRect我能够检测面部坐标
detectFace(IplImage * pImg, CvHaarClassifierCascade * pCascade, CvMemStorage * pStorage)
Run Code Online (Sandbox Code Playgroud)
但我的问题是当人微笑时如何找出whitePixelValue?
什么微笑偏移是合适的?150值是否准确?
微笑haarcascade根本不工作.需要使用白色像素的逻辑做一些事情
请帮忙!!!
更新:我认为我的赏金会浪费..没有得到专家对此线程的回应.我在寻找算法:(
我正在尝试使用3340正面图像和1224个负面图像为OpenCV中的行人训练一个类似于haar的分类器.(在.txt文件中我保留负图像名称,即负数(1).bmp,并在txt文件中保留正数,即图片(1).bmp 1 0 0 64 128.实际上正面的例子已经是裁剪图像行人所以我只需要为每个图像指定一个正样本.
在培训过程中的某个时刻,它停止并说:
"Opencv错误:断言失败(elements_read == 1)在未知函数中,文件c:\ path\cvhaartraining.cpp,第1858行"
关于是什么导致这个的任何想法?
在隐写术中,最低有效位(LSB)替换方法将秘密位嵌入来自覆盖介质的位的位置,例如图像像素.在一些方法中,采用图像的离散小波变换(DWT)并且将秘密比特嵌入DWT系数中,之后使用逆变换来重建隐秘图像.
但是,DWT产生浮点系数,对于LSB替换方法,需要整数值.我读过的大多数论文都使用2D Haar Wavelet,但他们的方法并不清楚.我已经看到变换是根据低通和高通滤波器(浮点变换)定义的,或者是取对值的和与差,或者平均值和平均值之差等.
更明确地,无论是正向变换还是反向变换(但不一定取决于所使用的公式),最终将出现浮点数.我不能将它们用于系数,因为替换不起作用,我不能将它们用于重建的像素,因为图像需要整数值来存储.
例如,让我们考虑一对像素,A并B作为一维数组.低频系数由和,即s = A + B高频系数和差值定义,即d = A - B.然后我们可以用B = (s - d) / 2和重建原始像素A = s - B.然而,在任何与系数混合的位之后,s - d可能不再是偶数,并且浮点值将出现用于重建的像素.
对于2D情况,1D变换分别应用于行和列,因此最终会在某处出现4除法.这可能导致具有浮动余数.00,.25,.50和.75的值.我只遇到过一篇解决这个问题的论文.其余的方法都很模糊,我很难复制它们.然而,DWT已经广泛用于图像隐写术.
我的问题是,既然我读过的一些文献没有启发,那怎么可能呢?如何使用引入浮点值的变换,但整个隐写方法需要整数?
如果有人能够完全解释cascade.xml中的数字/值,那将是最好的.示例:
<!-- stage 0 -->
<_>
<maxWeakCount>3</maxWeakCount>
<stageThreshold>-8.8384145498275757e-001</stageThreshold>
<weakClassifiers>
<_>
<internalNodes>
0 -1 66 5.1593100652098656e-003</internalNodes>
<leafValues>
-8.0555558204650879e-001 8.0694979429244995e-001</leafValues></_>
<_>
<internalNodes>
0 -1 108 1.5044789761304855e-002</internalNodes>
<leafValues>
-6.2940740585327148e-001 7.5122624635696411e-001</leafValues></_>
<_>
<internalNodes>
0 -1 99 -4.7172707127174363e-005</internalNodes>
<leafValues>
5.5112153291702271e-001 -8.6111217737197876e-001</leafValues></_></weakClassifiers></_>
Run Code Online (Sandbox Code Playgroud)
这些价值观的含义是什么?
<internalNodes>
0 -1 99 -4.7172707127174363e-005</internalNodes>
Run Code Online (Sandbox Code Playgroud)
另一个问题是,该程序如何知道特定阶段使用哪个功能?据我所知,功能的形式如下
<_>
<rects>
<_>
21 6 3 5 -1.</_>
<_>
22 6 1 5 3.</_></rects>
<tilted>0</tilted></_>
Run Code Online (Sandbox Code Playgroud)
因此它是两个矩形的坐标,形成如下所示:
=-= = Black colored rectangle
=-= - White colored rectangle
=-=
=-=
=-=
Run Code Online (Sandbox Code Playgroud)
什么是值-1.和3意味着什么?我知道它的重量但它是如何用于计算功能的?
摘要
<internalNodes>?<rects>使用重量? …OpenCV Haar级联分类器似乎使用24x24个面部图像作为其正面训练数据.我有两个问题:
我试图在CUDA中为一维数组实现HAAR小波变换.
我在输入数组中有8个索引
在这种情况下,if(x_index>=o_width/2 || y_index>=o_height/2)我将有4个线程,应该是0,2,4,6,我计划在输入中使用每个指针处理handletwo索引.
我计算avg.EG:如果我的线程id是'0' - 然后avg是(输入[0] +输入[1])/ 2然后同时我得到将输入[0]的差异 - avg等等其余的线程.
现在重要的是输出的位置.我为输出创建了一个单独的thread_id,因为使用索引0,2,4,6会在将输出放置在正确的索引中时产生困难.
我的avgs应该放在前4个索引中,即输出的0,1,2,3和o_thread_id应该是0,1,2,3.类似地,为了将差异置于4,5,6,7,我将增加了0,1,2,3,其中"4"如代码所示
我的输出全部归零!无论我改变什么,我都会得到这个.
__global__ void cal_haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{
int x_index=blockIdx.x*blockDim.x+threadIdx.x;
int y_index=blockIdx.y*blockDim.y+threadIdx.y;
if(x_index>=o_width/2 || y_index>=o_height/2) return;
int i_thread_id=y_index*i_widthstep+(2*x_index);
int o_thread_id=y_index*o_widthstep+x_index;
float avg=(input[i_thread_id]+input[i_thread_id+1])/2;
float diff=input[i_thread_id]-avg;
output[o_thread_id]=avg;
output[o_thread_id+4]=diff;
}
void haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{
int * d_input;
float * d_output;
cudaMalloc(&d_input,i_widthstep*o_height);
cudaMalloc(&d_output,o_widthstep*o_height);
cudaMemcpy(d_input,input,i_widthstep*o_height,cudaMemcpyHostToDevice);
dim3 blocksize(16,16);
dim3 gridsize;
gridsize.x=(o_width+blocksize.x-1)/blocksize.x;
gridsize.y=(o_height+blocksize.y-1)/blocksize.y;
cal_haar<<<gridsize,blocksize>>>(d_input,d_output,i_widthstep,o_widthstep,o_width,o_height);
cudaMemcpy(output,d_output,o_widthstep*o_height,cudaMemcpyDeviceToHost);
cudaFree(d_input);
cudaFree(d_output);
} …Run Code Online (Sandbox Code Playgroud)