1. 程式人生 > >Android OTG usb camera 常見配置、除錯等問題

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靠譜。