图片风格艺术化
让照片描摹艺术大师的风格

不同于传统滤镜, 基于神经网络和深度学习

借助PhotoStyling风格迁移引擎

您的应用可以将用户的普通图片瞬间变成大师作品

将艺术大师装进您的应用 免费下载开发
让您的应用即刻拥有专属的超级“艺术大师”

借助风格迁移引擎PhotoStyling,您的应用可以获得最佳艺术风格迁移的能力。瞬间就可将用户的任何普通照片转换成梵高体、莫奈风、印象派等多种不同艺术风格的佳作。我们将持续升级引擎,最终让它成为帮助用户获得任何风格的“艺术大师”。

用户对艺术类风格特效存在巨大需求,PhotoStyling引擎助您快速抢占先机。

多种艺术风格
梵高 "阿尔勒的鸢尾花"风格

后印象主义画家梵高的作品。1888年,梵高前往法国南方小镇阿尔勒,这段时期,他画肖像画、自画像、柏树、向日葵、麦田、星空、太阳。对他而言,艺术是一种纯个人的表现形式,他认为作品的真正价值在于诚实体现个人的感受。在阿尔勒的短短的1年多中,他的激情喷涌而出,对鸢尾花投入了巨大而持续的创作热情,创作出《鸢尾花系列》作品。

"阿尔勒的鸢尾花"原作

图片风格迁移效果 ▼

保罗·西涅克的"点彩派"风格

保罗·西涅克,法国新印象派点彩派(Pointillism)创始人之一,他最开始是学的是建筑专业,但在1880年去参观莫奈的画展后,开始对绘画产生了极大的兴趣,此后他决定放弃原来所学的专业而改学绘画。

画风大胆,用相当大的笔点,把色点几乎无秩序地随便放置,产生出生动的感觉。这种笔法是很有特色的,在梵高的画中,可以明显地看到他的影响。作品富于激情,善用红色作为基调,色彩鲜明和谐,使远近产生秩序感。他的忠实好友费利克斯·费内翁这样形容过西涅克的画:“他的色彩象海浪一样扩散着,分出层次,碰撞着,互相渗透着,形成一种与曲线美相结合的丰富效果……”

“井边的女人”原作

图片风格迁移效果 ▼

多种艺术风格(专属的多位“艺术大师”)
点击浏览
更多风格持续增加中,请保持关注!
引擎功能优势

不同于传统的摄像头滤镜,基于底层的数字图像处理技术

机器视觉技术,实现纹理转换

拥有莫奈、毕加索、梵高等众多名家的技能,却还有他们难以企及的“快速”、“智能”

快速响应
200万像素照片在数秒内获得服务器反馈
超级智能
媲美私人的“超级画师”,完美实现任何目标风格
超强的易用性
• 简化环境配置 借助引擎,您无需复杂的环境配置,引擎可直接使用
• 接口简单 接口通俗易懂,无需学习直接上手
• 基于C接口, 更易于集成 引擎基于C接口开发,更便于集成到应用

不断推陈出新

我们始终保持更新优化引擎,脚步不曾停歇

八月
-01-
2017
PhotoStyling v1.1
增加人脸保护机制
增加人脸保护机制,完善人脸的风格化效果,让人脸艺术感更强,更具艺术美感
改善光晕、灰色块区域
针对光晕、灰色块等区域做了更深层次的处理,让区域更细腻,更具艺术感
五月
-15-
2017
PhotoStyling v1.0
图像风格艺术化
虹软全新的风格深度学习Engine,基于神经网络与人工智能技术开发。当前引擎可将任何一张普通照片,变成具有强烈艺术风格的图像珍品。
运行环境与指标
系统: Linux
  • 操作系统: Linux-x64
  • CPU (要求支持AVX2 指令集):
    最低配置 :Intel® CoreTM i3-4330 Processor
    Intel® Xeon® Processor E3-1220 v3 (服务器版)
    推荐配置 :Intel® CoreTM i7-5775R Processor
    Intel® Xeon® Processor E3-1285L v4 (服务器版)
  • RAM: 1G或以上
运行指标
  • 输入图像最大像素数:2073600
    支持最高1440x1440(1:1),1600x1200(4:3)或1920x1080(16:9)
  • 输入图像宽高约束: 宽、高需为4的整数倍
  • 输入图像格式: BGR24(B8R8G8)/RGB24(R8B8G8)
  • 平均耗时: 2s/百万像素(linux-x64)
  • 单个风格模型文件ROM占用: 2.1MB

API接入说明

如何将PhotoStyling装进应用

查看 ▶
前提条件
从虹软官网下载获取PhotoStyling引擎应用开发包,及其对应的激活码(APPID, SDKKEY)
将获取到的开发包导入到您的应用中

APPID与SDKKEY是在初始化的时候需要使用
类型定义
APS_FSDK_DEVICE_ID
描述: 程序运行设备,-1代表CPU,0,1,2,等代表指定序号的GPU。当前仅支持 -1 (CPU设备)
定义: typedef MInt32 APS_FSDK_DEVICE_ID;


APS_FSDK_ENGINE_HANDLE
描述: 风格学习引擎句柄
定义: typedef MHandle APS_FSDK_ENGINE_HANDLE;


APS_FSDK_Version
描述: SDK版本信息
定义:
APS_FSDK_Version { MLong lCodebase; MLong lMajor; MLong lMinor MLong lBuild; MTChar* Version; MTChar* BuildDate; MTChar* CopyRight; } APS_Version;
成员变量
Name
Description
lCodebase
代码库版本号
lMajor
主版本号
lMinor
次版本号
lBuild
编译版本号
Version
字符串形式的版本号
BuildDate
编译日期
CopyRight
Copyright信息
常量
MAX_PIXL_NUM
描述: 引擎支持输入图像最大像素数
定义: const MLong MAX_PIXL_NUM = 2073600;
返回码
APS_STATUS
定义
MOK
MERR_NO_MEMORY
MERR_UNKNOWN
MERR_FSDK_INVALID_APP_ID
MERR_FSDK_INVALID_SDK_ID
MERR_FSDK_INVALID_ID_PAIR
MERR_FSDK_MISMATCH_ID_AND_SDK
MERR_FSDK_LICENCE_EXPIRED
MERR_FSDK_APS_ENGINE_HANDLE
MERR_FSDK_APS_MEMMGR_HANDLE
MERR_FSDK_APS_DEVICEID_INVALID
MERR_FSDK_APS_DEVICEID_UNSUPPORTED
MERR_FSDK_APS_MODEL_HANDLE
MERR_FSDK_APS_MODEL_SIZE
MERR_FSDK_APS_IMAGE_HANDLE
MERR_FSDK_APS_IMAGE_FORMAT_UNSUPPORTED
MERR_FSDK_APS_IMAGE_PARAM
MERR_FSDK_APS_IMAGE_SIZE


0x0000
0x0001
0x0004
0x7001
0x7002
0x7003
0x7004
0x7006
0x11001
0x11002
0x11003
0x11004
0x11005
0x11006
0x11007
0x11008
0x11009
0x1100A
说明
Result
Description
MOK
成功
MERR_UNKNOWN
其他内部错误
MERR_NO_MEMORY
内存不足
MERR_FSDK_INVALID_APP_ID
非法的APPID
MERR_FSDK_INVALID_SDK_ID
非法的SDKKEY
MERR_FSDK_INVALID_ID_PAIR
SDKKEY不属于当前APPID名下的
MERR_FSDK_MISMATCH_ID_AND_SDK
SDKKEY不是当前SDK所支持的
MERR_FSDK_LICENCE_EXPIRED
SDK过期
MERR_FSDK_APS_ENGINE_HANDLE
引擎句柄非法
MERR_FSDK_APS_MEMMGR_HANDLE
内存管理器句柄非法
MERR_FSDK_APS_DEVICEID_INVALID
DEVICE ID非法
MERR_FSDK_APS_DEVICEID_UNSUPPORTED
DEVICE ID不支持
MERR_FSDK_APS_MODEL_HANDLE
模板数据指针非法
MERR_FSDK_APS_MODEL_SIZE
模板长度非法
MERR_FSDK_APS_IMAGE_HANDLE
图像结构体指针非法
MERR_FSDK_APS_IMAGE_FORMAT_UNSUPPORTED
图像格式不支持
MERR_FSDK_APS_IMAGE_SIZE
图像尺寸大小超出支持范围
API函数
APS_FSDK_Get_Version
功能描述: 获取SDK版本信息
函数声明: const APS_FSDK_Version* APS_FSDK_Get_Version(APS_FSDK_ENGINE_HANDLE hAPSEngine)
参数: hAPSEngine 引擎句柄



APS_FSDK_InitEngine
功能描述: 初始化引擎
函数声明:
MRESULT APS_FSDK_InitEngine (
const char * AppId,
const char * SDKKey,
MHandle hMemMgr,
APS_FSDK_DEVICE_ID APSDeviceID,
APS_FSDK_ENGINE_HANDLE *phAPSEngine
);
参数
Appid
[输入] 用户下载SDK时获取的APPID
SDKKey
[输入] 用户下载SDK时获取的key
hMemMgr
[输入] 内存管理句柄
APSDeviceID
[输入] 程序运行设备,-1代表CPU,0,1,2,…代表指定序号的GPU
phAPSEngine
[输出] 引擎句柄
APS_FSDK_StyleTransfer
功能描述: 根据指定风格模型进行图片风格艺术化,保存转换输入图像风格后的输出图像数据。
函数声明:
MRESULT APS_FSDK_StyleTransfer (
APS_FSDK_ENGINE_HANDLE hAPSEngine,
MByte* pBModel,
MLong lModelSize,
LPASVLOFFSCREEN lpImgIn,
LPASVLOFFSCREEN lpImgOut
);
参数
hAPSEngine
[输入] 引擎句柄
pBModel
[输入] 风格模型数据指针
lModelSize
[输入] 风格模型数据大小
lpImgIn
[输入] 待进行风格学习图像
lpImgOut
[输出] 风格学习结果图像
APS_FSDK_UninitEngine
功能描述: 销毁引擎
函数声明:
MVoid APS_FSDK_UninitEngine (
APS_FSDK_ENGINE_HANDLE hAPSEngine
);
参数
hAPSEngine
[输入] 引擎句柄
C语言示例代码
注意,使用时请替换申请的APPID 和 SDKKEY,并设置好文件路径
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <assert.h>

#include <chrono>

#include "arcsoft_fsdk_photo_styling.h"

//#define APPID     "your appid"
//#define SDKKEY    "your sdkkey"

#define STYLE_MODEL_PATH "CHINESEART-001.tmpl"
#define INPUT_IMAGE_PATH "your_input_image.bmp"
#define OUTPUT_IMAGE_PATH "your_output_image.bmp"
#define IMAGE_WIDTH  (1920)
#define IMAGE_HEIGHT  (1080)

#define WORKBUF_SIZE (256 * 1024 * 1024)

#pragma pack(push,1)
typedef   struct  tag_BMP46_Header {
    uint16_t bfType;
    int32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    int32_t bfOffBits;
    int32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    int16_t biPlanes;
    int16_t biBitCount;
    int32_t biCompression;
    int32_t biSizeImage;
    int32_t biXPelsPerMeter;
    int32_t biYPelsPerMeter;
    int32_t biClrUsed;
    int32_t biClrImportant;
} BMP46_Header;
#pragma pack(pop)

int fu_ReadBMPFile(const char* path, uint8_t **raw_data, size_t* pSize) {
    assert(sizeof(BMP46_Header) == 54);

    int res = 0;
    FILE *fp = 0;
    uint8_t *data_file = 0;
    size_t size = 0;

    fp = fopen(path, "rb");
    if (fp == nullptr) {
        res = -1;
        goto exit;
    }
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, sizeof(BMP46_Header), SEEK_SET);

    data_file = (uint8_t *)malloc(size - sizeof(BMP46_Header));
    if (data_file == nullptr) {
        res = -2;
        goto exit;
    }
    if ((size - sizeof(BMP46_Header)) !=
        fread(data_file, sizeof(uint8_t), size - sizeof(BMP46_Header), fp)) {
        res = -3;
        goto exit;
    }

    *raw_data = data_file;
    data_file = nullptr;
exit:
    if (fp != nullptr) {
        fclose(fp);
    }
    if (data_file != nullptr) {
        free(data_file);
    }
    if (nullptr != pSize) {
        *pSize = size - sizeof(BMP46_Header);
    }
    return res;
}


int fu_SaveBMPFile(const char *path, uint8_t *raw_data, int width, int height) {
    FILE* fp = fopen(path, "wb+");
    if (fp != nullptr) {
        BMP46_Header header = { 0 };
        header.bfType = 'MB';
        header.bfSize = width*height * 3 + sizeof(BMP46_Header);
        header.bfOffBits = sizeof(BMP46_Header);
        header.biSize = 40;
        header.biWidth = width;
        header.biHeight = height;
        header.biPlanes = 1;
        header.biBitCount = 24;
        header.biSizeImage = width*height * 3;
        header.biXPelsPerMeter = 0xEC4;
        header.biYPelsPerMeter = 0xEC4;

        fwrite(&header, sizeof(BMP46_Header), 1, fp);
        fwrite(raw_data, width*height * 3, 1, fp);
        fclose(fp);
        return 0;
    }
    return -1;
}


int fu_ReadFile(const char* path, uint8_t **raw_data, size_t* pSize) {
    int res = 0;
    FILE *fp = 0;
    uint8_t *data_file = 0;
    size_t size = 0;

    fp = fopen(path, "rb");
    if (fp == nullptr) {
        res = -1;
        goto exit;
    }

    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    data_file = (uint8_t *)malloc(sizeof(uint8_t)* size);
    if (data_file == nullptr) {
        res = -2;
        goto exit;
    }

    if (size != fread(data_file, sizeof(uint8_t), size, fp)) {
        res = -3;
        goto exit;
    }

    *raw_data = data_file;
    data_file = nullptr;
exit:
    if (fp != nullptr) {
        fclose(fp);
    }

    if (data_file != nullptr) {
        free(data_file);
    }

    if (nullptr != pSize) {
        *pSize = size;
    }

    return res;
}


int main(int argc, char* argv[]) {

    void *pWorkMem = malloc(WORKBUF_SIZE);
    void *hMgr = MMemMgrCreate(pWorkMem, WORKBUF_SIZE);

    uint8_t *pRawModel = nullptr;
    size_t modelength;
    fu_ReadFile(STYLE_MODEL_PATH, (uint8_t**)&pRawModel, &modelength);
    if (!pRawModel) {
        fprintf(stderr, "fail to fu_ReadFile(%s): %s\r\n",
                STYLE_MODEL_PATH, strerror(errno));
		free(pWorkMem);
        exit(0);
    }

    auto ts_start = std::chrono::high_resolution_clock::now();
    void *hEngine = nullptr;
    int32_t device = -1;
    int ret = APS_FSDK_InitEngine(APPID, SDKKEY, hMgr, device, &hEngine);
    if (ret != 0) {
        fprintf(stderr, "fail to call FreeSDK_APS_InitEngine(): 0x%x\r\n", ret);
        free(pRawModel);
        free(pWorkMem);
        exit(0);
    }

    const APS_FSDK_Version*pVersionInfo = APS_FSDK_Get_Version(hEngine);
    printf("%ld %ld %ld %ld\r\n", pVersionInfo->lCodebase,
        pVersionInfo->lMajor, pVersionInfo->lMinor, pVersionInfo->lBuild);
    printf("%s\r\n", pVersionInfo->Version);
    printf("%s\r\n", pVersionInfo->BuildDate);
    printf("%s\r\n", pVersionInfo->CopyRight);

    ASVLOFFSCREEN inputImg = { 0 };
    inputImg.u32PixelArrayFormat = ASVL_PAF_RGB24_B8G8R8;
    inputImg.i32Width = IMAGE_WIDTH;
    inputImg.i32Height = IMAGE_HEIGHT;
    inputImg.pi32Pitch[0] = inputImg.i32Width * 3;
    inputImg.ppu8Plane[0] = nullptr;
    fu_ReadBMPFile(INPUT_IMAGE_PATH, (uint8_t**)&inputImg.ppu8Plane[0], nullptr);
    if (!inputImg.ppu8Plane[0]) {
        fprintf(stderr, "fail to fu_ReadFile(%s): %s\r\n", INPUT_IMAGE_PATH, strerror(errno));
        APS_FSDK_UninitEngine(hEngine);
        free(pRawModel);
        free(pWorkMem);
        exit(0);
    }

    ASVLOFFSCREEN outputImg = { 0 };
    outputImg.u32PixelArrayFormat = ASVL_PAF_RGB24_B8G8R8;
    outputImg.i32Width = IMAGE_WIDTH;
    outputImg.i32Height = IMAGE_HEIGHT;
    outputImg.pi32Pitch[0] = outputImg.i32Width * 3;
    outputImg.ppu8Plane[0] = (uint8_t*)malloc(outputImg.pi32Pitch[0] * outputImg.i32Height);

    ret = APS_FSDK_StyleTransfer(hEngine, pRawModel, modelength, &inputImg, &outputImg);
    if (ret != 0) {
        fprintf(stderr, "fail to call FreeSDK_APS_StyleTransfer(): 0x%x\r\n", ret);
        APS_FSDK_UninitEngine(hEngine);
        free(inputImg.ppu8Plane[0]);
        free(outputImg.ppu8Plane[0]);
		free(pRawModel);
        free(pWorkMem);
        exit(0);
    }

    APS_FSDK_UninitEngine(hEngine);
    auto ts_end = std::chrono::high_resolution_clock::now();
    printf("cost %ld ms\r\n",
        std::chrono::duration_cast<std::chrono::milliseconds>(ts_end - ts_start).count());
    fu_SaveBMPFile(OUTPUT_IMAGE_PATH, (uint8_t*)outputImg.ppu8Plane[0],
                   outputImg.i32Width, outputImg.i32Height);

    free(inputImg.ppu8Plane[0]);
    free(outputImg.ppu8Plane[0]);
    free(pRawModel);
    free(pWorkMem);
    return 0;
}

                                

您的想象力是无限的

更多有实用价值的产品和业务只等您来造!

免费使用,持续更新

立即下载Engine
虹软视觉AI引擎服务交流

Q Q 群

微信群

技术支持:support-api@arcsoft.com
商务合作:business-api@arcsoft.com
QQ交流群: 482124810
地址: 杭州市西湖区西斗门路3号天堂软件园A幢23楼
© 2017 虹软版权所有 浙ICP备11037259号
︿