編輯:關於Android編程
前面通過兩天的時間,也只是熟悉了基本的環境搭建,明確了基本的部件流程,接下來需要熟悉API,進行實際的應用編程。本篇嘗試獲取圖片的SIFT特征點,並學習相應的API及圖像處理基本知識。
目標:
- 定義Native method 接口
- Bitmap 和 opencv Mat 之間的轉換
- 通過org.opencv.core.Mat.getNativeObjAddr()把地址傳遞給底層的C++代碼處理,然後更新對應地址的對象
關鍵代碼:
Android中的事件處理:
btn_feature_detect.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Mat mRgba = new Mat(height, width, CvType.CV_8U, new Scalar(4));
Mat mGray = new Mat(height, width, CvType.CV_8U, new Scalar(4));
Mat output = new Mat();
Utils.bitmapToMat(bitmap, mRgba);
// do sth
// Converts an image from one color space to another.
Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGB2GRAY, 4);
NativeUtil.detectFeatures(mGray.getNativeObjAddr(), mRgba.getNativeObjAddr(), output.getNativeObjAddr());
// Then convert the processed Mat to Bitmap
Bitmap resultBitmap = Bitmap.createBitmap(output.cols(),
output.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(output, resultBitmap);
imageFeatureView.setImageBitmap(resultBitmap);
}
});
C++中利用opencv的處理:
JNIEXPORT void JNICALL Java_com_example_test_NativeUtil_detectFeatures(
JNIEnv *env, jclass thiz, jlong mGrayAddr, jlong mRgbaAddr, jlong mOutputAddr) {
Mat* pMatGr=(Mat*)mGrayAddr;
Mat* pMatRgb=(Mat*)mRgbaAddr;
Mat* pMatDesc=(Mat*)mOutputAddr;
vector v;
//OrbFeatureDetector detector(50);
OrbFeatureDetector detector;
OrbDescriptorExtractor extractor;
detector.detect(*pMatGr, v);
drawKeypoints(*pMatGr, v, *pMatDesc);
}
參考:
1.opencv ORB
2.Drawing Function of Keypoints and Matches
3.OpenCV Tutorial 2: Mixed Processing
4.Feature Description
5.Feature Detection and Description
方案一:PreLollipopTransition首先在 build.gradle 配置文件添加這個庫依賴dependencies { compile
前面講到Vitamio可以支持一些流媒體,在這裡就用Vitamio來播放網絡上的一些流媒體,如:mms、rtsp、http,參考前輩的一些文章來寫一個網絡收音機程序,對於
原文章美團Android資源混淆保護實踐,但是該文章並沒有給出具體的混淆方案,只是放了一個函數,函數的實現過程需要自己去實現,本篇文章也並沒有實現該函數,只是對實現該函數
在上一篇博文《Android之——殺死用戶選中的進程(釋放進程占用的空間)》一文中,向大家介紹了如何殺死用戶選中的進程,但是,遺留了一個問題,那就