Tạo app hiệu ứng ảnh đơn giản với OpenCV

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

eclipse_opencv_dependency0.png

2, Thêm OpenCV vào danh sách references của project

eclipse_opencv_dependency1.png

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

eclipse_opencv_dependency0.png

2, Thêm OpenCV vào danh sách references của project

eclipse_opencv_dependency1.png

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

Tham khảo: http://docs.opencv.org/trunk/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html


All Rights Reserved