KeiFugaku
@KeiFugaku (fugaku kei)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaCVでテンプレートマッチングを高速化したいのですが。

検索対象の画像のサイズが大きいと、matchTemplate関数の処理に時間がかかる

OpenCVの公式サイトから入手できる公式のJavaラッパーを使用し、特定の画像の断片が存在するか検査するプロクラムを作成していますが、検索対象の画像が画素数の多い大きなサイズになるほど著しく検出結果の取得に時間がかかるようになってしまいました。

そこで、C++版の資料からGPGPUによる加速を期待できるUMatoclMatgpuMatといったクラスを利用できないかと思案しておりましたが、どうやらJava版では提供されていなように見受けられました。

念のためPython版も確認してみましたが、こちらも状況は同じのように思われ、あわせて市販の書籍も参照してみましたがやはり出来ないという結論に至りました。

それではと思い立ち、Bytedecoで配布されている、JavaCVという別のパッケージへ乗り換えることにいたしました。

差し当たり、事前準備として日本語での解説やサンプルが入手できないか、あれこれ調べてみたのですが、どうもFFmepgによる動画編集のほか、画像変換や顔認証といったものが中心のようで、目的のテンプレートマッチングの高速化に関するものを見つけることが出来ませんでした。

まことに勝手ではございますが、どなたかにご指南いただけると、大変幸いと存じます。

参考にした資料

Qiita

WEB

書籍

0

1Answer

どうしてもGPUをC++以外のOpenCVで使いたいという話であればお役に立てませんが…画像サイズのせいで処理時間が掛かるのに対しては別の改善方法を提案します。縮小した画像同士で粗く位置検出しておき、原画像上での探索範囲を狭めるのです。例えば
http://imgprolab.sys.fit.ac.jp/~yama/imgproc/lec/imgproc_patternrecog_2_2017.pdf
のp. 10にあるようにpyramid imagesを作って多段で処理すれば、かなりの高速化が可能です。ただし原画像の特徴によっては段数を増やすと誤検出が増えやすいので、試行錯誤が必要です。

0Like

Comments

  1. @KeiFugaku

    Questioner

    @ktgw0316さんありがとうございます。
    確かに市販の書籍にも同様の手法が紹介されていますね。確か「畳み込み」と呼ばれていたりしていたでしょうか... どの程度高速化できるのか、ぜひ一度検証してみたいと思います。

    GPGPUの活用については――やはり英語のドキュメントに挑んでみるしかないですかね。

Your answer might help someone💌