Tạo app hiệu ứng ảnh đơn giản với OpenCV
Bài đăng này đã không được cập nhật trong 3 năm
OpenCV là một trong những thư viện về Computer Vision lớn nhất hiện nay, cung cấp rất nhiều feature thuộc nhiều lĩnh vực thuộc Computer Science như: Image Processing, Machine Learning, ... Được viết bởi ngôn ngữ C/C++, OpenCV tỏ ra vượt trội hơn về tốc độ xử lý so với các công cụ nghiên cứu khác như Matlab, Python. Dưới đây, tôi sẽ trình bày việc cài đặt môi trường để phát triển ứng dụng với OpenCV trên nền tảng Android.
1. Cài đặt
Chuẩn bị:
- JDK
- Android SDK và NDK
- Eclipse IDE
- ADT và CDT plugin của Eclipse
Bạn cần cài đặt 4 packages trên, nhập đường link của Android SDK và NDK vào Eclipse.
2. Khởi tạo project
Có 2 hướng khởi tạo 1 project sử dụng OpenCV:
- Async Initialization:
Sử dụng ứng dụng OpenCV Manager, developer có thể cập nhật những version mới, tính năng mới của OpenCV.
Các bước khởi tạo:
1, Import OpenCV library
2, Thêm OpenCV vào danh sách references của project
3, Cuối cùng sau khi khởi tạo hoàn tất onManagerConnected sẽ được gọi.
public class Sample1Java extends Activity implements CvCameraViewListener {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume()
{
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
...
}
- Static Initialization:
Sự dụng bản build OpenCV cố định, developer không thể cập nhật những feature mới được quản lý bởi OpenCV Manager, nhưng lợi ích của nó là người dùng không cần thiết phải cài đặt OpenCV manager để có thể sử dụng ứng dụng đó.
Các bước như sau:
1, Import OpenCV library
2, Thêm OpenCV vào danh sách references của project
3, Nếu project chưa có jni part thì hãy thêm native support cho project. Sau đó trong folder sẽ có file Android.mk, trong file đó thêm include như sau:
include $(CLEAR_VARS)
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
include ../../sdk/native/jni/OpenCV.mk
4, Bước cuối cùng, thêm initialize code trước khi gọi OpenCV API
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
} else {
System.loadLibrary("my_jni_lib1");
System.loadLibrary("my_jni_lib2");
}
}
3. Tạo ứng dụng Image Effects (hiệu ứng ảnh)
Ở trên, tôi đã trình bày cách cài đặt và khởi tạo OpenCV trên Android, bây giờ hãy bắt đầu ứng dụng những feature của OpenCV. Điểm đặc biệt là những feature đó được viết bằng C/C++ và nhúng vào Java qua JNI. Như dưới đây:
Đây là file C với function enhanceFace1
#include <jni.h>
#include <android/log.h>
#include <opencv2/opencv.hpp>
#include "opencv2/core/core.hpp"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv/highgui.h>
#include <iostream>
#include <vector>
#include <cmath>
using namespace cv;
using namespace std;
extern "C" {
JNIEXPORT void JNICALL Java_com_hci_hidefaces_MainActivity_enhanceFace1(JNIEnv *, jobject obj, jlong src, jlong dst);
}
JNIEXPORT void JNICALL Java_com_hci_hidefaces_MainActivity_enhanceFace1(JNIEnv *, jobject obj, jlong src, jlong dst) {
Mat& image = *(Mat *)src;
Mat& image_out = *(Mat *)dst;
Mat src_1;
cvtColor(image, src_1, CV_BGRA2BGR);
bilateralFilter(src_1, image_out, 15, 160, 160);
}
Đây là class MainActivity
...
@Override
public void onResume()
{
super.onResume();
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_PIC_REQUEST) {
// Read image
ContentResolver cr = this.getContentResolver();
cr.notifyChange(mImageUri, null);
Bitmap thumbnail = null;
try
{
thumbnail = android.provider.MediaStore.Images.Media.getBitmap(cr, mImageUri);
}
catch (Exception e)
{
Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
Log.d(TAG, "Failed to load", e);
}
if (thumbnail == null)
return;
Utils.bitmapToMat(thumbnail, image);
enhanceFace1(image.getNativeObjAddr(), dst.getNativeObjAddr());
Bitmap result = Bitmap.createBitmap(dst.cols(), dst.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst, result);
mImage.setImageBitmap(result);
}
}
Link tải file demo
https://drive.google.com/file/d/0B2mj3ezS8y7mOVpiUFdiZkV2ZHM/view?usp=sharing
All rights reserved