Android OTG usb camera 常見配置、除錯等問題
工程使用Eclipse Mars+jni+Opencv,影象處理在jni裡做。android只是抄過來用而已。
——————-配置部分———————
每次配置總會出現問題(查了眾多資料崩了幾天總結得來):
1、jre 庫匯入(編譯java程式碼)
2、NDK路徑和build path ${NDKROOT}/ndk-build.cmd (編譯C、Cpp),除錯需要再加上NDK_DEBUG=1
3、 C++\C path and symbols。其實就是jni查詢include路徑
4、Android的activity等類引入,一般可以自動修復
5、Android.mk的注意:
①Opencv.mk引入
②LOCAL_MODULE與LOCAL_SRC_FILES
③LOCAL_LDLIBS +=(嚴重注意 是+=還是冒號:,容易漏掉庫
④APP_STL := gnustl_static 和 OPENCV_INSTALL_MODULES:=on後者可以使機器不用安裝opencv manager,但是貌似編譯起來變慢許多。
6、jni部分:
C不會自動強制轉換,介面是C的寫法。Cpp和C銜接注意extern “C”。另外C部分會出現各種怪異問題,比如size_t不識別(直接改unsigned int),部分巨集定義(自己重寫)找不到,引用標頭檔案無效等等(比如float.h每次都出問題)。最奇葩的問題是因為eclipse不會預設強制轉換,會提示unresolved symbol問題。比如我使用 fabs(a),a是一個int,他不會自動轉換,而是提示fabs()這個函式找不到,誤導性很大(我就rlgl),這時強制轉換下fabs((double)a)就通過了。
7、引入opencv庫..就是那個jar檔案。聽說opencv android的2.4.X最穩定。推薦X越高越好。3的不穩定。。反正我的3.1.0java都編不出來。
注意在修改許可權的部分。
oncreate函式裡呼叫自寫函式。其實是網上抄的。
最初抄的版本里, Runtime runtime = Runtime.getRuntime(),沒有新建一個物件,而是直接 process = Runtime.getRuntime().exec(“su”)。這種方法行不通。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String apkRoot="chmod 666 /dev/video*" ;//SD卡分割槽路徑,也可能是mmcblk1隨系統版本定,當前程式路徑請用getPackageCodePath();
//SystemManager.RootCommand(apkRoot);
RootCmd(apkRoot);
cp = (CameraPreview) findViewById(R.id.cp);
}
public boolean RootCmd(String cmd){
Process process = null;
DataOutputStream os = null;
Runtime runtime = Runtime.getRuntime();
try {
process = runtime.exec("su");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
os = new DataOutputStream(process.getOutputStream());
os.writeBytes(cmd+ "\n");
os.flush();
os.writeBytes("exit\n");
os.flush();
process.waitFor();
} catch (Exception e) {
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
return true;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
另外有個UsbWebCamera的app,直接無視許可權就能啟用otg usb cam。可惜沒找到原始碼。
——————-Opencv Mat 與Java Bitmap轉換———————
Mat src = new Mat();
Utils.bitmapToMat(bmp, src);
ReadBarcode(src.getNativeObjAddr());
- 1
- 2
- 3
注意,在使用bitmapToMat前一定要初始化mat,不然會提示mat==null錯誤。
另外java部分在呼叫opencv的任何函式前,應該等待opencv manger的載入完畢。
具體為使用BaseLoaderCallback等待其載入完畢,可以參opencv sample2 - mixed processing裡面的這段(注意載入jni lib也是在opencv manager之後):
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
**// Load native library after(!) OpenCV initialization**
System.loadLibrary("doproc");
mOpenCvCameraView.setMaxFrameSize(480, 640);
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
暫時總結這些吧。趕腳卡在這些問題上幾天不寫演算法真是坑。
還是stackoverflow靠譜。