OpenCV

色による探索 (cv::inRange)

Hueを最大180に設定している。元のイメージの黄色と黄緑色、青色の矩形と円は全て認識することが出来ているが、それよりも先にHue0〜10程度で認識されていなければならない赤色の矩形が認識されていない。 赤が認識されないということで別な実装方法を試して…

色による探索 (cv::threshold)

OpenCVのモバイルにおける典型的な目的の一つに、カメラを通してキャプチャした映像、画像に対して「顔認識」「人物認識(肌色認識)」「オブジェクト認識」を行うことがあるが、これらの探索のパラメタには前回紹介した特徴で認識する他に色を特徴のパラメタ…

領域の探索 その2

前回、OpenCVを用いて特定の条件に合致した四辺形を探す方法を幾つか書いた。 面積 フェレ径比率 構造 また、これらの方法は画像の質に極めて依存するということで、カメラで撮影した映像などでは必ずしも有効な探索方法とはいえないことも書いた。今回は多…

cvBlobsLib (その2)

cvBlobsLib - OpenCV Wiki cvBlobsLibが使えそうだということは解ったのだが、問題は主要なモバイルプラットホームで使えるかどうかだ。 iPhone(iOS) aaronsung/cvBlobsLib-iOS · GitHub Objective-C(++)へのポートとも言える実装。本家と同等に使えそうだ。…

cvBlobsLib

cvBlobsLib - OpenCV Wiki cvBlobsLibは"blob detection"、つまりイメージからオブジェクト(blob)を抽出、ラベリングするためのライブラリィ。 ベースがOpenCVなので、これを使って先日のエントリに書いた「領域探索」が出来るんじゃないかと期待している。…

領域の探索

OpenCVを使って、iPhoneのカメラから撮影した画像中にから条件に合致した四辺形を探したい。OpenCVを使ったイディオムとしては処理は以下のようになるだろう。1. 画像の前処理 (median, gausian等、フィルタによるノイズ除去等) 2. 画像の2値化 (threshold,…

XcodeにおけるC++コードとデバッグとコンパイラオプション

以前に「OpenCVのコードを書く時にはC++で統一する」と宣言した。OpenCVのコードをC++にすることによって OOPになって画像やマトリクスを一貫してcv::Matクラスで扱えるようになった テンプレートやコレクションクラスが使えるようになった (最初は気味が悪…

凸包とOpenCV

昨日までの件に関して、もう一度困っている事とやりたい事とを整理しておこう。 困っている事 findContourとapproxPolyDPで抽出した輪郭の頂点座標の出現順が一定しない。 座標原点の右上から出現したり、左下から出現したりするため、他の座標系(例:UIView)…

下手の考え休むに似たりとも限らない

実際に試してみると解ることだが、昨日の案は頂点が4つだとしても全ての頂点がNE、NW、SE、SWそれぞれに綺麗に属する訳もなく、複数属しているケース場合は更にその点を含む矩形を抽出して... とかやっていると切りが無さそうなので止めた。 もっと単純な、…

輪郭とその頂点座標を並べ直す

OpenCVのfindContourにおける輪郭と頂点座標の抽出順だが、色々と調べてもそのアルゴリズムが判らなかったので、以下のように考えて自分で並べ替えることにした。 輪郭(contour) 頂点が4つ以上の閉じた輪郭を対象とし、その面積(cv::contourAreaで取得できる…

Contourの抽出順

OpenCVにおけるfindContour等による画像の輪郭の抽出の順序、および輪郭内の座標の順序がその時の画像の条件によって変わる気がするのだが、ドキュメントにそのような記述は見当たらない。特に規則は無いのだろうか。 だとすれば自分でなんらかの基準でソー…

OpenCVのHSV

cvtcolor : その他の画像変換 ― opencv 2.2 documentation HSV色空間 OpenCVで取り得る値の範囲 H (Channel1) 0〜180の範囲。Hueは本来0〜360だがOpenCVではH/2の値を示す。181〜255の範囲は0からの循環に回される S (Channel2) 0〜255の範囲。255がS=1.0に…

モバイルの悩み

OpenCVを使ったアプリケーション、それもモバイルアプリケーションで一番の悩みはデスクトップ等に比べてリソースの制約が大きいことだ。 MPU メモリ GPU モバイルプラットホームはこの2年で飛躍的な進歩を遂げたが、それでも一般的なデスクトップPCに比べる…

ルックアップテーブル

OpenCVではマトリクスに対して一定の関数カーブを適用する際に、ルックアップテーブルを使う。 例えば、画像のガンマ値を調整したい場合、OpenCVにはそのものズバリのファンクションは無いが、ルックアップテーブルを利用することでガンマ調整を実装できる。…

OpenCV CからC++対応表

前にも書いたが、OpenCVはXcode上ではC++で書く事にした。 しかしやはり世の中に出ているOpenCVのコードで一番多いのは未だにCであり、それを参考にしてC++に書き換えるのが結構面倒だったりする。 ファンクションとメソッドが対応していない場合がある(C++…

こんなんなりました

58MBのヒープを使っているアプリなんて他に何も無いが、仕方が無いだろう。 昨日悩んだ肝心の仕様(制限)だが、オプションで画像のサイズを大小と選べるようにしておき、大を選んだ場合はICS以降を条件にするつもりだ。

ヒープサイズ (その2)

ログからはヒープの伸びも頭打ちもまだはっきりしないため、まだメモリリークがあるかどうか分からない。 もう少し大きなヒープで試したい所だ。 ということで大きなヒープで動かしてみよう。iOSは私の知っている限りでは「アプリケーションヒープを制御する…

ヒープサイズ

OpenCVを利用したサンプルアプリケーションをandroidプラットホームに移植しているのだが、Bitmap生成に起因するOOM(Out of Memory)に悩まされている。以前にエントリに書いたように、ハードウェアアクセラレーションを有効にした状態で扱える最も大きな画像…

OpenCV for android 2.4.3 (その3)

実機ではGoogle PlayからOpenCV Managerをインストールすることが出来たが、エミュレータはどうすれば良いのだろう。とすぐに見つかった。以下のコマンドでエミュレータにOpenCV Managerをインストールすることができる。 OpenCV4Android SDK ― OpenCV v2.4.…

OpenCV for Android 2.4.3 (その2)

OpenCV for androidのインストールが終わったので、実際にアプリケーションを書いてみよう。 OpenCVといえば、まずすることは2値化ということでImageViewに表示する前に画像をOpenCVで2値化するコードを書いてみた。 MainActivity.java private void doBin…

OpenCV for android 2.4.3

そろそろandroid側のOpenCVも覗いておこうと思い、インストールしてみた。version2.2以降、Java APIが整備されてきたおかげで、基本的にJava APIでアプリケーションを書けるはずだが、OpenCVの提供するサンプルアプリケーションを動かすためにはNDKを使った…

approxPolyDP

久しぶりにOpenCVネタ。「久しぶり」といっても触るのが本当に久しい訳ではなく、実際には色々と試しては壊しているのだが。 OpenCVは根っこの部分になると線型代数学等の私が全くからきしな分野になるし、その逆にプログラミングに降るとAPIの粒度が非常に…

OpenCVはC++で書くことにする

OpenCVを学ぶ時には確か「Objective-Cとの相性もあるし、Cで統一することにする」と書いたと思うが、初版の事情でC++に統一して書くことにする。 理由は色々あるが、OpenCVというライブラリイ(というかもうこれはプラットホームだよな)の学習を進めるに従っ…

cvFindContoursのmodeパラメタを変えて実行してみた

昨日のエントリで書いたcvFindContoursのmodeパラメタだが、解説するよりも実際に動かした結果を見たほうが分かりやすい。なので実際に試してみた。方法としては今まで紹介してきたようにcvCvtColorでグレイスケール化→cvThresholdを使って二値化した画像を…

cvFindContoursのmodeパラメタとmethodパラメタ

cvFindContoursは与えられた2値化済み画像の輪郭を抽出してCvMemStorageに格納してくれるのだが、パラメタによって抽出した輪郭の格納の方法(構造)が違う。 cvFindcontours - Structural Analysis and Shape Descriptors ― OpenCV v2.4.2 documentation mode…

輪郭を認識する

ここまでやってきたことは1. cvCreateImageによるIplImageの生成 2. cvCvtColorによるグレイスケール画像の生成 3. (cvThreshold又はcvAdaptiveThreshold)による画像の2値化処理 だが、これらは全てOpenCVで最も美味しい機能の一つであろう、輪郭の検出を行…

適応的2値化処理

昨日紹介した2値化処理は見た目では所謂「反転画像」であり確かに2値化なのだが、私は2値化した画像から対象となるオブジェクトの輪郭を認識してその座標を得ることが目的なので他の方法で2値化を行うことにする。 適応的2値化処理 cvThreshold関数による2値…

2値化(Binarization)

2値化というのは文字通り、画像の色情報を黒と白の2値に単純化する操作である。 画像処理、特に各種の認識処理では画像の情報が単純であればあるほど効率良く行えるので2値化は非常に重要である。一般的には2値化のことを「モノクローム化」と考えるが(私も…

IplImageとUIImageの相互変換

既に色々な方が書いており色々なユーティリティとなっているが、私は取りあえずObjective-Cのクラスユーティリティとして使っている。(そのうち手を入れる予定だ) OpenCVUtil + (IplImage*)IplImageFromUIImage:(UIImage*)image { CGImageRef imageRef = ima…

IplImageを作成する

OpenCVがXcode上、iPhoneシミュレータで動くようになったのでいろいろと試していこう。 OpenCV上で画像データを格納するための型は現時点(ver2.4.2)で大きく二つある。 IplImage構造体 OpenCV開始当初から用意されているCの構造体。殆どの画像操作関数はこの…