2015年10月27日火曜日

Windowsアプリケーションにも挑戦


せっかくOpenCVを使って映像加工をするのだから,アプリケショーン化もしてみたいなぁと.


ということで,

  • windows アプリケーション
  • iphone アプリケーション
  • android アプリケーション

これらに挑戦してみようかなと.



正直スマホアプリ市場は飽和状態なので新規性を見出すこと自体が難しいのですけど,

ちょっとした話のネタになるようなものを作れれば良いかな,なんて.


お金になれば嬉しいなぁ,ぐらいで笑



というわけで良い休日の暇つぶしが出来たかな,って思います.


がんばるぞい.

2015年10月25日日曜日

基本 - GpuMat

さて cv::Mat で宣言した画像(フレーム)はcv::Mat::~ のように宣言される関数に対応します.
これによってCPUを用いた処理がなされます. 
これらは一般的に汎用性が高く,処理は遅いとか言われますね.

 一方でグラフィックボードを用いた処理をGPU処理といい,
 これらは一般的にある種の処理について高速化できると言われます. 

詳しくはこちら >> 日本GPUコンピューティングパートナーシップ


さてOpenCV3.0ではCUDAを用います.

cv:: で読み込むライブラリはCPU処理, 
cv::cuda:: で読み込むライブラリはGPU処理的な感覚です.

 cv::Mat は cv::cuda::GpuMat で宣言することができます. 

基本的には同じですが,画像を表示する cv::imshow を利用する場合などは
CPU用とGPU用に変数を用意しておくと便利かも?

例えば

cv::Mat temp;// 読み込んだ画像をtempにいれる 
cv::cuda::GpuMat TEMP;
// CPU処理 
TEMP.upload(temp); // temp の中身を TEMP に入れる 
// GPU処理 
TEMP.download(temp); // TEMP の中身を temp に戻す 
// CPU処理 

自分はこんな感じですけど,冗長なのかな. ま,こんな感じですねー.


詳しくはこちら >> cv::cuda::GpuMat Class Reference

基本 - Mat

MatとはOpenCV上で画像(動画のフレーム含む)を扱うための格納庫みたいなものです. 

行列で表されますが,任意次元であるためユーザや目的によっては変化に富みます.

以下は公式ポータルサイトにあるCookBookからの引用です. 


OpenCVの構造には,次元とチャンネルの概念があります. 
  • チャンネル(channel):要素の次元 
  • 次元(dimension):複数の要素からなる配列の次元 
マルチチャンネル多次元配列の例 :
  (Dim=2 Ch=2, Dim=2 Ch=1, Dim=2 Ch=3, Dim=3 Ch=4)


上図のように 1*x の行列でも x*1 の行列でも次元は2以上となることに注意すれば,

扱ううちに慣れてくるはずです.


まだ自分も慣れてませんけど←



さて型の概念も重要だったり. 

ビット深度といい,その(x,y)の画素がどのような型式かを表します.

cv::Mat temp; 
std::cout << temp.depth() << std::endl; 

のように確認することができます(tempの中に何か画像を入れてからw) 

型の種類について詳しくはこちら >> OpenCV入門 


処理によっては8UC3型の画像を引数にもつ前提の関数に

8UC1型で読み込んだ画像を渡せません,ってことです!


逆に渡した画像は8UC3でも処理された画像は8UC1なんてこともあるので注意です.

OpenCVとは?

 OpenCVとはbuildinsiderさんのOpenCVとは?によると以下の通りです.
OpenCV(正式名称: Open Source Computer Vision Library)は、オープンソースのコンピューター・ビジョン・ライブラリです。コンピューターで画像や動画を処理するのに必要な、さまざま機能が実装されており、BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。

つまりVisualStudioなどのコーディングツールで画像処理を実現できるようになるためのライブラリというわけです.

例えば

  • フィルター処理
  • 行列演算
  • オブジェクト追跡(Object Tracking)
  • 領域分割(Segmentation)
  • カメラキャリブレーション(Calibration)
  • 特徴点抽出物体認識(Object recognition)
  • 機械学習(Machine learning)
  • パノラマ合成(Stitching)
  • コンピュテーショナルフォトグラフィ(Computational Photography)
  • GUI(ウィンドウ表示、画像ファイル、動画ファイルの入出力、カメラキャプチャ)


映像に情報を付加する,映像から情報を抽出する,映像を加工する,...


これらがオープンソース,つまり無料でできてしまうのです!


ダウンロードなど詳しくは公式ポータルサイトからどうぞ!



このブログでは日々研究(コーディング)で気づいたことや小さなプログラムを公開するつもりです.

アドバイスやご指導ご鞭撻,よろしくお願いします!



2015年10月現在ですが,

OpenCVは3.0.0,コーディング環境はVisualStudio2013,使用言語はC++です.


基本的にはGPUに処理を行なわせたいのでCUDAに手を出しています.


画像格納もIplImageではなくMat,GpuMatを利用しています.



それではそれでは.