2025.2.21 2020.1.4 Coskx Lab
1 はじめに
この資料では,OpenCV sdkの配布zip中のsamples/tutorial-1をもとにAndroidStudioでカメラプレビューするアプリを構築します。
tutorial-1をもとにしているので,Android5.0以降非推奨のhardware.camera APIを使用していますが,camera2 API使用のアプリにも変更できます。
カメラ権限獲得はCameraActivityがやってくれます。
OpenCV4.10以降ではAndroidDeviceを縦位置にしても横位置にしても正しく表示できるようになりました。
自分でカメラ権限獲得を行う場合は,次のリンク(camera2 APIを用いたプレビューアプリ)を参照してください。
「OpenCV4.11.0のカメラプレビュー(java)」 ≫
「OpenCV4.11.0のカメラプレビュー(kotlin)」 ≫
OpenCV4.1.0からOpenCV4.1.1になったときに,permission関係で大きな変更があり,4.1.0で使っていたソースコードが4.1.1では動作しなくなりました。
そのときにsamples/tutorialを参考にソースコードを書き換て,トラブルを脱したことがありました。
samples/tutorialを参考に作り直す手順は,今後も必要な時があると思い,このWebページを作成しました。
4.9から4.10への変更でもCameraBridgeViewBase.java,JavaCamera2View.java,JavaCameraView.javaの3つが変更されました。
(縦位置も正しく表示できるようになった)しかし,ライブラリモジュールを使う側では変更の必要はありませんでした。
2 使用環境
3 準備
3.1 Android Studio
インストール済とします。
3.2 OpenCVのダウンロード
次のところからアンドロイド版をダウンロードします。
https://opencv.org/releases/
(この説明ではカレントのOpenCV 4.11.0を使っていますが,適当に変えて読みかえてください。)
opencv-4.11.0-android-sdk.zip
がダウンロードされるので,解凍すると
OpenCV-android-sdkという名前のディレクトリができます。
この中には
ファイル LICENSE
ファイル README.android
ディレクトリ samples
ディレクトリ sdk
が入っています。
OpenCV-android-sdk を適当な場所に置いてください。
(この説明ではCドライブのルートに置きました。)
4 Android Studio で新しいproject
Android Studio で新しいprojectを作ります。新しいプロジェクトでカメラプレビューアプリを作ります。
・(ファイルメニュー File -> New -> )New Project --> Empty Views Activity
・New Project の名前は OCVpreview とします。(別の名前でもOK)
・AppおよびOPenCVモジュールでjavaを使用するので,
Language → Java
Build configuration language → Groovy DSL(build.gradle)
とします。
・パッケージ名は「jp.gr.java_conf.coskx.ocvpreview」(この文書での)です。デフォルトのパッケージ名のままでOKです。
パッケージ名はこの後,何回か出てきます。
・他の設定はそのまま -> Finish
ここで,MainActivity.javaを開くと,先頭がpackage名設定行で,ここに書いてあるのがパッケージ名です。
この文書でのパッケージ名は「jp.gr.java_conf.coskx.ocvpreview」です。
この後,何回か使いますので,作業中のパッケージ名をメモを取っておくとよいと思います。
出来上がったプロジェクトはそのまま(メニューバーのRun -> Run'App' を選び)実行すると,「Hello world!」を表示するアプリが実行されます。
5 OpenCVのライブラリをモジュールとして取り込む
OpenCVのライブラリをモジュールとして取り込む作業では,C:\OpenCV-android-sdk\sdkを取り込みます。
(1)android studio メニューバーのFile -> `New -> Import Module を選ぶ。
(2)Source directory に,C:\OpenCV-android-sdk\sdk を指定し,OK。
ここでModule nameボックスが現れるので,Module nameをsdkからOpenCVに変更します。
(sdkのままでも良いのですが,後から見ると意味不明になりますので,変更します。実際にはバージョン番号まで入れると後から,都合がよいと思います。)
変更しなかった時には,この後もモジュール名は「sdk」のままになります。
なお,この段階で,ファイルOpenCV\build.gradle,あるいはbuild.gradle(:OpenCV))内の compileSdkVersion targetSdkVersion などを新しい記述に変更し, 値も適当なバージョン(2025.2.21時点では35)に変更しておくと良いと思います。
compileSdkVersion 31 → compileSdk 35
minSdkVersion 21 → minSdk 24
targetSdkVersion 31 → targetSdk 35
targetSdk 35 のところに警告が出ますが,そのままにしておきます。
右上の青い字の「Sync Now」でsyncします。
6 依存関係の設定
ここでの説明用画面の表示が古いままのものですが,似ているので読み替えてください。
プロジェクトOCVCameraがOpenCVのモジュールを使うこと(に依存していること)を設定します。ただし,OpenCVのモジュール名は「OpenCV」となっています。
(1)メニューバーのFile -> Project Structure を選ぶ。
(2)左側のDependenciesを選び,Modulesでapp を選ぶ。
(この段階ではModule appのDeclared Dependencies中にモジュール「OpenCV」は無い)
(3)Declared Dependencies の+-と書いてあるところで,+(add) をクリックし、3: Module dependenciy を選ぶ。
(4)Add Module Dependenciesダイアログで モジュール「OpenCV」にチェックを入れて(選らんで),OK。
Module appのDeclared Dependencies中のapp中にモジュール「OpenCV」が増えている。
(プロジェクトOCVCameraのappがモジュール「OpenCV」を使うことが設定された。)
(5)OK。
(Syncが終了するまで待つ 黄色の帯にTry Againが表示されたらそれをクリック)
Gradle Script/build.gradle(Module.app)のDependencies内に
implementation project(':OpenCV')
が追加されていればOK。
Android Studio左側project中にapp, OpenCVが並んで表示されたらOK
★ 実は,上記の(1)から(5)の作業は,
Gradle Script/build.gradle(Module.app)のDependencies内に
implementation project(':OpenCV')
を追加する作業のようなので,この1行を追加しSyncすれば,それだけで良いようです。
7 OCVpreviewの編集
OCVpreviewのProjectでは次の3点を編集します。
7.1 AndroidManifest.xmlの編集
app/manifests/AndroidManifest.xmlにおいて,カメラを使うことを宣言します。次のように6行追加になります。
7.2 activity_main.xmlの編集
app/res/layout/activity_main.xmlを編集します。
「Hello World!」を表示するような画面設定(Textview)を消して,カメラビューを表示する設定だけに直します。
変更部分は,チュートリアルのxmlから持ってきました。(app:camera_id="back" を追加してあります。)
ここで,layoutの設定にactivity_main.xmlという名前のファイルを使っています。
その中の表示領域のIDとしてcamera_viewという名前を使いました。
この2つの名前を後でMainActivity.javaの編集で使います。
org.opencv.android.JavaCameraViewのところをorg.opencv.android.JavaCamera2Viewに書き換えると,hardware,camera API使用のアプリからcamera2 API使用のアプリになります。
(app:camera_id="back" のところを app:camera_id="front" と変更すると,スクリーン側のカメラが使えます。)
7.3 MainActivity.javaの編集
!!あれれ android studioで.javaファイルの拡張子.javaが表示されません。補って考えてください。
C:\OpenCV-android-sdk\samples\tutorial-1-camerapreview\src\org\opencv\samples\tutorial1.java
の中身を作業中のProjectのMainActivity.java内に上書きコピーして,必要な名前の変更をする手順で作業します。
●最初にtutorial1.javaの2行目以降をMainActivity.javaの2行目以降に上書きコピーします。
そうすると,先頭行のパッケージ名(package .....)は残ります。
●次に必要な名前の書換をします。
1)Activityの名前を元のMainActivityに戻します。
MainActivity.java中のすべての「Tutorial1Activity」という名前を「MainActivity」に置換します。
2)onCreate中のlayoutのIDの記述の整合性を取ります。(layout/activity_main.xmlへの依存)
setContentView(R.layout.tutorial1_surface_view);
を
setContentView(R.layout.activity_main);
3)onCreate中のViewのIDの記述の整合性を取ります。(layout/activity_main.xml内の「camera_view」への依存)
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
を
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.camera_view);
4)public class MainActivity extends...の行の
CvCameraViewListener2
を
CameraBridgeViewBase.CvCameraViewListener2
に変更します。
5)public Mat onCameraFrame...の行の
CvCameraViewFrame
を
CameraBridgeViewBase.CvCameraViewFrame
に変更します。
6)この手順では起こらないと思いますが,もし,未解決の名前(赤字)が出てきたら,未解決の名前の解決をstudioの自動修正機能の助けを借りて
Alt+Enterで行います。(赤字がなくなるまで)
OpenCV4.11.0(4.1.1以降なら同様)の場合は次のようなMainActivity.javaができます。(import ...のところは多少異なるかもしれません。)
ここまでで,buildすると,とりあえず動作するはずです。
プレビュー表示が,スマホなどのデバイスの画面を有効に使っていない(画面に比べて狭い)と感じたら,
もう少し広くすることができます。
public void onCreate(Bundle savedInstanceState) {
:
}
の最後の行は
mOpenCvCameraView.setCvCameraViewListener(this);
ですが,その直後に
//requesting preview size option (maxWidth > maxHeight)
mOpenCvCameraView.setMaxFrameSize(1280, 720);
を加えてみてください。画面サイズを1280x720に近い都合の良いサイズで表示してくれます。
あまり大きな値にするとfps(表示速度)が遅くなります。
8 bulidと実行
不要なimportや不要な変数名もあります。Android Studioではそれらがグレーの文字になっています。消去しても構いません。
onCameraFrame() はカメラが1フレーム取得するたびに呼ばれる関数です。
引数(inputFrame)にカメラからの入力フレーム画像が入り,戻り値で表示したいMatを戻します。
Mat mMatを用意して,初期化と廃棄をするようにして,関数onCameraFrame()を次のように変更すると,ネガポジ反転で表示します。
複数の表示方法の中から1つだけ選ぶことができます。
![]() |
![]() |
カラー画像 | グレースケール画像 |
![]() |
![]() |
カラー画像リバース | グレースケール画像リバース |
![]() |
![]() |
グレースケール画像Cannyフィルタ | グレースケール画像二値化 |
9 カメラのパーミッション
カメラのパーミッションのユーザからの取得は,CameraActivityのOnStart()が舞台裏でやってくれるので,明示的な記述は不要になっています。
protected List<? extends CameraBridgeViewBase> getCameraViewList() のオーバーライドが必要なだけです。
参考
・CameraActivity.javaはOpenCV/java/org.opencv/androidにあります。
・CameraActivity.javaはOpenCV4.1.1より使われるようになったようです。
10 終わりに
・Android StudioでOpenCV4.11.0のチュートリアルをもとにカメラプレビューテストアプリを作る手順をまとめました。
・OpenCVのチュートリアルをもとににする手順なので,OpenCVバージョン変更への対応は柔軟だと思います。