前提: 1.安裝Android Studio(過程略) 2.官網下載OpenCV for Android 網址:http:opencv.org/downloads.html 我下載的是下圖的版本 3.將下載好的OpenCV for Android解壓到固定文件夾 4.新建一個android項目(就新 ...
前提:
1.安裝Android Studio(過程略)
2.官網下載OpenCV for Android 網址:http:opencv.org/downloads.html 我下載的是下圖的版本
3.將下載好的OpenCV for Android解壓到固定文件夾
4.新建一個android項目(就新建一個就好,以後用到)
以上的步驟基本沒有什麼問題(除了打開網頁的時候網速很慢。。。)
Android Studio導入OpenCV:
1.點擊File-new-import Module如圖:
2.Source directory中填寫內容:找到步驟1中解壓OpenCV for Android的位置OpenCV-android-sdk —> sdk—> java直接拷貝,拷貝完畢後會出現Module name(我的因為已經導入過了所以會有感嘆號正常情況下點擊下一步下一步下一步就好)
上述步驟可能會遇見的錯誤:導入之後各種bug輸出,,,,,我的如下圖(只是截取的部分):
解決:導入OpenCV for Android後應該將openCVLibrary310下的build.gradle文件改成和第一步自己新建的android項目下的build.gradle文件相同,然後clean一下,OK
將openCVLibrary310應用到自己的項目:
1.點擊File-Project Structure會出現下圖:Modules下邊找你新建的android項目後點擊Dependencies
2.點擊右側加號選第三個Module dependency後選擇openCVLibrary310後點擊完成
以上完成後你的app就可以使開發openCV了
android使用OpenCV將彩圖轉化為灰圖的例子:
MainActivity.java代碼:
package com.example.lenovo.myapplication;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.example.lenovo.R;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
public class MainActivity extends AppCompatActivity {
Button btnProcess;
Bitmap srcBitmap;
Bitmap grayBitmap;
ImageView imgHuaishi;
private static boolean flag = true;
//private static boolean isFirst = true;
private static final String TAG = "MainActivity";
//OpenCV庫載入並初始化成功後的回調函數
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status){
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "成功載入");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "載入失敗");
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
btnProcess.setOnClickListener(new ProcessClickListener());
}
public void initUI(){
btnProcess = (Button)findViewById(R.id.btn_gray_process);
imgHuaishi = (ImageView)findViewById(R.id.img_huaishi);
Log.i(TAG, "initUI sucess...");
}
public void procSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.text_img);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
Log.i(TAG, "procSrc2Gray sucess...");
}
private class ProcessClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// if(isFirst)
// {
procSrc2Gray();
// isFirst = false;
// }
if(flag){
imgHuaishi.setImageBitmap(grayBitmap);
btnProcess.setText("查看原圖");
flag = false;
}
else{
imgHuaishi.setImageBitmap(srcBitmap);
btnProcess.setText("灰度化");
flag = true;
}
}
}
@Override
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
}
對應的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
tools:context="com.example.mytest.MainActivity">
<ImageView
android:id="@+id/img_huaishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"/>
<Button
android:id="@+id/btn_gray_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/img_huaishi"
android:layout_centerHorizontal="true"
android:text="灰度化"/>"
</RelativeLayout>
這樣就夠了,然後點擊運行。。。。。
呵呵,,運行失敗對不對,提醒要要安裝opencv manager的apk,,我吧官方demo中所有的apk都安裝了,還是提示未安裝,,程式不能運行,,,後來想想,實際開發中 需要人臉識別一類的功能,還非得讓客戶用你的軟體的同時還非要安裝opencv manager的apk?那用戶體驗也是沒誰了。。。。。。然後就找到了一種不安裝這個apk也可以照 常使用OpenCV了
參考網址:http://jingyan.baidu.com/article/60ccbceb53533364cab197db.html
方法如下:
1.把OpenCV sdk for Android文件下F:\OpenCV-android-sdk\sdk\native下的libs文件夾拷貝到你的安卓項目下,即自己的項目\src\main下麵,並且將libs改名為 jniLibs
2.將OpenCV-android-sdk\samples\image-manipulations\res\layout下的xml文件拷貝到自己的項目\src\main\res下麵
3.將OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations下的java文件拷到自己的項目\src\main\java\你 MainActivity所在的包名,即和MainActivity同級目錄
4.在項目清單文件中為剛纔導入的java文件進行配置,加上相應的許可權,如圖:
接下來運行你的項目,就妥妥的了
我的運行後截圖:
最後說說遇到的其他奇葩問題:
1.明明哪裡都妥妥的了,資源文件沒有問題,就是找不到R文件 clean也找不到,,,,
不擇手段的解決方法:手動寫 import 你的報名.R 我試了,,OK了。。。。。。。
2.運行app時候出錯如圖:
解決如圖:Enable ADB Integration勾選一下
備忘,希望給大家帶來幫助。