NDKでOpenCV

2,838 views
Skip to first unread message

bocre...@yahoo.co.jp

unread,
May 26, 2012, 7:06:59 AM5/26/12
to 日本Androidの会
ndkでOpenCV2.3.1を使おうとしたところ,最初から全く進めないため相談させていただきました.

2つのプログラムについて質問です.
1つ目はOpenCVのサンプルであるtutorial-3-nativeについてです.
こちらをcygwinでndk-buildしたところ

$ ndk-build
Install : libnative_camera_r2.2.2.so => libs/armeabi-v7a/
libnative_camera_r2.2.2.so
install: `./obj/local/armeabi-v7a/libnative_camera_r2.2.2.so' を 読み込み用に開
くことが出来ません: Permission denied
/cygdrive/c/android-ndk-r8/build/core/build-binary.mk:409: recipe for
target `libs/armeabi-v7a/libnative_camera_r2.2.2.so' failed
make: *** [libs/armeabi-v7a/libnative_camera_r2.2.2.so] Error 1

と表示されうまくいきません.インターネットで調べると皆さん問題なく出来ているようですが,
実機がつながってないとダメだということでしょうか.
sample-15-puzzleやsample-image-manipulationsは実行できました.キャリブレーションに使うような白黒画面
でしたが.

もう一つは
http://www.atmarkit.co.jp/fsmart/articles/armobile06/02.html
でダウンロードできるdetect_image_sampleをndk-buildしたときに起きる

$ ndk-build
Cygwin : Generating dependency file converter script
Compile++ thumb : native_sample <= jni_part.cpp
jni/jni_part.cpp:2:33: error: opencv2/core/core.hpp: No such file or
directory
jni/jni_part.cpp:3:39: error: opencv2/imgproc/imgproc.hpp: No such
file or directory
jni/jni_part.cpp:4:45: error: opencv2/features2d/features2d.hpp: No
such file or directory
jni/jni_part.cpp:13: error: 'cv' is not a namespace-name
jni/jni_part.cpp:13: error: expected namespace-name before ';' token
jni/jni_part.cpp:20: error: 'OrbFeatureDetector' does not name a type
jni/jni_part.cpp:21: error: 'OrbDescriptorExtractor' does not name a
type
jni/jni_part.cpp:23: error: expected constructor, destructor, or type
conversion before '<' token
jni/jni_part.cpp: In function 'void
Java_com_example_detectimage_DetectImageActivity_setTrainingImages(JNIEnv*,
_jobject*, _jintArray*, _jintArray*, _jobjectArray*, jint)':
jni/jni_part.cpp:33: error: 'Mat' was not declared in this scope
jni/jni_part.cpp:33: error: template argument 1 is invalid
jni/jni_part.cpp:33: error: template argument 2 is invalid
jni/jni_part.cpp:33: error: invalid type in declaration before ';'
token
jni/jni_part.cpp:34: error: 'KeyPoint' was not declared in this scope
jni/jni_part.cpp:34: error: template argument 1 is invalid
jni/jni_part.cpp:34: error: template argument 2 is invalid
jni/jni_part.cpp:34: error: invalid type in declaration before ';'
token
jni/jni_part.cpp:35: error: expected ';' before 'trainDescriptors'
jni/jni_part.cpp:43: error: expected ';' before 'mrgba'
jni/jni_part.cpp:45: error: expected ';' before 'gray'
jni/jni_part.cpp:46: error: 'mrgba' was not declared in this scope
jni/jni_part.cpp:46: error: 'gray' was not declared in this scope
jni/jni_part.cpp:46: error: 'CV_RGBA2GRAY' was not declared in this
scope
jni/jni_part.cpp:46: error: 'cvtColor' was not declared in this scope
jni/jni_part.cpp:48: error: 'detector' was not declared in this scope
jni/jni_part.cpp:49: error: 'extractor' was not declared in this scope
jni/jni_part.cpp:49: error: 'trainDescriptors' was not declared in
this scope
jni/jni_part.cpp:50: error: request for member 'push_back' in
'trainDescriptorses', which is of non-class type 'int'
jni/jni_part.cpp:52: error: 'matcher' was not declared in this scope
jni/jni_part.cpp: In function 'jint
Java_com_example_detectimage_CameraPreview_detectImage(JNIEnv*,
_jobject*, jint, jint, _jbyteArray*)':
jni/jni_part.cpp:61: error: 'KeyPoint' was not declared in this scope
jni/jni_part.cpp:61: error: template argument 1 is invalid
jni/jni_part.cpp:61: error: template argument 2 is invalid
jni/jni_part.cpp:61: error: invalid type in declaration before ';'
token
jni/jni_part.cpp:62: error: 'Mat' was not declared in this scope
jni/jni_part.cpp:62: error: expected ';' before 'queryDescriptors'
jni/jni_part.cpp:64: error: expected ';' before 'myuv'
jni/jni_part.cpp:65: error: expected ';' before 'mgray'
jni/jni_part.cpp:67: error: 'detector' was not declared in this scope
jni/jni_part.cpp:67: error: 'mgray' was not declared in this scope
jni/jni_part.cpp:68: error: 'extractor' was not declared in this scope
jni/jni_part.cpp:68: error: 'queryDescriptors' was not declared in
this scope
jni/jni_part.cpp:71: error: 'DMatch' was not declared in this scope
jni/jni_part.cpp:71: error: template argument 1 is invalid
jni/jni_part.cpp:71: error: template argument 2 is invalid
jni/jni_part.cpp:71: error: invalid type in declaration before ';'
token
jni/jni_part.cpp:72: error: 'matcher' was not declared in this scope
jni/jni_part.cpp:78: error: request for member 'size' in 'matches',
which is of non-class type 'int'
jni/jni_part.cpp:79: error: invalid types 'int[int]' for array
subscript
jni/jni_part.cpp:79: error: 'THRESHOLD' cannot appear in a constant-
expression
jni/jni_part.cpp:79: error: parse error in template argument list
jni/jni_part.cpp:80: error: invalid types 'int[int]' for array
subscript
jni/jni_part.cpp:94: error: 'Mat' cannot appear in a constant-
expression
jni/jni_part.cpp:94: error: template argument 1 is invalid
jni/jni_part.cpp:94: error: template argument 2 is invalid
jni/jni_part.cpp:94: error: invalid type in declaration before '='
token
jni/jni_part.cpp:96: error: invalid types 'int[int]' for array
subscript
/cygdrive/c/android-ndk-r8/build/core/build-binary.mk:243: recipe for
target `obj/local/armeabi-v7a/objs/native_sample/jni_part.o' failed
make: *** [obj/local/armeabi-v7a/objs/native_sample/jni_part.o] Error
1

というものです.opencv2へのパスが通っていないためではないかと考えましたが,どう対処したらいいのかわかりません.
何がいけないのか,またはcppファイル内でOpenCVを使う方法を教えていただければ幸いです.

windows7でeclipse3.7を使用しています.
以上よろしくお願いいたします.

Hiroaki GOTO as GORRY

unread,
May 26, 2012, 10:36:19 AM5/26/12
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

> 1つ目はOpenCVのサンプルであるtutorial-3-nativeについてです.
> こちらをcygwinでndk-buildしたところ
>
> $ ndk-build
> Install : libnative_camera_r2.2.2.so => libs/armeabi-v7a/
> libnative_camera_r2.2.2.so
> install: `./obj/local/armeabi-v7a/libnative_camera_r2.2.2.so' を 読み込み用に開
> くことが出来ません: Permission denied
> /cygdrive/c/android-ndk-r8/build/core/build-binary.mk:409: recipe for
> target `libs/armeabi-v7a/libnative_camera_r2.2.2.so' failed
> make: *** [libs/armeabi-v7a/libnative_camera_r2.2.2.so] Error 1

OpenCVとは関係ないのですが、当該ファイルやフォルダのACL(アクセス権限)を
調べてみてください。
特にcygwin環境下だと「自分が所有権を持っていないがアクセス可能に
設定されているファイルやフォルダ」に対しての動作が、一般的な
Windowsアプリ上のそれと異なることがあります。


--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

bocre...@yahoo.co.jp

unread,
May 26, 2012, 10:58:13 AM5/26/12
to 日本Androidの会
早速の返信ありがとうございます.
エラー内に書いてあるlibnative_camera_r2.2.2.soがそもそも見当たりません.
またプロパティ→全般で調べたところ,libsフォルダもarmeabi-v7aフォルダも読み取り専用にチェックが付いていました.
チェックをはずそうとしても「変更をこのフォルダ,サブフォルダおよびファイルに適用する」と表示され,結局外れません.
これは関係ありますか?
> EMAIL: gorry...@gmail.com

Hiroaki GOTO as GORRY

unread,
May 26, 2012, 12:16:33 PM5/26/12
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

> 早速の返信ありがとうございます.
> エラー内に書いてあるlibnative_camera_r2.2.2.soがそもそも見当たりません.
> またプロパティ→全般で調べたところ,libsフォルダもarmeabi-v7aフォルダも読み取り専用にチェックが付いていました.
> チェックをはずそうとしても「変更をこのフォルダ,サブフォルダおよびファイルに適用する」と表示され,結局外れません.
> これは関係ありますか?

自分に読み取り権限しかないなら、変更はできないですよね。
変更権限のあるユーザーに変更してもらう必要があります。

そもそも、それらのフォルダの上位フォルダの所有者が自分でないために
権限がないのではないでしょうか?

ファイルの所有者を変更する(GUI操作編)
http://www.atmarkit.co.jp/fwin2k/win2ktips/720chowner/chowner.html

このへんはもうAndroid開発環境とは何も関係がなく、WindowsのACL機能や
cygwinによるACL機能サポートの話になります。


--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

Keisuke SUZUKI

unread,
May 27, 2012, 10:40:38 AM5/27/12
to android-g...@googlegroups.com
神戸支部の鈴木です。

ダウンロードしてきたOpenCVファイルが壊れていないか今一度確認したほうが良いかと思います。

> エラー内に書いてあるlibnative_camera_r2.2.2.soがそもそも見当たりません.

OpenCV-2.3.1のtar.bz2を解凍すると
samplesとOpenCV-2.3.1のディレクトリができると思いますが
OpenCV-2.3.1/libs/armeabi-v7a/
内に
libnative_camera_r2.2.2.so
があります。

OpenCV-2.3.1ディレクトリがごっそり無くなっている(もしくは一部消失している)ということはないでしょうか。
CygwinではなくLinuxですがDL後即ndk-buildで特に問題なくビルドできています。

後者の問題も、そもそもOpenCV-2.3.1ディレクトリが存在しないためのエラーのように見えます。
atmarkitの記事にある
export OPENCV_MK_PATH=(OpenCV-2.3.1)/share/OpenCV/OpenCV.mk
のパスが通っていない(そもそもディレクトリが存在しない)のではないでしょうか。

以上

2012年5月27日 1:16 Hiroaki GOTO as GORRY <gorr...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

T.Uenoyama

unread,
May 29, 2012, 8:04:47 AM5/29/12
to android-g...@googlegroups.com
上野山@京都支部です。

1つ目の質問にあがっているパーミッションエラーの件ですが、
差し障りなければCygwin上ではなくコマンドプロンプト(cmd.exe)上で
ndk-buildを実行してみてください。

古いNDKではCygwinが必須だったかと思いますが、
最近のNDKではコマンドプロンプトでも実行できるかと思います。
対処療法的ですが、私の場合はこれで何とかなりました。
(もちろん、環境変数(PATH)へのndkフォルダパス追加は必要です。)

以上、参考になりましたら。

2012年5月27日日曜日 23時40分38秒 UTC+9 Keisuke SUZUKI:
> このグループに投稿するには、android-group-ja...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-japan+unsubscribe@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>

bocre...@yahoo.co.jp

unread,
May 30, 2012, 9:27:50 AM5/30/12
to 日本Androidの会
返事が遅くなり申し訳ありません.
親切な回答をしていただきありがとうございます.

最初の質問であるエラー
libnative_camera_r2.2.2.so' を 読み込み用に開くことが出来ません
は手動でアクセス許可をいじることで改善し,ndk-buildは無事できるようになりました.
しかしインポートすると

ビルド中にエラーが発生しました。
プロジェクト 'Tutorial 2 Advanced - 1. Add Native OpenCV' でビルダー '統合外部ツール・ビル
ダー' の実行中にエラーが発生しました。
ビルダー起動構成が見つかりませんでした。
ビルダー起動構成が見つかりませんでした。

というエラーが表示されます.


また,自作のプロジェクトでは鈴木さんがおっしゃていたように.bashrcに
export OPENCV_MK_PATH=../../OpenCV2.3.1-android/OpenCV-2.3.1/share/
OpenCV/OpenCV.mk
を追加してみたところ,
/cygdrive/c/android-ndk-r8/build/core/prebuilt-library.mk:64: *** ターゲット
パターンが `%' を含んでいません. 中止.
と表示されました.

prebuilt-library.mkの64行目を見ると
$(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS)
となっており,(LOCAL_OBJECTS)は
LOCAL_OBJECTS := $(prebuilt)
prebuilt := $(strip $(wildcard $(LOCAL_PATH)/$(LOCAL_SRC_FILES)))
と定義されているみたいです.
cygwinのエラーをグーグルで調べても原因が分かりませんでした.
cppでOpenCVを使えるようになるまであと一歩だと思うのですが,自力で解決できません.
どうかもう少しだけお力添え願えないでしょうか.android.mkは以下のようにしています.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

include $(OPENCV_MK_PATH)

LOCAL_MODULE := chbmp-jni
LOCAL_SRC_FILES := chnmp-jni2.cpp
LOCAL_LDLIBS := -llog -ljnigraphics

include $(BUILD_SHARED_LIBRARY)

以上よろしくお願いいたします.
> > 2012年5月27日 1:16 Hiroaki GOTO as GORRY <gorry...@gmail.com>:
>
> > > 後藤 浩昭(GORRY)です。
>
> > >> 早速の返信ありがとうございます.
> > >> エラー内に書いてあるlibnative_camera_r2.2.2.soがそもそも見当たりません.
> > >> またプロパティ→全般で調べたところ,libsフォルダもarmeabi-v7aフォルダも読み取り専用にチェックが付いていました.
> > >> チェックをはずそうとしても「変更をこのフォルダ,サブフォルダおよびファイルに適用する」と表示され,結局外れません.
> > >> これは関係ありますか?
>
> > > 自分に読み取り権限しかないなら、変更はできないですよね。
> > > 変更権限のあるユーザーに変更してもらう必要があります。
>
> > > そもそも、それらのフォルダの上位フォルダの所有者が自分でないために
> > > 権限がないのではないでしょうか?
>
> > > ファイルの所有者を変更する(GUI操作編)
> > > http://www.atmarkit.co.jp/fwin2k/win2ktips/720chowner/chowner.html
>
> > > このへんはもうAndroid開発環境とは何も関係がなく、WindowsのACL機能や
> > > cygwinによるACL機能サポートの話になります。
>
> > > --
> > > Hiroaki GOTO as "GORRY" : 後藤 浩昭
> > > EMAIL: gorry...@gmail.com
>
> > > --
> > > このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> > > このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> > > このグループから退会するには、android-group-j...@googlegroups.comにメールを送信してください。
> > > 詳細については、http://groups.google.com/group/android-group-japan?hl=jaからこのグループにアクセスしてください。
Reply all
Reply to author
Forward
0 new messages