日々是好日

プログラミングについてのあれこれ、ムダ知識など

OpenCV for Androidで手書き文字をクロッピングする

概要

  • 写真をOpenCVで二値化して、手書き部分のみクロッピングする
  • Bitmapをアルファ付きPNGとして保存するとき、Bitmap#setHasAlphaをセットしないとアルファ値が捨てられる
    • 読み込んだときに背景が黒に置換される模様

動きとしてはこんな感じ。

f:id:kcpoipoi:20201101124152g:plain

  • 概要
  • OpenCV for Androidの導入
  • OpenCVの初期化
  • PNGをBitmapとして取り込む
  • 画像処理テスト用にクラスを作成する
    • MainActivityからの呼び出し
    • ファイルの入出力クラスの作成
  • 二値化の方法について
  • 調べたものリスト
    • Bitmapの保存について
    • BitmapのPixel操作を扱ったもの
    • OpenCVの反転処理を扱ったもの
    • OpenCVで透過処理を扱ったもの
    • OpenCVのMatクラスについて
    • findContours等、輪郭を扱ったもの
    • 平滑化処理を扱ったもの
    • 膨張・収縮処理(Dilation/Elosion)
    • OpenCVリファレンス
    • Core.splitとかmergeとかやってるけど全然分からなかったもの
    • 関係ないけど画像の暗黙的Intentについて
    • OpenCV for Androidのインストール
    • Android単体で画像の切り抜き
続きを読む

Android Studio 4.1 にOpenCV 4.5.0 をインポートするメモ

Android Studioのバージョン更新のためか、Qiitaや個人ブログの方法がそのままでは使えなかったのでメモ。

大筋は下記参照でいいと思うのでポイントだけ。
(まだインポートまでしかやってないけど←)

qiita.com

環境

現象

  • Import Module from SourceダイアログにModule nameが無い
  • デフォルトではモジュール名がsdkとなるが、opencv等任意の名前に書き換える場合はsettings.gradleも修正する必要あり

ぱっとモジュール名を変更すると、Project Structureからモジュールの依存関係を追加するときにモジュールが見つからなくなるという地味なトラップがあった。

対応

File -> New -> Import Module
で表示されるダイアログには、Source directoryはあるがModule nameは無くなっている。

⇒インポート後に、手動でモジュール名とsettings.gradleを修正する

OpenCVをインポートするとき、指定するフォルダがsdkとなっているため、 Android Studioにインポート後もsdkという名前になっている。

任意の名前に書き換えるときはsettings.gradleを修正する必要がある。

include ':app'
- include ':sdk'
+ include ':opencv' // ← モジュール名がsdkでインポートされるため、任意の名前に書き換え
rootProject.name = "OpenCVSample"

とりあえずここまで。あとテストしてハマったら随時追記する。

Mockito+kotlin-allopenプラグインでモックする

Kotlinでテストを書く場合、kotlin-allopenプラグインを使うと簡単にモックできるということですが、ネットに転がってる情報が思いのほか不親切だった(他責)ので個人的まとめ。

  • 結論
  • kotlin-allopenとは
  • リリースビルドではどうするのよ
  • mock-maker-inlineは?
続きを読む

Androidアプリのアップロード鍵.keystoreの作成と管理について

Androidの署名ファイル(keystore)について個人的まとめ。

今のところ一番腑に落ちる配置の仕方かな?

  • keystoreとは
  • 環境
  • 手順
    • /Users/user/.gradle/gradle.propertiesにパスを記述する
    • .gradle/.signingフォルダを作る
    • keystoreファイルを生成する
    • keystoreを.signing/YourProjectNameに移動する
    • パスワードをprojectname.propertiesに記述する
    • build.gradleに署名付きビルドのためのコードを記述する
    • ビルドバリアントをreleaseにしてビルド
  • 参考
続きを読む

Pandoc+Dockerでドキュメント作成環境を整備する

Pandoc、MarkdownからHTMLでもPDFでも、Wordにだって出力できて便利ですね。

軽い気持ちでPandocを導入しようとしたら地獄を見たのでその備忘録です。

なお、筆者の環境は Windows10 Pro + Docker for Windows で構築しています。 Linux歴3週間程度のため、コマンドの打ち方等は未熟な部分がありますのでご容赦ください。

2020/7/27 17:00 更新 HTMLの見出しの採番用Luaフィルタを追加

github.com

リポジトリを作成しました。

  • 目的
  • 概要
  • 手順
    • Docker (Docker for Windows)をインストールする
    • pandoc/latexイメージを導入する
    • LuaTeXパッケージ等導入する
    • 図表対応のため pandoc-crossref を導入する
    • easy-pandoc-templatesを導入する
    • Dockerfileを作成する
    • 長いオプションをDefault fileにまとめる
    • 補足:採番の接頭辞・接尾辞の修正
      • PDF出力の場合
      • HTML出力の場合(easy-pandoc-templates使用を前提)
  • 参考にさせていただいたサイト
続きを読む

vue serve コマンドとカスタムパーサ設定の話

vue serve <vue file>が便利そうだったので使いたいと思ったら、思いのほかトラップがあったのでメモ。

.eslintrc.jsにおいてカスタムパーサを指定するのがキモだった模様。

実際何が必須で何が不要なのかわかってないので後で調べる。

手順

まず最初にnpm install -g @vue/cli @vue/cli-service-globalをインストールしておく。

このままvue serve <vue file>をやっても、おそらくCannot find module 'babel-eslint'とエラーを吐いてしまう。

babel-eslintパッケージがインストールされてないのは分かる。 一方で、ESLintをローカルのままでserveしたい場合が出てこなかった。

ESLintをローカルのままでserveしたい場合、次のようにする。

①最初にnpm i --save-dev eslint babel-eslintでローカルにインストールする。

package.jsondevDependenciesに次のとおり記載されていればOK(だと思う)。

// package.json
// `vue create`で最初から導入されているパッケージも含む
"devDependencies": {
    "@typescript-eslint/eslint-plugin": "^2.33.0",
    "@typescript-eslint/parser": "^2.33.0",
    "@vue/cli-plugin-babel": "~4.4.0",
    "@vue/cli-plugin-eslint": "~4.4.0",
    "@vue/cli-plugin-typescript": "~4.4.0",
    "@vue/cli-service": "~4.4.0",
    "babel-eslint": "^10.1.0",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^6.2.2",
    "typescript": "~3.9.3",
  }

.eslintrc.jsに次のとおり追記する

// .eslintrc.js
module.exports = {
  root: true,
  env: {
    node: true
  },
  'extends': [
    'plugin:vue/essential',
    'eslint:recommended',
    '@vue/typescript/recommended'
  ],
  parser: "vue-eslint-parser",  // ←追記
  parserOptions: {
    parser: "@typescript-eslint/parser",  // ←追記
    ecmaVersion: 2020
  },
  ...

vue serve <vue file>でローカル鯖起動できればOK

あとで調べる

カスタムパーサ #とは

参考

cli.vuejs.org

igatea.hatenablog.com

github.com

qiita.com

eslint.vuejs.org

Vueでプロジェクトを初期化したときのメモ

vue create <project-name>でVueプロジェクトを作成したとき、毎回同じところでハマっているのでいい加減手順をメモしておく。

構成は Vue+Firebase、UIにVuetifyを使用する(Vue 4系)。

あと、ついでにFirebase FunctionsではローカルのESLintを有効にする(グローバルインスコしない)。

手順

どうもVueで初期化したプロジェクトフォルダ内でfirebase initすると、Functionsのpackage.jsonとVueのpackage.jsonが競合(nodeモジュールが思ったところにインストールされない)してしまうため、frontendとbackendディレクトリに分けて構成した。

package.jsonがnode_moduleを走査するときの動作が影響しているような気がするけど、いまいち分からん。

…と思って検索したらこうすればよかった件。でもやっぱりめんどそうだな…( ˘ω˘)

www.it-swarm.dev

手順少し修正。FunctionsとHostingを同一フォルダにインストールしようとしてたのがいけない…。

Firebase でプロジェクトを作成

  1. Firebase コンソールでプロジェクトを作成する。

  2. FunctionsやStorage等初期化しておく(reagionはasia-northeast1(東京))

あとでindex.htmlに注入するHtmlスニペットはとりあえず脇に置いておく。

ローカルにプロジェクトを作成

  1. 前準備として、frontendbackend/firebaseディレクトリを作成する

  2. frontendディレクトリにて、vue create <project-name>でVueプロジェクトを作成する。このとき、TypeScriptを選択しておく(あとから導入する場合

  3. tsconfig.jsonにてcompilerOptions.module: "commonjs"とする

  4. とりあえずnpm run buildでビルドできることを確認する(distディレクトリが生成)

  5. vue add vuetifyでVuetifyを導入する。App.vue等書き換えるか聞かれるが、問題なければYesで。

  6. tsconfig.jsonにて、compilerOptions.types: ["vuetify"]を追加する。忘れると型定義を参照できないためコンパイル時にエラー吐く。

  7. backend/firebaseに移動し、firebase initでFirebase プロジェクトを初期化する

  8. Firebase コンソールにて作成したプロジェクトを選択する

  9. とりあえずFirestoreとHostingとFunctionsを選択する。Hostingはfrontendディレクトリで初期化する。

  10. FuncitonsをインストールするときにTSLintを導入するか聞かれるが、現在はESLintに移行しているようなのでNoを選択する

  11. ひととおりインストールが終わったら、frontendディレクトリに移動し、firebase init hostingホスティングをインストールする

  12. Hostingの設定時にデプロイするディレクトリを聞かれるので、distとする。このとき既存のファイルを上書きするか聞かれるが、Noとする

  13. firebase serveでVuetifyの初期ページが表示されることを確認

  14. backend/firebase/package.jsonにてdevDependencieseslintの依存関係を追加し、npm i

  15. ./node_modules/.bin/eslint --initでESLintを導入

  16. frontend/public/index.html<body></body>内にFirebaseを利用するためのHtmlスニペットを記載する

以上で終わり。 ローカルの構築にトラップがありすぎる。これ全部覚えてるフロントエンドエンジニアつよすぎでは…。

参考

qiita.com

qiita.com