如何配置ofdebian xfaceeTracker的AdvancedExample例子

openframeworks
中配置配置ofxFaceTracker的例子指南
1.&&&&&&&&下载ofxFaceTracker-master ,地址为
2.&&&&&&&&将“ofxFaceTracker-master.zip”解压到..\of_v0.8.4_vs_release\addons下并重命名为“ofxFaceTracker”。
3.&&&&&&&&检查ofxFaceTracker中要使用的samples工程文件中.sln和.vcxproj中的路径是否与电脑中实际的路径相符:
4.&&&&&&&&修改完这两项后应该就可以顺利用VS加载例子了。
5.&&&&&&&&加载时可能会由于版本原因提示需要升级,此时点确定即可。
6.&&&&& 我们还需要去下载ofxCv库,链接如下:。下载完后同样解压OF的addons目录下并重命名为ofxCv,ofxCv的内容如下图所示
7.&&&&&&&&接下来需要到 项目-&属性-&C/C++-&常规-&附加包含目录中添加ofxCv库的依赖项(动态或者静态添加都可以):
8.&&&&&&&&最后一步,需要把..\of_v0.8.4_vs_release\addons\ofxFaceTracker\FaceOSC\bin\data目录下的model文件夹拷贝到你使用的例子的 bin\data文件夹下,如果 bin下面没有data文件夹,则新建一个文件夹并命名为 data并把拷过来的model放里面。
9.&&&&&&&&经过以上的操作,现在的程序应该可以顺利编译运行了。
10.&&&&可能遇到的问题有:
a)&&&&&&&&Opencv函数重复定义。这种问题是由于原始的电脑系统中包含opencv环境,但是openframeworks中又包含了不同版本的opencv 导致的。解决方法就是在当前的工程中将继承自环境中的opencv链接删除。
b)&&&&&&&&无法解析的外部符号。主要原因是头文件和路径不对,需要检查依赖项。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1221次
排名:千里之外
原创:11篇opencv 实现图像倒影(渐变)效果【源码】 - 博客频道 - CSDN.NET
心有猛虎 细嗅蔷薇
分类:OpenCV
#include &opencv2/opencv.hpp&
#define RATIO 0.25
#define WEIGHT 2
#define DELTA 20
ALPHA 0.15
int _tmain(int argc, _TCHAR* argv[])
// 准备源图像
IplImage* src = cvLoadImage(&..\\image.jpg&);
int width = src-&
int height = src-&
//cvSetImageROI(src, cvRect(0, (1-RATIO)*height, width, height));
int mir_w =
int mir_h = RATIO*
IplImage* mir = cvCreateImage(cvSize(width, RATIO*height) ,src-&depth, src-&nChannels);
//cvCopy(src, mir);// 拷贝有bug
//cvResetImageROI(src);
// 从源图像拷贝1/4图像作为镜像图像
for (int i=0; i& i++)
for (int j=(1-RATIO)* j& j++)
uchar* pSrc = &CV_IMAGE_ELEM(src, uchar, j, i*3);
uchar* pDst = &CV_IMAGE_ELEM(mir, uchar, (int)(j-(1-RATIO)*height), i*3);
pDst[0] = pSrc[0]; //B
pDst[1] = pSrc[1]; //G
pDst[2] = pSrc[2]; //R
cvFlip(mir, NULL, 0);// 0:上下镜像;1:左右镜像
// 准备最终结果图像
CvSize dstS
dstSize.width =
dstSize.height = height + mir_h;
IplImage* dst = cvCreateImage(dstSize, src-&depth, src-&nChannels);
cvZero(dst);
// 载入源图像到结果图像中
cvSetImageROI(dst, cvRect(0, 0, width, height));
cvCopy(src, dst);
cvResetImageROI(dst);
// 准备镜像图像
IplImage* mask = cvCreateImage(cvSize(mir_w, mir_h), mir-&depth, mir-&nChannels);
CvScalar a = CV_RGB(255, 255, 255);
CvScalar b = CV_RGB(0, 0, 0);
cvSet(mask, a);
CvPoint origin = cvPoint(mir_w/2, 0);
// 光源设在镜像图像上方
//CvPoint center = cvPoint(mir_w/2, mir_h/2);
float distance = (mir_w-1 - origin.x)*
(mir_w-1 - origin.x)+
// 光源与图像右下角的距离
(mir_h-1 - origin.y)*
(mir_h-1 - origin.y);
distance = sqrt(distance);
//double weightB = (b.val[0] - a.val[0])/ // 分别计算BGR三个通道的权重
//double weightG = (b.val[1] - a.val[1])/
//double weightR = (b.val[2] - a.val[2])/
double weight = (b.val[0] - a.val[0])/ // 计算BGR三个通道的权重 -1.72
for ( int i=0; i&mask-& i++)
for (int j=0; j&mask-& j++)
float dist = WEIGHT*(j-origin.y)*(j-origin.y);
dist = sqrt(dist);
uchar* ptr = &CV_IMAGE_ELEM(mask, uchar, j, i*3);
ptr[0] = cvRound(ptr[0] + weight*dist-DELTA); //B
ptr[1] = cvRound(ptr[1] + weight*dist-DELTA); //G
ptr[2] = cvRound(ptr[2] + weight*dist-DELTA); //R
cvAddWeighted(mir,ALPHA , mask, BETA, 0, mir);
// 载入镜像图像到结果图像中
cvSetImageROI(dst, cvRect(0, height, mir_w, mir_h));
cvCopy(mir, dst);
cvResetImageROI(dst);
cvNamedWindow( &test&, 1);
cvShowImage( &test&, dst);
cvWaitKey();
// 释放资源
cvDestroyWindow(&test&);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&mask);
cvReleaseImage(&mir);
运行结果如下:
panda1234lee
排名:第6850名
(2)(6)(42)(41)(20)(9)(8)(11)(19)(19)(4)(4)(10)(17)(17)(2)(2)(11)(4)(31)(15)(15)(1)(1)(3)(5)(4)(2)(3)(14)(2)(4)(3)(3)(2)(11)OpenGL深入探索——缓冲区对象(*BO) - 博客频道 - CSDN.NET
心有猛虎 细嗅蔷薇
分类:OpenGL
转载自:http://blog.csdn.net/afei198409/article/details/8267300
缓冲区对象
许多OpenGL操作都向OpenGL发送一大块数据,例如向它传递需要处理的顶点数组数据。传输这种数据可能非常简单,例如把数据从系统的内存中复制到图形卡。但是,由于OpenGL是按照客户机-服务器模式设计的,在OpenGL需要数据的任何时候,都必须把数据从客户机内存传输到服务器。如果数据并没有修改,或者客户机和服务器位于不同的计算机(分布式渲染),数据的传输可能会比较缓慢,或者是冗余的。
OpenGL 1.5版本增加了缓冲区对象(buffer object),允许应用程序地指定把哪些数据存储在图形服务器中。
当前版本的OpenGL使用了很多不同类型的缓冲区对象:
1. 从OpenGL 1.5开始,数组中的顶点数据可以存储在服务器端缓冲区对象中。
2. 在OpenGL 2.1中,加入了在缓冲区对象中存储像素数据(例如,纹理贴图或像素块(PBO))的支持。
3. OpenGL 3.1增加了统一缓冲对象(uniform buffer object,UBO)以存储成块的、用于着色器的统一变量数据。
创建缓冲区对象
任何非零的无符号整数都可以作为缓冲区对象的标识符使用。可以任意选择一个有代表性的值,也可以让OpenGL负责分配和管理这些标识符。两种做法区别是:让OpenGL分配标识符可以保证避免重复使用已被使用的缓冲区对象标识符,从而消除无意修改数据的风险。
为了让OpenGL分配缓冲区对象标识符可调用下面函数:
void glGenBuffers(GLsizei n,GLuint *buffers);
在buffers数组中返回n个当前未使用的缓冲区对象标识。注意在buffers数组中返回的标识名称并不需要是连续的整数。0是一个保留的缓冲区对象名称,从来不会被glGenBuffers()作为缓冲区对象标识返回。
判断一个标识符是否是一个当前被使用的缓冲区对象标识符则调用:
GLboolean glIsBuffer(GLuint buffer);
如果buffer是一个已经绑定的缓冲区对象的名称,而且还没有删除则返回GL_TRUE,否则返回GL_FALSE。
激活缓冲区对象
为了激活缓冲区对象首先需要将它绑定。绑定缓冲区对象表示选择未来的操作将影响哪个缓冲区对象。如果应用程序有多个缓冲区对象,就需要多次调用glBindBuffer()函数:一次用于初始化缓冲区对象以及它的数据,以后的调用要么选择用于渲染的缓冲区对象,要么对缓冲区对象的数据进行更新。
为了禁用缓冲区对象,可以用0作为缓冲区对象的标识符来调用glBindBuffer()函数。这将把OpenGL切换为默认的不使用缓冲区对象的模式。
void glBindBuffer(GLenum target,GLuint buffer);
指定了当前的活动缓冲区对象。参数target必须设置为GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER、GL_PIXEL_UNPACK_BUFFER、GL_COPY_READ_BUFFER、GL_COPY_WRITE_BUFFER、GL_TRANSFORM_FEEDBACK_BUFFER或者GL_UNIFORM_BUFFER。参数buffer指定了将要绑定的缓冲区对象。
glBindBuffer()完成3个任务之一:
1. 当buffer是一个首次使用的非零无符号整数时,它就创建一个新的缓冲区对象,并把buffer分配给这个缓冲区对象,作为它的名称
2. 当绑定到一个以前创建的缓冲区对象时,这个缓冲区对象便成为活动的缓冲区对象
3. 当绑定到一个值为零的buffer时,OpenGL就会停止使用缓冲区对象
用数据分配和初始化缓冲区对象
一旦绑定了一个缓冲区对象,就需要在服务器端分配存储空间。
void glBufferData(GLenum target,GLsizeiptr size,const GLvoid *data,GLenum usage);
分配size个存储单位(通常是字节)的OpenGL服务器内存,用于存储顶点数据或索引。以前所有与当前绑定对象相关联的数据都将删除。
参数target必须为GL_ARRAY_BUFFER(表示顶点数据)、GL_ELEMENT_ARRAY_BUFFER(表示索引数据)、GL_PIXEL_PACK_BUFFER(表示传递给OpenGL像素数据)、GL_PIXEL_UNPACK_BUFFER(表示从OpenGL获取的像素数据)、GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER(表示在缓冲区之间复制数据)、GL_TEXTURE_BUFFER(表示作为纹理缓冲区存储的纹理数据)、GL_TRANSFORM_FEEDBACK_BUFFER(表示执行一个变换反馈着色器的结果)或者GL_UNIFORM_BUFFER(表示统一变量值)。
参数size是存储相关数据所需要的内存数量。该值通常是数据元素的个乘以它们各自的存储长度。
参数data是一个指向客户机内存的指针(用于初始化缓冲区对象),也可以是NULL。如果它传递的是一个有效的指针,size个单位的存储空间就从客户机复制到服务器。如果传递的是NULL,这个函数将会保留size个单位的存储空间供以后使用,但不会对它进行初始化。
参数usage提供了一个提示,就是数据在分配之后将如何进行读取和写入。它有效值包括GL_STREAM_DRAW(流模式)、GL_STREAM_READ(流模式)、GL_STREAM_COPY(流模式)、GL_STATIC_DRAW(静态模式)、GL_STATIC_READ(静态模式)、GL_STATIC_COPY(静态模式)、GL_DYNAMIC_DRAW(动态模式)、GL_DYNAMIC_READ(动态模式)、GL_DYNAMIC_COPY(动态模式)。
数据的读写模式
流模式:缓冲区对象中的数据只被指定一次,并且使用这些数据的频率较低【原作者理解有误,特做修正】
静态模式:缓冲区对象的数据只指定一次,但是使用这些数据的频率很高
动态模式:缓冲区对象的数据不仅常常需要进行更新,而且使用频率也非常高
注意,如果请求分配的内存数量超过了服务器能够分配的内存,glBufferData()将返回GL_OUT_OF_MEMORY错误。如果usage并不是允许使用的值之一,则返回GL_INVALID_VALUE。
更新缓冲区对象的数据
有两种方法可以更新存储在缓冲区对象中的数据
方法一、用提供的数据替换被绑定的缓冲区对象的一些数据子集
void glBufferSubData(GLenum target,GLintptr ofsset,GLsizeiptr size,const GLvoid *data);
用data指向的数据更新与target相关联的当前绑定缓冲区对象中从offset(以字节为单位)开始的size个字节数据。target参数与glBufferData的target参数一致。
注意,如果size小于0或者size+offset大于缓冲区对象创建时所指定的大小,glBufferSubData()将产生一个GL_INVALID_VALUE错误。
方法二、选择绑定的缓冲区对象,然后根据需要来写入新值(或简单地读取数据,这取决于内存的访问权限),就像对数组进行赋值一样
GLvoid * glMapBuffer(GLenum target,GLenum access);
返回一个指针,指向与target相关联的当前绑定缓冲区对象的数据存储。target参数与glBufferData的target参数一致。参数access必须是GL_READ_ONLY、GL_WRITE_ONLY或GL_READ_WRITE之一,表示客户可以对数据进行的操作。
注意,如果需要修改缓冲区中的大多数数据,这种方法很有用,但如果有一个很大的缓冲区并且只需要更新很小的一部分值,这种方法效率就很低。这时使用glMapBufferRange()效率更高。它允许只修改所需的范围内的数据值。
GLvoid * glMapBufferRange(GLenum target,GLintptr offset,GLsizeiptr length,GLbitfield access);
完成缓冲区对象的数据更新之后,可以调用glUnmapBuffer()取消对这个缓冲区的映射:
GLboolean glUnmapBuffer(GLenum target);
表示对当前绑定缓冲区对象的更新已经完成,并且这个缓冲区可以释放。
在缓冲区对象之间复制数据
如何把数据一个缓冲区对象复制到另一个缓冲区对象呢?
在OpenGL 3.1以前版本中,这个过程分两步:
1. 把数据从缓冲区对象复制到应用程序的内存中。
2. 绑定到新的缓冲区对象,然后更新该缓冲区对象的数据。
在OpenGL 3.1中
glCopyBufferSubData()用于复制数据,而不需要迫使数据在应用程序的内存中做短暂停留。
void glCopyBufferSubData(GLenum readbuffer,GLenum writebuffer,GLintptr readoffset,GLintptr writeoffset,GLsizeiptr size);
把数据从与readbuffer相关联的缓冲区对象复制到绑定到writebuffer的缓冲区对象。参数readbuffer和writebuffer与glBufferData的target参数一致。readoffset、writeoffset为偏移量,size为复制到数据的数量。
清除缓冲区对象
完成了对缓冲区对象的操作之后,可以释放它的资源,并使它的标识可以其他缓冲区对象使用。
void glDeleteBuffers(GLsizei n,const GLuint *buffers);
删除n个缓冲区对象,它们的标识名称就是buffers数组的元素。
注意,如果试图删除不存在的缓冲区对象或标识为0的缓冲区对象,该操作将被忽略,并不会产生错误。
示例:使用缓冲区对象存储顶点数组数据,并绘制
#define BUFFER_OFFSET(bytes) ((GLubyte *)NULL+(bytes))
GLuint buffers[2];
GLfloat vertices[][3]={ //包含顶点数据
{-1.0, -1.0, -1.0},
{1.0, -1.0, -1.0},
{1.0, 1.0, -1.0},
{-1.0, 1.0, -1.0},
{-1.0, -1.0, 1.0},
{1.0, -1.0, 1.0},
{1.0, 1.0, 1.0},
{-1.0, 1.0, 1.0}
GLbyte indices[][4]={ //包含索引数据
{0,1,2,3},
{4,7,6,5},
{0,4,5,1},
{3,2,6,7},
{0,3,7,4},
glGenBuffers(2,buffers);
//生成缓冲区对象标识符
glBindBuffer(GL_ARRAY_BUFFER,buffers[0]);
//绑定顶点缓冲区对象
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices,GL_STATIC_DRAW); //请求数据的存储空间并用指定数据进行初始化
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,buffers[1]);
//绑定索引缓冲区对象
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices), indices,GL_STATIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
//启用顶点数组
glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));
//指定顶点数组数据
glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,BUFFER_OFFSET(0));
//根据索引绘图(注意:顶点数据和索引各自使用不同的缓冲区)
若没有使用缓冲区对象,则上面这段代码传进的偏移量
glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));
glDrawElements(GL_QUADS,24,GL_UNSIGNED_BYTE,BUFFER_OFFSET(0));
应该是这样改成实际的客户端数据指针
glVertexPointer(3,GL_FLOAT,0, vertices);
glDrawElements(GL_QUADS,24, indices);
使用缓冲区对象后,类似glVertexPointer()这种以指针为参数的OpenGL函数不再从指针所指位置取数据,函数会先把指针转化为整数,假设转化后的结果为k,则会从当前缓冲区的第k个字节开始取数据(NULL转化为整数后通常是0,即缓冲区最开始的位置)。
转载自:http://blog.csdn.net/afei198409/article/details/8267300
panda1234lee
排名:第6850名
(2)(6)(42)(41)(20)(9)(8)(11)(19)(19)(4)(4)(10)(17)(17)(2)(2)(11)(4)(31)(15)(15)(1)(1)(3)(5)(4)(2)(3)(14)(2)(4)(3)(3)(2)(11)APK反破解技术小结-转自ZhWeir - 博客频道 - CSDN.NET
心有猛虎 细嗅蔷薇
分类:Android进阶
由于Android安装包APK文件仅仅是一个简单的zip包,导致了APK文件很容易被反编译。这不仅威胁到软件开发公司及程序开发人员的知识产权,而且成为了恶意程序滋生的温床。
&&&&那么如何增加APK被破解的难度,保障APK程序的安全性呢?这段时间里,我总结了一些技术上可行的方法。它们包括如下几篇文章。
&&&&为了方便大家查找,特意在这里做个小结,将连接整理在此,方便大家阅读。之所以将这几篇文章的整理称为“小结”,是因为这远远算不上“总结”。希望大家多多交流,随时留言发表自己的想法,多多补充、指正。谢谢了!
&&&&Android代表了移动互联网时代的兴起,它将广泛运行在各种移动终端之上。有机构数据预测,移动互联网时代的终端数量将是PC时代终端设备数量的10倍以上。并且移动终端本身的特点决定了它比PC更为私有化。因此它的安全性、隐私保护性将比PC时代的安全和隐私保护更为受到用户、媒体和机构的关注。
&&&&Android这个可爱的小绿人从出生到现在,满打满算也只有三周岁而已。它的安全领域存在着太多的空白等着我们去开拓和填补。这既是挑战,也是机遇。希望大家能借看雪论坛Android软件安全板块这个平台,多多交流,相互学习,共同迎接移动互联网软件安全的春天!&&
panda1234lee
排名:第6850名
(2)(6)(42)(41)(20)(9)(8)(11)(19)(19)(4)(4)(10)(17)(17)(2)(2)(11)(4)(31)(15)(15)(1)(1)(3)(5)(4)(2)(3)(14)(2)(4)(3)(3)(2)(11)

我要回帖

更多关于 ofxfacetracker 的文章

 

随机推荐