1.安装虚拟机;
2.安装Mac操作系统;
3.安装Xcode;
4.在Mac OSX上安装配置CMake,版本至少是3.7;
本说明使用的VMWare Station 12,操作系统为macOS High Sierra 版本10.13.3,Xcode版本9.2。如果有MAC电脑可以省去步骤1和2。
1.将名为XJGARSDK-ios-cmake的文件夹导入到虚拟机,放在“桌面”;
2.修改根目录下CMakeList.txt文件:
第4行,修改TEAM_ID为自己的ID号,可在Apple的开发者网站注册,获得TEAM_ID号,在XCode的工具栏里点击perference,在弹出的窗口中,点击左下角+号,将Apple ID加入,在右侧可以看到Team,随后关闭窗口(该步骤获取了Team名,在后面XCode中会用到);
其余几行的修改,只需要修改为相应的自己的工程中所对应的名字;
- 修改完毕,点左上角红色圆点关闭。
- 点击Launchpad->其他->终端,打开命令行窗口,如下图:
- 在命令行中输入 cmake --version,你会发现系统并不认识cmake这个命令。在命令行中输入PATH="/Applications/CMake.app/Contents/bin":"$PATH",如下图所示。此后,再执行跟cmake有关的命令,系统就可以正确识别它了。
- 指定到CMakeList.txt文件所在的路径下,本例CMakeList.txt在Desktop\XJGARSDK-ios-cmake下,因此在命令行中定位该路径,如下图操作:(根据你自己的文件路径,用cd命令来指定路径)
- 点击finder->桌面,选中本例文件夹,将该文件夹下generate-project.sh直接拖入左侧的命令行窗口:
- 按下“Enter”键,等待该脚本文件生成Xcode工程文件,生成成功后,在XJGARSDK-ios-cmake文件夹下会出现一个Xcode文件,双击可以看到一个.xcodeproj文件,这就是Xcode的工程文件。
1.在XCode中运行上面生成的工程文件,在Targets中选中目标文件,设置General,在下图框中,勾选Automatically manage signing,选中Team,下拉框会自动出现前面操作中注册过的Team名,选中后Status会自动更新;
如果发现Status多次更新失败,可以打开XCode的Perference查看,是否需要重新登录,因为网络的关系,有时会掉线,等网络稳定,Status会自动更改。
2.选择运行设备,如下图,在你需要运行的程序上点击后面的三角,用于选择程序需要在哪种设备上运行,如果在真机上做测试,可以将手机接入电脑,在虚拟机中做相关操作(如何将手机接入虚拟机可以自行百度),将手机接入虚拟机,接入成功后在Device中会显示该手机,选中后,点XCode工具栏的 ,即可在手机上运行程序。
- Xcode8.0有很多坑,填完一个又来一个,接入手机运行后,点击手机上的两个功能“Render Image Test”和“Render Camera Test”可能会看到“Thread 1: signal SIGABRT”这样的错误,很多原因都会导致这个错误,请注意看错误提示,我们的代码中因为涉及相册和相机,一般会给出如下的错误提示:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
解决方法:
在上图的Get Info string的下拉框里,选中Privacy-Photo Library Usage Description,在后面的string字段里输入NSPhotoLibraryUsageDescription,这个字段需要自己手动输入,表示使用相册;选中Privacy-Camera Usage Description,在后面的string字段里输入NSCameraUsageDescription,同样需要自己手动输入,表示使用相机。
http://www.xiaojigou.cn 首页-》开发包-》说明文档-》XJGARSDK说明文档
注意:SDK中各个函数需要在单一的线程中调用。
- 初始化
####初始化方法:
XJGARSDK_API bool XJGARSDKInitialization(const char* licenseText,
const char* userName, const char* companyName);
- 第一个参数为key
第二个参数为 key对应的用户名
第三个参数为 key对应的公司名
该参数须申请
####销毁方法:
XJGARSDKCleanUP();
- 使用人脸整形
####大眼:
XJGARSDK_API bool XJGARSDKSetBigEyeParam(int eyeParam);
eyeParam参数为0-100,数值越大眼睛越大
####瘦脸:
XJGARSDK_API bool XJGARSDKSetThinChinParam(int chinParam);
chinParam参数为0-100,数值越大脸部下吧越瘦
####红润:
XJGARSDK_API bool XJGARSDKSetRedFaceParam(int redFaceParam); redFaceParam参数为0-100,数值越大脸部皮肤越红润
####美白:
XJGARSDK_API bool XJGARSDKSetWhiteSkinParam(int whiteSkinParam); whiteSkinParam参数为0-100,数值越大脸部皮肤越白
####磨皮:
XJGARSDK_API bool XJGARSDKSetSkinSmoothParam(int skinSmoothParam);
skinSmoothParam参数为0-100, 数值越大越皮肤越光滑
- 使用人脸滤镜
SDK启动时默认不使用滤镜
####切换滤镜:
XJGARSDK_API bool XJGARSDKChangeFilter(const char* filterTypeName);
filterTypeName参数为滤镜名字,目前可选的滤镜有6种,分别是冰冷,健康,祖母绿,怀旧, 蜡笔, 常青,填入“无”不使用滤镜;
在某些中文输入有问题的状况下可以使用英文参数输入,6种滤镜分别为:"filter_cool", "filter_Healthy","filter_emerald","filter_nostalgia","filter_crayon", "filter_evergreen"。填入"filter_none",不使用滤镜。
- 使用人脸道具
####显示贴纸:
XJGARSDK_API bool XJGARSDKSetShowStickerPapers(bool bShowStickPaper);
bShowStickPaper参数 为true时,显示贴纸
####切换贴纸:
XJGARSDK_API bool XJGARSDKChangeStickpaper(const char* stickPaperName);
stickPaperName参数为贴纸名称,目前可选的贴纸见StickerPapers子文件夹,每个文件夹的名称均是贴纸名称
- 图片视频流处理
//初始化OpenGL 环境
XJGARSDK_API bool XJGARSDKInitOpenglEnvironment(int width, int height);
///if user dont't have opengl environment, call this to set up a virtual opengl environment
///@width: width of input image
///@height: height of input image
///@return true: success, false: fail
///销毁OpenGL环境
XJGARSDK_API bool XJGARSDKDestroyOpenglEnvironment();
///释放OpenGL资源
XJGARSDK_API bool XJGARSDKReleaseAllOpenglResources();
//设置SDK工作模式,0为视频,1为图片
XJGARSDK_API bool XJGARSDKSetOptimizationMode(int mode);
///set different optimization mode for video or image
///@mode: optimization mode, 0: video, 1: image
XJGARSDK_API int XJGARSDKRenderImage(const unsigned char* image, int width, int height, unsigned char* imageBufOut);
前三个是入参,其中image参数是图像RGB数据,width 图像宽带,heifht图像高度
imageBufOut为出参,即经过美颜,滤镜,道具处理后的图像,可用OpenCV的imshow函数直接播放。或者也可以采用doublebuffer方案自行写播放函数
XJGARSDK_API int XJGARSDKRenderImage(const unsigned char* image, int width, int height);
其中image参数是图像RGB数据,width 图像宽带,heifht图像高度
调用该函数后,将在Opengl屏幕缓存中存储最后渲染的结果。
XJGARSDK_API int XJGARSDKRenderImage(const unsigned char* image, int width, int height, int* pOutputTexId);
///input 3 channels RGB image, render to get result opengl texture name
///@width: width of input image
///@height: height of input image
///@outputTexId: result opengl texture name
XJGARSDK_API int XJGARSDKRenderGLTexture(int inputTexId, int width, int height, int* pOutputTexId);
///input opengl texture , render to get result opengl texture
///@inputTexId:input opengl texture
///@width: width of input texture
///@height: height of input texture
///@outputTexId: result opengl texture name
XJGARSDK_API int XJGARSDKRenderGLTexture(int inputTexId, int width, int height);
///input opengl texture , render to opengl back buffer
///@inputTexId:input opengl texture
///@width: width of input texture
///@height: height of input texture
XJGARSDK_API void XJGARSDKDrawAFullViewTexture(int inputTexId, int startX, int startY, int viewportWidth, int viewportHeight);
///Given a inputeTexId, draw to target opengl viewport
///@inputTexId: the inpute text id
///@startx: start x coordinates of view
///@startY: start y coordinates of view
///@viewportWidth: width of view
///@viewportWidth: height of view
XJGARSDK_API int XJGARSDKGetTargetResultImgAndLandMarks(unsigned char* imageBufOut, int* pOutputTexId, float* faceLandmarks, int >targetWidth, int targetHeight, int iImgCropMode, float *pXscale = 0, float * pYScale = 0);
//在每一帧渲染结束后,可以使用该函数获取结果图像及脸部特征点,
imageBufOut为结果图像存储的RGB缓存,如果为空,则不输出rgb图像。
pOutputTexId为结果图像存储的纹理Id,如果为空,则不输出纹理对象。
以上两个参数至少有一个不能为空。
faceLandmarks为结果脸部特征点缓存的数组缓存。格式为:第一个人的脸部特征点列表,第二个人脸部特征点列表…
targetWidth:指定输出rgb图像,或纹理的宽度
targetHeight:指定输出rgb图像,或纹理的高度
iImgCropMode:目标图像与相机输入的目标图像尺寸不一致时,指定输入目标图像的裁剪方式,0:拉伸到目标位置,1:中心点对齐并裁剪边界(不缩放),2:居中对齐并缩放以尽可能匹配目标,然后裁剪
///@pXscale, 捕获的结果图像坐标与原始图像坐标的缩放参数
///@pYScale, 捕获的结果图像坐标与原始图像坐标的缩放参数
返回值:检测到的人脸个数
//在每一帧渲染结束后,可以使用该函数获取原始图像及脸部特征点, XJGARSDK_API int XJGARSDKGetFaceLandmarks(float* faceLandmarks);