Untitled
unknown
plain_text
a year ago
3.7 kB
4
Indexable
//blur
#include <jni.h>
#include <cstring>
// Hàm làm mờ ảnh YUV420
extern "C"
JNIEXPORT void JNICALL
Java_com_example_yourapp_YUVProcessor_blurYUV(JNIEnv *env, jobject thiz, jbyteArray inputYUV,
jint width, jint height, jint kernelSize) {
int frameSize = width * height; // Kích thước phần Y
int uvSize = frameSize / 2; // Kích thước phần UV
// Lấy dữ liệu từ mảng Java
jbyte *yuv = env->GetByteArrayElements(inputYUV, nullptr);
// Tạo bộ nhớ tạm để lưu phần Y đã làm mờ
unsigned char *tempY = new unsigned char[frameSize];
// Làm mờ phần Y
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int sum = 0;
int count = 0;
// Kernel kích thước kernelSize x kernelSize
for (int ky = -kernelSize / 2; ky <= kernelSize / 2; ky++) {
for (int kx = -kernelSize / 2; kx <= kernelSize / 2; kx++) {
int ny = y + ky;
int nx = x + kx;
// Kiểm tra pixel nằm trong giới hạn ảnh
if (ny >= 0 && ny < height && nx >= 0 && nx < width) {
sum += yuv[ny * width + nx];
count++;
}
}
}
// Gán giá trị trung bình vào pixel mới
tempY[y * width + x] = static_cast<unsigned char>(sum / count);
}
}
// Ghi lại phần Y đã làm mờ vào mảng YUV
memcpy(yuv, tempY, frameSize);
// Giữ nguyên phần UV
// Không cần làm gì vì UV không thay đổi
// Giải phóng bộ nhớ tạm
delete[] tempY;
// Ghi lại thay đổi vào mảng Java
env->ReleaseByteArrayElements(inputYUV, reinterpret_cast<jbyte *>(yuv), 0);
}
//sharpen
#include <jni.h>
#include <cstring>
// Hàm sharpen ảnh YUV420
extern "C"
JNIEXPORT void JNICALL
Java_com_example_yourapp_YUVProcessor_sharpenYUV(JNIEnv *env, jobject thiz, jbyteArray inputYUV,
jint width, jint height) {
int frameSize = width * height; // Kích thước phần Y
jbyte *yuv = env->GetByteArrayElements(inputYUV, nullptr);
// Bộ nhớ tạm để lưu phần Y đã xử lý
unsigned char *tempY = new unsigned char[frameSize];
// Kernel sharpen 3x3
int kernel[3][3] = {
{ 0, -1, 0 },
{ -1, 5, -1 },
{ 0, -1, 0 }
};
// Áp dụng kernel cho phần Y
for (int y = 1; y < height - 1; y++) {
for (int x = 1; x < width - 1; x++) {
int sum = 0;
// Duyệt qua kernel 3x3
for (int ky = -1; ky <= 1; ky++) {
for (int kx = -1; kx <= 1; kx++) {
int ny = y + ky;
int nx = x + kx;
sum += yuv[ny * width + nx] * kernel[ky + 1][kx + 1];
}
}
// Giới hạn giá trị pixel từ 0 đến 255
sum = sum < 0 ? 0 : (sum > 255 ? 255 : sum);
// Gán pixel đã xử lý vào bộ nhớ tạm
tempY[y * width + x] = static_cast<unsigned char>(sum);
}
}
// Copy phần Y đã xử lý trở lại mảng YUV
memcpy(yuv, tempY, frameSize);
// Giữ nguyên phần UV
// Không cần làm gì vì UV không thay đổi
// Giải phóng bộ nhớ tạm
delete[] tempY;
// Ghi lại thay đổi vào mảng Java
env->ReleaseByteArrayElements(inputYUV, reinterpret_cast<jbyte *>(yuv), 0);
}
//add index
opencvEditor is loading...
Leave a Comment