ラベル OpenCV の投稿を表示しています。 すべての投稿を表示
ラベル OpenCV の投稿を表示しています。 すべての投稿を表示

2022-12-16

OpenCV: 背景差分(Python編)

 OpenCVで背景差分を取得するプログラムです。びっくりするほど簡単にできてしまいますね。 ポイントとしては、

  • OpenCVには複数の背景差分アルゴリズムの関数が用意されている
  • 戻り値として、背景画素を0、前景画素を255とした2値画像が返される
というところです。これを応用すれば、人物だけ取り出すということも容易にできるわけです。



2020-03-11

Python:OpenCVで動画再生時の各フレームの絶対時間を取得する方法

OpenCVで再生している動画(mp4など)に対して、「○時○分○秒の動画を再生したい」という時の各フレームの絶対時間を利用したい場合、そのフレームの絶対時間がわかればいいんですが、どうやら記録されていないようです。そこで、次のアプローチが考えられます。

再生開始時からの経過時間は取得できる
cv2.CAP_PROP_POS_MSECを利用することで、再生中のフレームの経過時間(相対時間)を取得できます。つまり、動画の再生開始の絶対時間さえわかれば、この時間をプラスすることで再生時間がわかります。

再生開始時間を取得するには
動画ファイルの保存時間が1つの手がかりになりますが、それは動画が終了した時の時間になります。ただ、経過時間はわかるわけですから逆算すれば求めることができるでしょう。ただし、ファイルのタイムスタンプは秒が最小ですので、ミリ秒単位での誤差(最大999ミリ)が生じます。

録画時に細工をする
もし、動画録画のアプリケーションに細工ができるなら、録画開始時間を記録しておくとよいでしょう。録画アプリケーションをOpenCV等を利用して作成して、各フレームの時間を記録することもできると思います。どちらがスマートかは As you likeで。。。。

2020-03-09

Python:TkInterを用いてウェブカメラの映像を表示する(OpenCV利用)

前回の記事では、OpenCVのGUIを利用してウェブカメラの映像を表示しましたが、今回はPythonの標準的GUIライブラリであるTkInterを用いて表示してみます。

プログラムのポイント
ポイントは次の2点です。
  • TkInterでの表示形式に画像を変換する
  • TkInterのafter関数を利用して再帰的にループ処理を実現する
このプログラムだと、FPSの数値もほぼ変わりません(数値的にも若干落ちているような気もするという程度)。GUIを操作してもフレーム読み込みの処理が止まりませんので、OpenCVだけのよりはこちらのほうがいいかもしれません。



2020-03-07

Python: Webカメラの映像をOpenCVを用いて表示&録画する

OpenCVを用いて通常のWebカメラの映像を表示&録画するサンプルです。この程度の処理であれば、Pythonでも速度は問題なく出ます。利用したカメラの仕様が30FPSでしたが、このプログラムを計測するとほぼ30FPS出ることを確認しました。(ただし、シングルスレッドなので、ウィンドウ操作をするとFPSがガクンと落ちます)
コーディングにおいて特筆するべきところは、以下の通り。
  • VideoWriter_fourcc関数で動画のフォーマットを決める(どんなフォーマットがあるかは調べてみましょう)
  • readメソッドの戻り値は、読み込みのTrue/Falseとフレーム


2019-05-24

PythonでOpenCVでのラベリング処理

PythonでOpenCVでのラベリング処理を行う場合は、下記のコード通りに行います。注意点は
  • 画像を2値化すること
  • ラベリング結果は画像によっては画像全体を抽出する場合がある
後者については、最大の面積を持つ領域を取り出したい場合に要注意です。



2017-07-25

C#:画像ファイルをいろいろ扱っていたらOutofMemoryエラー出る場合の対処法

100ページ超のマルチページTiffファイルを解析するプログラムを稼働させているとメモリ使用量がどんどん上がっていき、4つほどファイルを読んだらメモリオーバーで落ちてしまうという減少に随分前から悩まされてきました。その解決策がようやく判明。
GC.Collect();
GC.WaitForPendingFinalizers();  
GC.Collect();
というように、ガーベージコレクションを発動させるだけでなく、赤字の処理を追記したほうがいいらしいです。GC.Collect()で挟むと良いようです。いままでGC.Collect()しか記述してなかったです。ググると既知のTIPSのようですね。

プログラムでは、OpenCVSharpを使ったりしているので、そのあたりのバグかな~とか思ったりもしましたが違いましたね。おかげで、メモリ使用量が全く増えることなく稼働できています。

2017-05-20

PythonでOpenCVを試してみた

ラボの開発言語も徐々にPythonへと移行の気配で、OpenCVもその餌食になりそうです。で、試してみました。

OpenCVのバージョンの確認
現在、OpenCVはバージョン3になっていますが、パッケージ名はcv2のままです。まず、自分のPythonの環境でOpenCV3がインストールされているのかを確認しておきましょう。pythonのコンソールにて、下記の2行を打ちこむとバージョンが出力されるはずです。でなかれば環境がおかしいです。
import cv2
cv2.__version__
Out[6]: '3.2.0-dev'  ← これが出力
サンプルを動かしてみる
下記の通りのサンプルを動かしてみましょう。これは、C#版の記事と同じ内容です。見比べてみたらわかりますが、表現が違っていたりします。そのキモですが、、、
  • OpenCVの関数を使うというより、numpyの関数を使っているということが多々ありそう。
ということ。例えば下記の例では、
  • Matのコピー
  • Matのトリミング
は、Matの処理というより、numpyの行列処理のようです。OpenCVの関数については、他の言語(C++,C#)とほぼ同じ感じですが、その切り分け方に注意ですね。


2017-05-16

Python:Anacondaの環境でOpenCVをインストールする

Python初心者(私)が躓くところなので作業メモ。(Anacondaの環境が前提です)
Pythonで各種ライブラリをインストールするには、基本的にAnacondaのコマンドを利用します。OpenCVも同様です。

OpenCVのパッケージを収録しているあるレポジトリを探す
まず、パッケージを探します。
  • anaconda search -t conda opencv3
というコマンドを入力して、OpenCV3のライブラリを探します。するとリストの中で
     ver228/opencv3            |    3.2.0 | conda           | linux-64, osx-64, win-64
というのが見つかりました。唯一3.2.0に対応してるようなので(2017.5.16現在)これにします。まだ続きがあります。今度はこのパッケージがどのレポジトリにあるかを探します。
  • anaconda show  ver228/opencv3
とコマンドを打ちます。すると、

To install this package with conda run:
     conda install --channel https://conda.anaconda.org/ver228 opencv3

という出力が出ますので、ここに書いてあるとおり、
  • conda install --channel https://conda.anaconda.org/ver228 opencv3
と打てばインストールは成功です。





2017-02-04

OpenCVSharpでテンプレートマッチング処理(OpenCV3.0対応)

OpenCVSharpでテンプレートマッチング処理。OpenCV3.0対応の記述です。
前バージョンとは若干の記述(クラス)が違いますが、基本的には同じですね。



OpenCVSharp:Mat変数の渡し方に注意

ちょっと初歩的なところで躓いたのでメモ書き。OpenCVSharpのプログラムで、
Mat mat = new Mat()
methodA(mat);
methodB(mat);
みたいなことをしました。各メソッドはほぼ同じことしてます。が、後者のメソッドが思ったように動かないケースに遭遇し、ちょっと格闘しました。

Matは基本参照渡し
結論(解決策)は、Matは基本参照渡しだということ。つまり、methodA内で変数matを処理したら、呼び出し元でも反映されているということ。つまり、上記の例では、Aに渡されるmatとBに渡されるmatは別物です。
もし、同じmatを渡したいなら、closeメソッドでコピーを作ってそれを渡しましょう。

2015-04-23

Byte[]に入っているRGB情報からOpenCVのIplImageに変換する方法(OpenCVSharp)

Byte配列に入っているイメージデータ(RGB情報)から、OpenCVのIplImageへ変換する方法です。今まで、WritableBitmapに変えてから変換してたんですが、これで処理が削減されます。


2015-02-18

NuGetを利用したOpenCVSharpのインストール

※OpenCVSharp3用に少し記事を書き換えました(2016/09/30)

OpenCVSharp3のインストールは、NuGetを利用するのが一番です。そのほうが、実行マシンでのOpenCVのバージョンの変化に対応しやすいです。下記はその手順です。なお、環境は、Visual Studio 2013を想定しています。

1.Nugetを利用したインストール

(1)NuGetマネージャーの起動
プロジェクトを右クリックして「NuGetパッケージの管理」を選択してください。


(2)OpenCVSharp3の検索とインストール

左のサイドバーからオンライン → すべて を選択したあと、右上の検索ウィンドウに「OpenCVSharp3」と入力してください(フルに歌入力しないと検索に引っかからないです)。“without DLLs”というのは、OpenCV本体のDLLを含まないという意味ですが、OpenCVSharp3はOpenCV本体とのバージョンの差異で動かなくなりますので、DLLを含んだもの(without DLLsと書いていないやつ)を選んで下さい。



2.サンプルを試す
下記のソースコードが実行できればOKです。testの画像は別途、どこかから用意してください。

注意事項
プロジェクトのプロパティで下記の設定を確認してください。
  • 対象のフレームワークを .NET Framework4にする
  • 64bit版のOpenCVを利用する場合は、プラットフォームターゲットを64bitにする


2015-02-02

OpenCVSharpにてテンプレートマッチングを行う

OpenCVSharpにて、テンプレートマッチングを行う方法です。Mat形式に対応しています。



2015-01-31

'OpenCvSharp.OpenCVException' の初回例外が OpenCvSharp.dll で発生しました。

OpenCVSharpを使っていて

  • 'OpenCvSharp.OpenCVException' の初回例外が OpenCvSharp.dll で発生しました。

というエラーが発生した時は、このままだと何のことだかわかりません。try catchでエラーを拾いましょう(当然ですが)。ErrMsgを見ることで、OpenCVのライブラリレベルのエラー詳細がわかります。

2015-01-22

OpenCVSharpでクリックイベントを設定する(Mat対応)

以前、OpenCVSharpにてクリックメソッドの設定の仕方に手間取り記事を書きましたが、前回のはIplImageの表示はできますがMatには対応してません。Mat対応のコードは下記のようになります。Windowのクラスが違うだけです。

2014-10-06

OpenCVSharpにてMatを利用してピクセルのRGB値を変更する(ポインタ利用編)

以前の記事で
というのを書きましたが、あれはダメですね。遅すぎです。C#でもポインタは使えますので、下記のように書けばOKです。



2014-09-23

OpenCVSharpにてMatを利用してピクセルのRGB値を変更する

OpenCVSharpにて、Matを利用してピクセル操作する例です。



OpenCvSharpExtern.dll' を読み込めないためにMatが利用できない場合の対処法

OpenCVは、歴史的経緯よりIplImageクラスからMatクラスへと利用する流れになっています。Matはピクセル単位のデータアクセスが容易なため、個人的にも積極的に使っていこうと考えています。

Matクラスが使えない場合がある?
先日、OpenCVSharpが使えている環境で、Matクラスを利用すると(インスタンスを生成するだけで)プログラムが
Invokeエラー:OpenCvSharpExtern.dll' を読み込めない(見つからない)
といったエラーを起こしてしまうという事象が起きました。
おさらいですが、OpenCVSharpを使うには、母体であるOpenCVに対して
  • プラットフォーム(32 or 64 bit)を共通にする
  • バージョンを共通にする
といった注意点があるのは周知の事実です。さらに、OpenCvSharpExtern.dllについては

  • プロパティの「出力ディレクトリにコピーをする」

という設定が必要です。

これらを注意し、IplImageを利用したサンプルプログラムの動作を確認しても、Matを使う時にはダメ、、、という意味不明な事象。エラーはInvoke関係のエラーで、エラーメッセージの注意書きにあるように
  • OpenCVのパス確認
  • Visual C++ Redistributable Package(再頒布可能パッケージ)のインストール
  • プラットフォームの一致(32bit or 64bit)
と点に不備があると発生するようです。

Visual C++ 再頒布可能パッケージに罠があった!
で、今回のエラーでは上記条件は全てクリアしており、原因究明に試行錯誤していたのですが、原因はVisual C++ Redistributable Package(再頒布可能パッケージ)にありました。
今回の開発環境はVisual Studio 2010ですので、Visual studio 2010の再頒布可能パッケージをインストールすればいいと思っておりました。。。が、Dependency Walkerで依存ファイルを見てみると
msvcr110.dllがない
ということが発覚。これは、Visual Studio 2012の再頒布可能パッケージに付随するものです。つまり、Visual studio 2010を使っているから2010用の再頒布可能パッケージがあればいいのではないということ。これは盲点でした。早速、、Visual Studio 2012の再頒布可能パッケージをインストールして解決したわけです。

なお、OpenCVSharp系のエラーはDependency Walkerで原因究明しろと作者も述べているのでインストールしておくとよいでしょう。


2014-07-25

OpenCVSharpにて、IplImageからHSV情報を取ってくる

Matに変換するとIplImageから容易にHSVの情報が取ってこれます。。



OpenCVSharpでのIplImage -> Mat 変換

OpenCVでは内部の画像フォーマットとして、従来はIplImageが主流でしたが、現在はMat形式を利用する流れになっています。で、当然、IplImageとMatへの変換についてはOpenCVSharpでも対応しており、
  • Mat mat = new Mat(srcImage);
というように、matのインスタンス生成時に IplImageを渡せば自動変換してくれます。

OpenCVSharpExtern.dllの設定に注意
Matクラスを利用するには、OpenCvSharp.CPlusPlus のパッケージを利用することになるのですが、このクラスは、OpenCVSharpExtern.dll を利用しているもよう。このdllは、参照設定では登録できないので、プロジェクトディレクトリに置かなければいけません。さらに、このファイルはプロパティにて
  • 出力ディレクトリにコピー:新しい場合はコピーする(または、常にコピーする)
という設定をしなければいけません。この設定を忘れると、上述のような変換の記述を実行すると、
  • TypeInitializationException が発生しました
というエラーが起きてしまいます。実はこのことに気づかず、Matへの変換ができなくて、何でかなーとかなり悩んでました。OpenCVのライブラリが動かなければすぐに気づいたのですが、通常の処理で問題なく実行できてましたので、まさか、初歩的な設定を忘れていたとは、、、

これで、ラボでも本格的にMatベースの記述に移行することができそうです。