サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
imagingsolution.blog.fc2.com
C#のマウスホイールイベントは、Visual Studioのプロパティウィンドウのイベントでは表示されていないため、自分でイベントを登録する必要があります。 まずはサンプルプログラムを参照下さい。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace MouseWheelEvent { public partial class Form1 : Form { public Form1() { InitializeComponent(); //ホイールイベントの追加
この型についてはVB.NET/VB6.0/CLR/C/C++/Win32API 型一覧表のページが参考になりました。 ファイルの読み書きにはSystem.IO.File.Open、System.IO.FileStream.Close、System.IO.File.Read、System.IO.File.Write、System.IO.File.Disposeの各メソッドを用います。 詳細はMSDNでご確認下さい。↓ File.Openメソッド http://msdn.microsoft.com/ja-jp/library/system.io.file.open%28VS.80%29.aspx FileStream.Closeメソッド http://msdn.microsoft.com/ja-jp/library/system.io.stream.close%28v=VS.80%29.asp
ニックネーム:Akira 東京都の町田事業所に勤務 画像処理ソフトの開発を行っています。リンクフリーです! 詳細プロフィールは こちら お問い合わせは、こちら↓ 【補助HP】 画像処理ソリューションWeb版 【Newブログ】 イメージングソリューション
これまで紹介してきた記事の内容を使って、マウスホイールで画像を拡大縮小する方法を紹介します。 (必要な知識)任意点周りの回転移動アフィン変換Graphicsオブジェクトのアフィン変換マウスホイールイベントの追加方法 これらを使って、下図のようにマウスポインタを中心として、画像の拡大縮小するプログラムを作成しました。 サンプルプログラムのダウンロードはこちらより サンプルプログラム実行例 画像の拡大縮小表示のポイントは、任意点周りの回転移動でも紹介しているように、画像の拡大縮小では原点を中心として画像を拡大縮小するので、任意の点を中心として拡大縮小する場合は中心の点を原点へ移動し、拡大縮小後、元の位置へ移動する処理を行います。 点(X、Y)を中心に画像を拡大表示する場合 点(X、Y)を原点へ移動します。 原点へ移動後、画像の拡大縮小処理を行います。 点を元の位置へ戻します。 サンプルプログラ
メインページ > OpenCV 動画ファイル(aviファイルなど)を再生するには、cvCaptureFromFile関数によりファイルを指定して、ビデオキャプチャ構造体を取得し、cvQueryFrame関数により1画面分の画像データ(IplImage)を取得し、このIplImageを表示すると動画の再生が可能となります。 ただし、aviファイルにはいろんなコーデックがあるので、全てのファイルが再生できる訳では無いのでご注意下さい。 また、再生できるファイルはaviファイルだけでは無いようなのですが、まだ、よく分からず要調査状態ですが、サンプルコードはこのように↓なります。 CvCapture* capture; IplImage *frame = NULL; //動画ファイル名 char* FileName = "tree.avi"; //C:\OpenCV2.1\samples\c
メインページ > 画像処理 画像の拡大縮小、回転、平行移動などをまとめて3×3の行列を使って変換する事をアフィン変換と呼びます。 変換前の座標を(x, y) 変換後の座標を(x',y') とすると、アフィン変換では のように実質的には2行3列の行列を使って変換します。 変換前の画像を以下のようにすると、 拡大縮小X軸方向の拡大率をSx、Y軸方向の拡大率をSyとすると拡大縮小のアフィン変換は と表されます。 例)X軸方向に2倍 例)Y軸方向に2倍 例)X軸、Y軸方向に2倍 例)Y軸方向に-1倍 このように、ある軸(上記の例ではX軸)に対して反転する処理の事を鏡映と呼びます。 平行移動X軸方向にTx、Y軸方向にTyだけ移動するアフィン変換は のように表されます。 回転原点を中心に反時計回りにθ°回転する時のアフィン変換は のように表されます。 スキュー(せん断)四角形の画像を平行四辺形に変形す
平滑化フィルタでは注目画素の周辺画素の輝度値を平均し、ノイズを除去していましたが、画像の輪郭もボケてしまう欠点がありました。それに対し、メディアンフィルタでは周辺輝度値の大きさを順に並べ、メディアン(中央値)を注目画素に置き換えることでノイズを除去します。 特に周辺画素の輝度値よりも大きく異なるノイズ(ゴマ塩ノイズとかスパイクノイズという)を除去するのに効果を発揮します。
メインページ > 画像処理 前回、フィルタ処理の高速化アルゴリズム(重複した計算を行わない)で紹介した方法では カーネルの値が全て同じでないと使えないので、今回はフィルタ処理を縦方向と横方向に 分けて行う事でフィルタ処理の高速化を行う方法をガウシアンフィルタを例にとって紹介します。 ガウシアンフィルタのカーネルには、 が良く用いられますが、この処理を注目画素の周辺の輝度値をI0~I8とした場合、 ガウシアンフィルタの処理を行列で と、表すこともでき、この事は縦方向に3×1のガウシアンフィルタ処理をおこなってから、 横方向に1×3のガウシアンフィルタ処理を行うことを意味しています。 (横方向に処理をしてから縦方向に処理をしても同じです。) このように処理を縦と横に分けることで、カーネルのサイズm×nの場合、通常の処理では m×n回の掛け算を行うところ、m+n回の掛け算で済む事になります。 (
確かに処理結果を見てみると、ガウシアンフィルタが最も高周波成分を除去できているように 思います。 なぜ、そうなるのか? 本には数式においても、この効果が証明できるような事が書いてありましたが、ちょっと難しいので、 カーネルの値について見てみたいと思います。 そもそも、ある特定の周期の成分を消すためには、どうすれば良いか?というと、 周期の半分の離れた2点のデータを平均していけば、その周波数の成分を消す事が出来ます。 ここで、画像で表すことのできる最も高い周波数は 明 暗 明 暗 明 暗 明 暗 明 暗 明 暗 明 暗 明 暗 となる2画素周期のパターンで、このパターンを消すためには、隣り合う2画素の輝度値を 平均すると、画像データから最も高周波の成分を除去する事が出来ます。 しかし、隣り合う2画素の平均の結果は、画素間の位置の輝度値を示してしまうので、 この平
メインページ > OpenCV OpenCVの画像間演算などの、例えばcvAdd、cvCopy、cvAndなどの関数の引数の最後にmaskという引数があります。 このマスクに何も指定しなければ、それぞれの関数では画像全体を処理するのですが、maskに入力画像、出力画像と同じ大きさの8ビット1チャンネルの画像を指定する事で、mask画像のうち、輝度値(画素値)が0以外部分のみを処理することが可能となります。 逆に言うと、輝度値が0の部分は何の処理もされないので、処理後の画像は、あらかじめ輝度値を0にするなり、背景画像を入れておくなりの初期化をしておいて下さい。 通常はmask画像には二値化された画像(輝度値が0と255)を指定します。 処理的にはcvSetImageROIで領域を指定して部分的に処理をするのに似ていますが、このmaskを用いる事で矩形以外の任意形状を指定することが可能となりま
メインページ > OpenCV IplImageの輝度値(画素値)を直接参照、設定したい場合はIplImage構造体のimageDataのポインタを参照するばいいのですが、このポインタが符号付き8Bitのポインタ(char*)なので、ちょっと分かりづらいかもしれません。 と、その前に、IplImageの画像データがどのように格納させているか?のおさらいです。 モノクロ8Bit(8Bit、1Channnel)の場合、下図のように画像の左上を原点として、輝度値が格納されています。 画像のメモリ的にはwidtStepバイトの幅で確保され、必ずしも画像の幅(width)と一致しないので、注意して下さい。 (メモリの幅は4の倍数のバイト数になるように調整されています。) この辺は.NETのBitmapと同じです。 24Bitカラー(8Bit、3Channnel)の場合は、同じように画像の左上を原点と
メインページ > 画像処理 カラーの画像処理をする時には、これら色相などの知識は必須となります。 Windows標準で付いてくるペイントで、色の作成の表示をすると、雰囲気が分かると思います。 基本的に以下の色相、彩度、明度を用いて色を表すのですが、変換式にいくつかの種類があります。 色相(Hue) 色合いを表します。 赤や緑、青などに色を0~360°(0~2π)の角度を用いて表します。 彩度(Saturation) 鮮やかさを表します。 どれだけ純色に近いか?を表します。 明度(Brightness,Lightness,Intensity,Value) 色の明るさを表します。 HSV変換6角錐モデルとも言います。 【RGB⇒HSV変換】 Imax = Max(R,G,B) Imin = Min(R,G,B) とすると R = Imaxのとき H = 60×(G - B) / (Imax -
ざっくり言うと、収縮処理をすると線幅が細くなりますが、線の長さが短くなったり、細い線は消えてしまったりするので、線の端点や交点、線幅が1となった画素などを除去しないように条件を付けながら収縮処理を行います。 処理をフローチャートを以下に示します。 画像全体にラスタスキャンを行い、注目画素の3×3画素の並びがパターン1に該当する場合は中心の画素を除去(白から黒に変える)します。ただし、除去しないパターンに該当する場合は除去を行いません。 パターン1に該当する画素が1画素も無ければその時点で終了です。 次にパターン1の時と同様に3×3画素の並びがパターン2に該当する場合は中心の画素を除去(白から黒に変える)します。ただし、除去しないパターンに該当する場合は除去を行いません。 パターン2に該当する画素が1画素も無ければその時点で終了です。そうでない場合はパターン1の処理に戻り、除去する画素がなく
処理の概要は以下の通り 適応的二値化処理(cvAdaptiveThreshold関数)を使って、指定した範囲内を平均した輝度値よりも指定したしきい値以下となる部分を二値化(今回はその部分を黒にする)して、画像の輪郭を作成します。 【処理前】 【処理後】 この部分はOpenCV.jpの処理とほぼ同じ処理を行いましたが、ノイズが多かったので、メディアンフィルタを追加しました。 次に画像ピラミッドを使った画像の分割処理(cvPyrSegmentation関数)を使って、色の減色を行いました。 やっぱりこの部分もOpenCV.jpをかなり参考にしました。 【処理後】 ただ、この処理に決めるまでに、cvPyrMeanShiftFiltering関数やcvSmooth関数のバイラテラルフィルタなども試そうとしたのですが、なぜかエラーが出て、結局、cvPyrSegmentation関数しか使えなかった、
今回は唐突にWindowsドライバの削除方法ですが、実はKinectのドライバが何種類か出回っていて、ドライバを切り替えたいが為に今回はドライバの削除方法を自分の備忘録もかねて。 注)ドライバの削除を誤ると、他のデバイスが動作しなくなる場合がありますので、ドライバの削除は十分注意のうえ、自己責任で行って下さい。 Windowsのドライバを削除する場合、スタートメニューよりコントロールパネル→デバイスマネージャーで削除するデバイスを右クリックして削除を行っても、デバイスマネージャーのメニューの操作→ハードウェア変更のスキャンをクリックすると削除したはずのドライバが元に戻ってしまいます。 そうならないようにするためにもドライバを完全に削除する方法を紹介します。 まず、削除するデバイスを選択し、右クリックしプロパティをクリックします。 次に表示されたウィンドウのドライバータブのドライバーの詳細を
OpenCV2.2において、USBカメラから画像を取得しようとすると、どうやら動作してくれないらしい。 【評価環境】 Windows7 64bit OpenCV-2.2.0-win32-vs2010.exeを使用 使用サンプルプログラム:http://imagingsolution.blog107.fc2.com/blog-entry-208.htmlに記載のもの 気になったので、Ticketが無いか?ここ(https://code.ros.org/trac/opencv/report/2?USER=anonymous&page=2)で調べてみたら、やっぱりそれらしき報告がある。 https://code.ros.org/trac/opencv/ticket/735 (追加情報)dandelionさんより情報を頂きました。 http://pr.willowgarage.com/wiki/O
メインページ > OpenCV ※現在OpenCV2.3が公開されています。 OpenCV2.3についての解説は OpenCV2.3の入手、ダウンロード、インストール、環境設定 を参照下さい。 下記はOpenCV2.2のときのものです。 OpenCV2.2は内容こそ、そこそこ変更になったものの、OpenCVのインストール方法はOpenCV2.1とほぼ同じです。 これまでにもインストール方法についてはOpenCV1.0、OpenCV2.0、OpenCV2.1と紹介してきたので、今回も簡単に紹介したいと思います。 OpenCV2.1のインストール方法については、VisualStudio2010向けのインストールパッケージ(OpenCV-2.2.0-win32-vs2010.exe)を使う方法と、64bit対応やIPP、TBBなどのへの細かい設定をCMakeというソフトを使ってOpenCVをビル
のびのびになったOpenCV2.2.0がついに2010.12.5に公開されました。 入手先は、いつもの http://sourceforge.net/projects/opencvlibrary/ より 変更内容については、こちらを参照↓ http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs 日本語版はこちら↓ http://opencv.jp/opencv2-x-tips/changelog_from_21 OpenCV 2.2はOpenCV 2.1ともずいぶん異なっているようなので、とりあえず、インストール、設定のメモ (本当にメモなので、間違いなどありましたら、コメント頂けると助かります。) インストール方法はOpenCV2.1の時に紹介したOpenCV2.1の入手、ダウンロード、インストール、環境設定と、ほぼ同じです。
検出距離はセンサ(Kinect)から最短50cmぐらいから、長距離側は6畳+4畳半の台所を足しても検出していて我が家の狭いアパートでは測定不能でした。 距離画像と入力画像のサイズは640×480画素で比較的速く(ストレス無く)更新されますが、左下に表示されている3D表示はOpenGLを使って表示されているのですが、更新が少し遅い感じです。 これをコンパイル済みのファイルから実行するのではなく、ソースからコンパイル、実行したい場合はKinect.slnファイルをダブルクリックし、VisualStudioを開きます。 Visual Studioのバージョンは2008のC++で作られているので、2008以降をお使い下さい。(Express Editionで大丈夫です。) 開いたソリューションを単にデバッグ実行しようとすると のように『デバッグで使用する実行可能ファイル名を指定してください。』と表
Kinectドライバの入手方法KinectのWindows用ドライバは、どこが本家かいまいちよく分からないのですが、下記のHPより入手可能です。 http://ajaxorg.posterous.com/ http://openkinect.org/wiki/Getting_Started_Windows 2010.11.22現在ではVer14が安定版のようです。 Kinectドライバのインストール設定方法ドライバのインストールはWindows7ではドライバの自動プラグインが起動してくれないため、Windows Vistaまでのインストール方法とWindows7では設定方法が異なります。 お使いのOSに合わせて参照して下さい。 Windows Vistaの場合 Windows 7の場合 XPは動作確認していないのですが、Vistaと同じだと思います。 Kinectドライバのインストール設定
メインページ > C++/CLI プログラミング 一言でライブラリと言っても、従来のC言語で作成されたライブラリと.NET環境(VB.NET、C#、C++/CLI)で作成されたライブラリとがあります。 どちらもファイル形式は*.dllなので、見分けが付きにくいのですが、.NETで作られたライブラリでは.NETのどの言語(VB.NET、C#、C++/CLI)からも使う事ができ、使い方も簡単です。 (C++/CLIで作成したライブラリは引数にポインタなどを用いると互換が取れない場合があります。) .NETクラスライブラリの作成方法ファイル→新規作成→プロジェクトで Visual C++→CLR のクラスライブラリを選択しプロジェクト名を記入しOKボタンをクリックします。 すると、以下のようにcppファイルとhファイルが作成されます。 【DotNetClassLibrary.cpp】ファイル
メインページ > OpenCV OpenCVはBSDラインセンスに基づき、商用/非商用問わず、無償で使用する事が可能です。 このBSDライセンスに基づきという部分がポイントなのですが、OpenCVを使用する場合には下記の著作権表示、免責事項に基づき、明示的にこの著作権表示および免責事項を原文のまま(英語のまま)表示し、その内容に従う必要があります。 著作権、免責事項の内容↓ (これを必ず表示する事) IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By downloading, copying, installing or using the software you agree to this license. If you do not agree to this license, do not dow
メインページ > OpenCV 今回は、私が会社でやった仕事の紹介です。 OpenCVではUSBカメラ(Webカメラ)などを使って、簡単に動画を用いた画像処理を実現することができますが、本気で欠陥などの検査をしたい場合や、画像の取り込むタイミングをトリガに合わせて取り込みたい場合などにはUSBカメラでは、物足りないかと思います。 そんな時には、やはり産業用のCCDカメラを使わないと目的の処理が実現出来ない場合がありますが、画像入力ボード(キャプチャボード)と、そのボードを制御するライブラリや専用の画像処理ライブラリなどを揃えると、どうしても高額になってしまいます。 今回は少しは、その敷居を下げるためにも、フリー(BSDライセンス)で使える画像処理ライブラリのOpenCVとの接続サンプルのC++版とC++/CLI版を作成しました。 と言っても、OpenCVのキャプチャ関数(cvCapture
メインページ > OpenCV OpenCVで肌色領域の抽出や特定色の抽出というテーマは良くある話だと思いますが、サンプルプログラムを探すと、 cvCvtColor関数でRGBからHSVに変換 ↓ cvSplit関数でHSV画像を各チャンネルに分解 ↓ cvThreshold関数で各チャンネルごとに二値化 ↓ cvAnd関数で各チャンネルの二値化画像のAndをとり、マスク画像を作成 ↓ cvAnd関数でHSV画像を各チャンネルの画像をAndをとる ↓ cvMerge関数で各チャンネルの画像をRGB画像へ戻す 多少、違うにしても、基本的にはこの様な流れの処理が比較的多いかと思います。 ここで、気になる点。赤の領域を抽出する場合、例えば色相が0°~10° および 350°~360°の範囲を抽出したい場合などに対応できない。RGB→HSV→RGBへ変換すると、変換の途中で色の階調が少し失われてし
メインページ > 画像処理 色相(Hue:色合い)、彩度(Saturation:鮮やかさ)、明度(Brightness,Lightness,Intensity,Value:明るさ)については、以前、変換式には色相、彩度、明度ほかのページにまとめたのですが、実は訳も分からず公式だけをまとめていました。 で、なんだか気持ちが悪かったので色相、彩度、明度について、よ~く調べてみました。 私なりの理解ですが、以下にまとめました。 R、G、Bの色空間については、下図のようにRGBをXYZのように三次元座標で表すと、一辺の長さが255で表される立方体の範囲内で全ての色を表す事が出来ます。(R,G,B各8bitの場合) のように、正六角形となります。 この時、赤の方向を0°として、反時計回りに緑の位置が120°、青が240°と色相(0~360°(2π))を定めます。 彩度は一番外側の六角形に対して、どの
メインページ > C++/CLI プログラミング 最近、OpenCVやOpenGL、DirectShowなどのライブラリを使う機会が増えてきたので、ライブラリの使い方をまとめておきます。 ライブラリと一言いっても、スタティックライブラリ、ダイナミックライブラリ、.NETのクラスライブラリなどとあるのですが、比較的一般的?なダイナミックライブラリの使用方法を紹介します。 ダイナミックライブラリを使用するには、下記の3点セットが必要となります。 ダイナミックリンクライブラリファイル(*.dll)ライブラリファイル(*.lib) ヘッダファイル(インクルードファイル)(*.h)各ライブラリで何のファイルが必要かは調べて置いて下さい。 *.dllファイルはプログラムの実行時、*.lib、*.hファイルはプログラミング中に必要となります。 また、ライブラリのバージョン、Release用/Debug用
メインページ > OpenCV OpenCV2.xより前のバージョンでは、画像の取込サイズが指定できない、複数台カメラ時のカメラ選択が思うように行かない、などの情報があり、かなり使いづらかったようなのですが、OpenCV2.0以降からは少しはましになりました。 USBカメラを本気で制御したい場合はやっぱりDirectShowを使った方が良いと思いますが、プログラムのハードルは一気に高くなるので、お手軽にカメラの画像を用いて画像処理をしたいという人にはオススメです。 【評価環境】 OS:Windows Vista VisualStudio2005 ExpressEdition 使用言語:C++/CLI OpenCV2.1 (使用カメラ) ●Qcam Fusion(Logicool) ●SP2208WFP(DELLのモニタ付属のカメラ) ●BWC-30L01(BUFFALO) 別途、SKnet
【処理アルゴリズム】 元画像データ ↓ 元画像データの平滑化処理を行い、元画像から平滑化データを差し引きます。 ↓ ↓ 差し引いた分を元画像に上乗せします。 ↓ この処理により、平滑化処理でボヤけてしまう分だけ、逆に輪郭をくっきりさせる事ができます。 この処理をカーネルで表現すると となります。 kは任意レートで、値が大きいほど、輪郭が鮮明になる効果が高くなります。 (後半の元画像から平滑化画像を引いている部分の処理はラプラシアンフィルタ と呼ばれます。) 今回は3×3のマスクサイズを例にとって紹介しましたが、マスクサイズを大きくすると マスクサイズよりも小さなパターンを強調する効果を得る事もできます。
次のページ
このページを最初にブックマークしてみませんか?
『 画像処理ソリューション』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く