English | 简体中文
⛰️ GPUPixel is a high-performance image and video AI beauty effect library written in C++11, Extremely easy to compile and integrate, with a very small library size.
🔑 It is GPU-based and comes with built-in beauty effects filters that can achieve commercial-grade results.
🔌 It supports platforms including iOS, Mac, Android, and it can theoretically be ported to any platform that supports OpenGL/ES.
💡 The face key points detection currently utilizes the Face++ library, but it will be replaced with either VNN or NCNN in the future.
Origin | Smooth | White | ThinFace |
---|---|---|---|
BigEye | Lipstick | Blusher | ON-OFF |
This table compares the features supported by GPUPixel and GPUImage:
✅: Supported | ❌: Not supported | ✏️: Planning
GPUPixel | GPUImage | |
---|---|---|
🍎Filters: | ✅ | ❌ |
Skin Smoothing Filter | ✅ | ❌ |
Skin Whitening Filter | ✅ | ❌ |
Face Slimming Filter | ✅ | ❌ |
Big Eyes Filter | ✅ | ❌ |
Lipstick Filter | ✅ | ❌ |
Blush Filter | ✅ | ❌ |
More Build in Filter | ✅ | ✅ |
🍓Input Formats: | ||
YUV420P(I420) | ✅ | ❌ |
RGBA | ✅ | ✅ |
JPEG | ✅ | ✅ |
PNG | ✅ | ✅ |
NV21(for Android) | ✏️ | ❌ |
🍉Output Formats: | ||
RGBA | ✅ | ✅ |
YUV420P(I420) | ✏️ | ❌ |
🥑Platform: | ||
iOS | ✅ | ✅ |
Mac | ✅ | ✅ |
Android | ✅ | ❌ |
Win | ✏️ | ❌ |
Linux | ✏️ | ❌ |
OS | iOS | OSX | Android | Windows | Linux |
---|---|---|---|---|---|
Min Support OS Version | 10.0 | 10.13 | 5.0 (API 21) | - | - |
- | iPhone 6P | iPhone 8 | iPhone X | iPhone 11 | iPhone 14 pro |
---|---|---|---|---|---|
CPU | 5% | 5% | 3% | 3% | 3% |
Time Taken | 10ms | 4ms | 3ms | 3ms | 3ms |
- | Xiaomi 10 | Huawei Meta30 | Vivo | SAMSUNG | Google Pixel |
---|---|---|---|---|---|
CPU | 3% | 5% | - | - | - |
Time Taken | 6ms | 5ms | - | - | - |
-
Open
objc/gpupixel.xcodeproj
orobjc/demo/PixDemo.xcodeproj
Xcode project ; -
Select the corresponding platform for compilation;
-
Open the directory ./android in Android Studio
-
Configure NDK r21+
iOS(.framework) | MacOS(.framework) | Android(.aar) | |
---|---|---|---|
Size | 2.4 MB | 2.6 MB | 2.1 MB |
Refer to ./objc/demo
or ./android
demo
.h
file
// video data input
std::shared_ptr<SourceRawDataInput> source_raw_input_;
// beauty filter
std::shared_ptr<FaceBeautyFilter> face_beauty_filter_;
// video data output
std::shared_ptr<TargetRawDataOutput> target_raw_output_;
Create Filter, .cpp
file
GPUPixel::GPUPixelContext::getInstance()->runSync([&] {
// Create filter
source_raw_input_ = SourceRawDataInput::create();
target_raw_output_ = TargetRawDataOutput::create();
// Face Beauty Filter
face_beauty_filter_ = FaceBeautyFilter::create();
// Add filter
source_raw_input_->addTarget(face_beauty_filter_)->addTarget(target_raw_output_);
}
Input Image Data I420 or RGBA
// ...
// YUVI420
source_raw_input_->uploadBytes(width,
height,
bufferY,
strideY,
bufferU,
strideU,
bufferV,
strideV);
// ...
// bytes: RGBA data
source_raw_input_->uploadBytes(bytes,
width,
height,
stride);
Output Data Callback
// I420 callback
target_raw_output_->setI420Callbck([=](const uint8_t *data,
int width,
int height,
int64_t ts) {
size_t y_size = width * height;
const uint8_t *uData = data + y_size;
const uint8_t *vData = data + y_size + y_size / 4;
// Do something you want
});
// RGBA callback->
target_raw_output_->setPixelsCallbck([=](const uint8_t *data,
int width,
int height,
int64_t ts) {
size_t rgba_size = width * height*4;
// Do something you want
});
// Output data callbck