画像データの取得/設定をできるだけ簡単にできることを目指したImageDataクラスライブラリに関する情報です。
←画像処理のためのC#へ戻る
少し前にOpenCVで漫画風処理というのが流行りましたが、黒板風の処理をやってみました。
処理結果はこんな感じ↓
【処理前画像】
【処理後画像】
この処理のソースコードはこちら↓になります。
#include "stdafx.h"
#include "opencv2/opencv.hpp"
int main()
{
// グレースケールで画像の読込
cv::Mat srcImage = cv::imread("処理前.png", 0);
// チョークの擦れ感はランダムノイズで
cv::Mat noise(srcImage.size(), srcImage.type());
cv::randn(noise, 300, 200);
// ノイズを少しぼやかす
cv::GaussianBlur(noise, noise, cv::Size(3, 3), 0.5);
// チョークの文字( = ノイズ - 元画像)
cv::Mat letter = noise - srcImage;
// モノクロデータからカラーデータへ
cv::Mat colorLetter;
cv:cvtColor(letter, colorLetter, cv::COLOR_GRAY2BGR);
// 背景色(黒板)
cv::Mat backColor(srcImage.size(), CV_8UC3, cv::Scalar(0, 40, 0));
// 黒板の画像 = 背景色 + 擦れ文字
cv::Mat blackBoard = backColor + colorLetter;
cv::imshow("黒板処理", blackBoard);
// 処理結果の保存
cv::imwrite("黒板処理.png", blackBoard);
// キー入力待ち
cv::waitKey();
return 0;
}
【処理の簡単な解説】
①画像をモノクロで読み込む(imread関数)
この画像は紙に書いた文字をスキャナで読込ました。
②チョークの擦れ具合を表現するのに、ノイズ画像(randn関数)を作成し、その画像を少しぼやかす(GaussianBlur関数)
③ノイズの画像②から元の画像①を引いて、文字の部分だけを残す
④黒板用の画像を作成
⑤ ③で作成した文字と④の黒板の画像を足し合わせて完成!
かなり簡単にやってみましたが、細かい設定をいじくると、もう少し、それっぽくなるかも?しれません。
【余談】
なぜ、黒板の処理をやってみたか?というと、会社の人たちが主にFPGAがテーマのブログ(http://fpgainfo.blog.fc2.com/)を立ち上げたのですが、その中の人が、あまり画像処理を詳しくないのにもかかわらず、フリーのレタッチソフト(GIMP)を使って、こんな↓黒板っぽい処理をやっていた。
こんなことをやられちゃうと、画像処理魂に火が着いた!
この処理は、GIMPにネオン光彩という処理があり、この処理によりチョークの擦れているっぽい処理を行っています。
このネオン光彩の処理はなんとなく、ラプラシアンフィルタっぽかったのですが、OpenCVでラプラシアン処理(Laplacian関数)を行うと、細かい文字がつぶれてしまったので、結局、ノイズを付加する事で、チョークの擦れ具合を表現してみました。
最近はOpenCVをあまり触っていなかったのですが、cvtColorの引数の設定など、昔から変わっている部分もあって、いろいろ調べまくりながら作成しました。
ブログではOpenCVの関数を明示的にするためにも、using namespace はできるだけ、使わないようにしているのですが、ちょっとクドイので、使っといた方が良かったかも?
それにしても、画像間演算は楽だわ~
Windows10へ移行して、ノートパソコンに拡張モニタを接続してみたら、やたらと文字がかすれ、ボケボケ状態で見づらい状態。
このかすれ具合もアプリによって違って、エクスプローラやFireFoxが特に汚い。
(GoogleのChromeはきれい)
汚いエクスプローラ↓
汚いFireFox↓
(2021.3.13修正)
文字のかすれを直すにはCreaTypeテキストというのを使って調整するのですが、設定方法が変更されています。
修正方法は、まず、Windowsのスタートボタンから、Windowsシステムツール→コントロールパネルでコントロールパネルを表示します。
表示されたコントロールパネルの中から、フォントをクリックします。
次に、フォントのウィンドウの左側にある ClearTypeテキストの調整 をクリックします。
以下、打ち消し線の入っている部分は、古いWindows10の場合の設定ですので、ClearTypeを有効にするの部分から参照してください。
直し方は意外と簡単で、デスクトップ上でマウスの右ボタンをクリックし、ディスプレイの設定をクリック
表示されたウィンドウの下の方に表示されているディスプレイの詳細設定をクリック
さらに表示されたウィンドウの下のClearTypeテキストをクリック
ClearTypeを有効にするにチェックを入れ、次へ
かすれを調整するモニタが1つだけならいいえを選択、すべて調整するならはいを選択
そのまま次へ
すると、何回か文字の表示サンプルが表示されるので、見やすいくっりしとした文字を選択して次へをクリック
次へ次へを進めて完了で設定終了
すると表示がきれいになってくれます。
【設定前】
【設定後】
この設定は以前からあったかと思いますが、こんなに効果的なのは初めて。
というより、Windows10のデフォルト状態が汚すぎ。
← Windows8、10入門へ戻る
Chartコントロールを使いたかった理由の一つに画像処理ではおなじみのヒストグラムをChartコントロールで表示したかったのですが、その簡単なプログラムです。
フォームにはChartコントロールを配置し、Chartの名前がchart1とした事を前提として、
// /////////////////////////////////////////////////////
// Chartコントロール内のグラフ、凡例、目盛り領域を削除
chart1.Series.Clear();
chart1.Legends.Clear();
chart1.ChartAreas.Clear();
// /////////////////////////////////////////////////////
// 目盛り領域の設定
var ca = chart1.ChartAreas.Add("Histogram");
// X軸
ca.AxisX.Title = "Brightness"; // タイトル
ca.AxisX.Minimum = 0; // 最小値
ca.AxisX.Maximum = 256; // 最大値
ca.AxisX.Interval = 64; // 目盛りの間隔
// Y軸
ca.AxisY.Title = "Count";
ca.AxisY.Minimum = 0;
// /////////////////////////////////////////////////////
// データの追加
var hist = new Point[] {
new Point(32, 10),
new Point(96, 30),
new Point(160, 50),
new Point(224, 20)
};
// グラフの系列を追加
var s = chart1.Series.Add("Histogram");
// 棒グラフの隙間を無くす
s.SetCustomProperty("PointWidth", "1.0");
// データ設定
for (int i = 0; i < hist.Length; i++) {
s.Points.AddXY(hist[i].X, hist[i].Y);
}
と書くだけで、モノクロ画像用のヒストグラムが簡単に作成できます。
(実行結果)
ここでのポイントとしては、棒グラフ(ChartTypeがColumn)の時に、棒グラフの間隔を無くすにはPointWidthプロパティを1.0にすればよい(デフォルトは0.8)のですが、各グラフ特有のプロパティ設定は以下のように設定する必要があります。
(直接プロパティの設定ができません。)
// 棒グラフの隙間を無くす
s.SetCustomProperty("PointWidth", "1.0");
モノクロ画像の時はこれでもよいのですが、カラーだと、R,G,Bの3つのグラフを書かないといけないので、折れ線では表現しにくいので、折れ線(ChartTypeがLine)を使ってみたいと思います。
要領は同じで、SeriesにR,G,B用の3つを追加することぐらいです。
// /////////////////////////////////////////////////////
// Chartコントロール内のグラフ、凡例、目盛り領域を削除
chart1.Series.Clear();
chart1.Legends.Clear();
chart1.ChartAreas.Clear();
// /////////////////////////////////////////////////////
// 目盛り領域の設定
var ca = chart1.ChartAreas.Add("Histogram");
// X軸
ca.AxisX.Title = "Brightness"; // タイトル
ca.AxisX.Minimum = 0; // 最小値
ca.AxisX.Maximum = 256; // 最大値
ca.AxisX.Interval = 64; // 目盛りの間隔
// Y軸
ca.AxisY.Title = "Count";
ca.AxisY.Minimum = 0;
// /////////////////////////////////////////////////////
// データの追加
var histR = new Point[] {
new Point(0, 10),
new Point(63, 30),
new Point(127, 80),
new Point(191, 30),
new Point(255, 15)
};
var histG = new Point[] {
new Point(0, 70),
new Point(63, 60),
new Point(127, 40),
new Point(191, 20),
new Point(255, 10)
};
var histB = new Point[] {
new Point(0, 10),
new Point(63, 20),
new Point(127, 30),
new Point(191, 70),
new Point(255, 90)
};
// グラフの系列を追加
var sR = chart1.Series.Add("HistogramR");
var sG = chart1.Series.Add("HistogramG");
var sB = chart1.Series.Add("HistogramB");
// グラフの種類を折れ線に設定する
sR.ChartType = sG.ChartType = sB.ChartType
= System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
// データ設定
for (int i = 0; i < histR.Length; i++)
{
sR.Points.AddXY(histR[i].X, histR[i].Y);
sG.Points.AddXY(histG[i].X, histG[i].Y);
sB.Points.AddXY(histB[i].X, histB[i].Y);
}
(実行結果)
これでカラーのヒストグラムも表示できる事ができます!
とか言っても、見た目があまりにもショボイので、もう少し手を入れます。
今度はグラフの種類にスプライン面グラフ(SeriesChartType.SplineArea)を使ってみます。
// /////////////////////////////////////////////////////
// Chartコントロール内のグラフ、凡例、目盛り領域を削除
chart1.Series.Clear();
chart1.Legends.Clear();
chart1.ChartAreas.Clear();
// /////////////////////////////////////////////////////
// 目盛り領域の設定
var ca = chart1.ChartAreas.Add("Histogram");
// X軸
ca.AxisX.Title = "Brightness"; // タイトル
ca.AxisX.Minimum = 0; // 最小値
ca.AxisX.Maximum = 256; // 最大値
ca.AxisX.Interval = 64; // 目盛りの間隔
// Y軸
ca.AxisY.Title = "Count";
ca.AxisY.Minimum = 0;
// /////////////////////////////////////////////////////
// データの追加
var histR = new Point[] {
new Point(0, 10),
new Point(63, 30),
new Point(127, 80),
new Point(191, 30),
new Point(255, 15)
};
var histG = new Point[] {
new Point(0, 70),
new Point(63, 60),
new Point(127, 40),
new Point(191, 20),
new Point(255, 10)
};
var histB = new Point[] {
new Point(0, 10),
new Point(63, 20),
new Point(127, 30),
new Point(191, 70),
new Point(255, 90)
};
// グラフの系列を追加
var sR = chart1.Series.Add("HistogramR");
var sG = chart1.Series.Add("HistogramG");
var sB = chart1.Series.Add("HistogramB");
// グラフの種類をスプライン面グラフに設定する
sR.ChartType = sG.ChartType = sB.ChartType
= System.Windows.Forms.DataVisualization.Charting.SeriesChartType.SplineArea;
// 輪郭線の太さ
sR.BorderWidth = sG.BorderWidth = sB.BorderWidth = 2;
// 輪郭線の色
sR.BorderColor = Color.Red;
sG.BorderColor = Color.Green;
sB.BorderColor = Color.Blue;
// 塗りつぶしの色の設定(半透明)
sR.Color = Color.FromArgb(150, Color.Red);
sG.Color = Color.FromArgb(150, Color.Green);
sB.Color = Color.FromArgb(150, Color.Blue);
// データ設定
for (int i = 0; i < histR.Length; i++)
{
sR.Points.AddXY(histR[i].X, histR[i].Y);
sG.Points.AddXY(histG[i].X, histG[i].Y);
sB.Points.AddXY(histB[i].X, histB[i].Y);
}
(実行結果)
これで、かなりそれっぽくないですか?
プログラム的に書くと、塗りつぶしの色に半透明の色を設定できるところがポイントでしょうかね。
←Chartコントロールの使用方法へ戻る
Chartコントロールは、本当に多くのプロパティがあるため、一つ一つを調べてからプログラムをするよりも、まずはVisual Studioのフォームエディタ上でいろいろ触ってみてから、プロパティの意味するところを覚えて、プログラムを組むようにした方が早そうです。
という事で、フォームエディタ上で、いろいろ触ってみました。
ツールボックスのデータの中にあるChartを選択し、フォームへ追加します。
グラフのデータはSeriesプロパティで管理されています。
Seriesの(コレクション)の部分をクリックし、 … をクリックするとエディタが表示されます。
グラフのデータはデータのPointsプロパティの(コレクション)の部分をクリックし、 … をクリックすると各データを編集する画面↓が表示されます。
追加のボタンをクリックするたびにデータが追加されます。
下図は5個のデータを追加した様子
各データの値はデータのXValueとYValuesの値を設定します。
ここでYの値だけ複数形になっている?!と思えたら、少しChartコントロールに慣れてきている感じでしょうか?
複数形は複数の設定ができます。
この状態で5個のデータを表示したのがこちら↓
グラフの種類は各系列(Series)ごとに設定ができ(できない組み合わせもあります)、グラフのChartTypeで設定します。
ここで、縦の棒グラフ(Column)から折れ線グラフ(Line)に変更すると
上図のようになります。
マーカーはSeriesプロパティのMakerSyleというプロパティがあります。
デフォルトではマーカーなし(None)になっていますが、これをSquareにしてみます。
エクセルっぽい!
グラフの軸を管理しているのはChartAreaプロパティになります。
ChartAreaの(コレクション)の部分をクリックし、 … をクリックするとエディタが表示されます。
軸を管理しているのがAxesプロパティでさらにエディタを開きます。
Axisコレクションには最初から
X axis | X軸(主軸) |
Y(Value) axis | Y軸(主軸) |
Secondary X axis | X軸(第二軸) |
Secondary Y axis | Y軸(第二軸) |
の4つが用意されており、各軸のTitleプロパティで軸の名前を設定します。
X軸とY軸のTitleを設定した結果↓
グラフのタイトルはTitleプロパティになります。
Titleの(コレクション)の部分をクリックし、 … をクリックするとエディタが表示されます。
(Text)の部分を編集するとグラフのタイトルが表示されます。
凡例領域の設定はLegendsロパティになります。
Legendsの(コレクション)の部分をクリックし、 … をクリックするとエディタが表示されます。
Legends1のTitleプロパティに凡例表示と入力してみると
ん??
Series1の部分が変わるかと思ったら、その上に表示されるだけ?
Legendsプロパティはあくまでも凡例表示全体(各系列の凡例を表示している領域)のプロパティ設定であって、各系列(Series)の設定ではありません。
Series1の部分の表示名を変更するにはSeriesプロパティのNameプロパティを設定します。
凡例の名前が変更されました↓
他にも様々なプロパティがあるので、いじりたおすと面白いと思います。
これで、この操作をプログラムで表現できれば、何とかなりそうな気がしてきた!
←Chartコントロールの使用方法へ戻る
Chartコントロールを使うにはSeriesプロパティが最も重要になりますが、次にLegends,ChartAreas,Titlesの3つ、Annotationsは、ほとんど使わないと思います。
●Seriesプロパティ
グラフのデータやグラフの種類を取得、設定します。
エクセルのグラフでいうところのグラフの種類に系列を追加した近い感じです。
●Legendsプロパティ
凡例表示領域に関する情報を取得、設定します。
●ChartAreasプロパティ
グラフの目盛り領域に関する情報を取得、設定します。
●Titlesプロパティ
グラスのタイトルに関する情報を取得、設定します。
●Annotationsプロパティ
グラフの注釈に関する情報を取得、設定します。
どのプロパティも□□□□□sというように複数形になっているからも想像できると思いますが、複数個設定する事ができます。
←Chartコントロールの使用方法へ戻る
SplitContainerの境界線をクリックすると片側のPanelを閉じるなどのGUIで、境界線の部分に三角形などを書きたい場合があります。
こんな感じ↓
その場合、どうするのか?
Splitterのオブジェクトを探してみても存在しないのですが、SplitContainerの構造を理解すると、Splitter部分に描画する事ができます。
上図のようにSplitContainerはContainerの上に2つのパネル(Panel1,Panel2)が張り付いているイメージです。
SplitterはPanel1とPanel2の隙間から見えるContainerそのものとなっています。
そのため、Splitterに描画するには、隙間から見えるContainerに描画すればOKです。
また、参考までに主なSplitContainerのプロパティは以下の通りです。
その事を理解したうえでSplitContainerのPaintイベントで三角印を書くサンプルは以下のようになります。
private void splitContainer1_Paint(object sender, PaintEventArgs e)
{
Point[] p = new Point[3];
p[0] = new Point(splitContainer1.SplitterDistance, splitContainer1.Height / 2 - splitContainer1.SplitterWidth * 2 / 3);
p[1] = new Point(splitContainer1.SplitterDistance, splitContainer1.Height / 2 + splitContainer1.SplitterWidth * 2 / 3);
p[2] = new Point(splitContainer1.SplitterDistance + splitContainer1.SplitterWidth, splitContainer1.Height / 2);
e.Graphics.FillPolygon(Brushes.Gray, p);
}
private void splitContainer1_Resize(object sender, EventArgs e)
{
splitContainer1.Refresh();
}
上記のプログラムはかなりいい加減なので、お好みで修正して下さい。
Paintイベントだけでは、SplitContainerのリサイズの時に描画してくれないので、ResizeイベントでコントロールをRefresh()してPaintイベントを発生させています。
←C#へ戻る
OpenCVプログラミングブックのVer3対応版が出版されました。
おそらくそんなに内容は変わらないんだろうな~と思いながらも、これまでも購入してきたので買っておいてみたら、いい意味で期待を裏切られる内容でした。
これまでのイントール方法から始まりリファレンスマニュアルがメインの内容とは違い、どちらかというとVer2からVer3への移行マニュアルという雰囲気です。
さらにOpenCVの処理例も一般的なフィルタ処理の内容は無く、ARや機械学習など、応用例がまとめられています。
逆に言うと、OpenCV初心者が、この本をいきなり手にするのは少々難しく感じると思います。
(この辺の溝を埋めるのが私の役目か??)
【目次】
1章 イントロダクション
画像処理について/OpenCV/OpenCV3.0/OpenCV2.Xからの移行に関する注意点
2章 OpenCV3.0を利用するための環境構築方法
CMake/公式インストーラ/NuGet/MacPorts/HomeBrew/apt-get install
3章 OpenCV3.0を用いたアプリケーション開発
CMake/Visual Studio
4章 OpenCV3.0を用いたデバッグ方法
5章 コンピュータビジョンにおける三次元幾何
6章 拡張現実感(Augmented Reality:AR)
7章 機械学習による画像認識
8章 プロジェクタカメラシステムープロジェクションマッピング
9章 OpenCVとOpenGLの連携
10章 広視野角HMDのための歪み画像生成
11章 Kinect V2の利用
12章 OpenCL
←OpenCVへ戻る
Interface 2014年1月号はラズベリーパイxカメラで本格派画像処理という特集です。
私もOpenCVの基礎部分の記事をお手伝いさせて頂きました。
基礎というより、ライブラリって何?ぐらいの入門レベルなので、OpenCVを使った事のある人はこの記事に期待しないで下さい。
それより、他の方の書いたラズベリーパイの部分が面白いと思います。
きっと。。(私も、まだ見てない。)
イントロダクション 超小型Linux ×カメラで広がる画像処理マシンの可能性
第1部 ラズベリー・パイで広がるカメラ×画像処理の世界
第1章 はじめてのウェアラブル! スカウター風メガネの製作
Appendix 1 はじめてのカメラ×画像処理に最適! 超定番ボードRaspberry Pi
Appendix 2 感度/発色がすごくいい! ラズベリー・パイ専用カメラ・モジュールの実力
第2部 基礎編:はじめての画像処理
第2章 実験で使うハードとソフト
Appendix 3 Raspberry Piで画像処理を始める準備
第3章 カメラから動画を取り込む
第3部 リアルタイム動画処理にTRY!
Appendix 4 超キホン! 動画像処理の全体像
Appendix 5 画像処理はリアルタイムがうれしい!!
第4章 実験ビフォー・アフタ! リアルタイム画像処理の基本テクニック
第5章 それらしい物体をパッと見つける! リアルタイム色検出
第6章 エア・シャッタ撮影にTRY! リアルタイム動き検出
第7章 ふつうにやるとスゴ重! リアルタイム画像認識テクニック
第8章 LinuxでそこそこすばやくI/Oするテクニック
Appendix 6 画像処理ライブラリOpenCVの基礎知識5
Appendix 7 カメラ・モジュール選択ガイド
第3回 高性能処理のキモ! プログラム実行順序決定のメカニズム
第3回 マルチタスクOSのキモ! タスク切り替えの基本動作
第3回 長文聞き取りのためのキー・テクノロジ! 言語モデルを作る
第3回 実験研究:なんと! 人間の聴覚では位相の変化が識別できない
Appendix D-Aコンバータの出力から不要な周波数成分を除去するフィルタの製作
第3回 放送に欠かせない動画圧縮入門 MPEG-2から4K向け最新H.265まで!
第3回 実験成功! アマチュア無線バンドを地デジ周波数に戻して映す
Appendix 実録! アマチュア無線の免許申請方法
Linux×アナログ! センシング回路初体験
第13回 2相ステッピング・モータ・ドライバIC L6470
第2回 なんと! 対象の距離や向きがわからなくても正面画像を得る方法
超安全! 閉じたら消える見えないファイルが作れるLinuxカーネル 3.11
新製品Information
わっしょいInterface/組み込みもん/デバッグ
次号予告
Visual Studio Professional 2013のアップグレード版が期間限定で特別価格にて発売されました。
定価 : ¥37,590のところ、今ならなんと! ¥12,383
購入条件としては
2013 年 11 月 1 日から 2014 年 1 月 31 日まで、または在庫のある限り有効です。特定の市場の Microsoft オンライン ストア内で注文することができます。Visual Studio Pro の旧バージョンから Visual Studio Pro 2013 へのアップグレードをするお客様に限定されるプランです。
対象者はリテール版の Visual Studio Professional 2012 をご購入いただいた人向けとのこと。
(参考)
http://www.microsoft.com/visualstudio/jpn/visual-studio-2013(最後の部分)
とりあえず、これは買い!かな。
OpenCV2.4.7が公開されました。
Windows版のダウンロード先はこちら↓
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.7/
他のOSはこちら↓からたどって下さい。
http://sourceforge.net/projects/opencvlibrary/files/
変更内容についてはこちら↓
http://code.opencv.org/projects/opencv/wiki/ChangeLog
に記載されていますが、個人的にはバグ修正ぐらいであまり影響が無いような...
また、配布されている圧縮ファイルのフォルダ構成が、少し変更されました。
opencv
├build
└sources
ソースファイルがsourcesフォルダ内に格納されるようになりました。
(これで、includeの参照先を間違えにくくなったか?)
また、ビルド済みのファイルは、これまではVisualStudio2008、2010、2012向けの3種類配布されていましたが、今回はVisualStudio2010(vc10)とVisualStudio2012(vc11)の2つとなりました。
試しにVisual Studio 2013向けでCMakeしてみましたが、CMakeでエラーが出るので、出来ないのか???
Visual Studio 2012向けのCMakeは大丈夫でした。
本日(10月17日20時頃から)、Windows8.1のアップデートプログラムが公開されました。
Windows8ユーザーであれば、Windowsアプリストアより無償でアップデートできます。
アップデート方法はまず、 Windows8のスタート画面より ストア をクリックします。
すると、Windowsのアップデートと表示されているので、 無料でWindows8.1に更新 をクリックします。
次に表示された画面の ダウンロード をクリックします。
すると更新プログラムのダウンロードが始まり、引き続きインストールが始まります。
30分ぐらい待ったら、PCの再起動が必要です という画面が表示されるので、今すぐ再起動をクリックします。
再起動後、 設定しています(xx%) → デバイスを準備しています(xx%) → 準備しています → PC設定を適用しています(xx%) と表示されますが、この設定も30分ぐらい?時間がかかります。
最後にもう一度、PCが再起動して その他の処理を実行しています(xx%)→ 準備していますと表示され、
ライセンス条項が表示されるので、同意しますをクリック。
設定画面で簡単設定を使うをクリック
次にアカウントをセットアップしますと表示され、Microsoftアカウントへのサインイン画面が表示されるので、メールアドレスのテキストボックスへMicrosoftアカウントのパスワードを入力し、次へをクリックします。
あっているはずのパスワードを入力してもパスワードが間違っていますと表示される場合は、キーボードの変更をクリックし、日本語Microsoft IME に変更してから、再度、パスワードを入力してみて下さい。
次に、情報の保護にご協力くださいのウィンドウが表示されるので、次へをクリック
受け取ったコードを入力してくださいのウィンドウが表示されるので、していしたメールに送られてきた お客様のコード:xxxxxxx を入力します。
メールが確認できない場合は今は行わないをクリックしても大丈夫?だと思われます。
SkyDriveはクラウドストレージですウィンドウが表示されるので、次へをクリック
もう少しで完了しますと表示され、しばらくするとインストール完了!
所要時間、約1時間半。 思ったよりかかる。
そして、こちらが新しいWindows8.1のスタート画面。全体的に黄色っぽい。
こちらはデスクトップ画面
で、システム情報
無事、Windows8.1になってくれました。
以前公開していた拡大鏡+輝度値表示機能にルーラーの機能を追加して公開します。
(旧、記事はこちら→拡大鏡+輝度値表示機能アプリ MagnifyEx)
画像処理をするには、画像の輝度値や輝度の変化、画素間の距離などある程度把握しておきたい事もあり、個人的に使っているツールです。
【ダウンロード】
2013.9.4 Ver.0.1.1.0 MagnifyExVer0110.zip
【動作環境】
Windows PC
.NET Framework2.0
【使用方法】
zipファイルを解凍し、exeファイルを実行してください。
拡大画像の補間モード(Nearest NeighborやBicubicなど)と拡大倍率の設定を上部のコンボボックスにて設定できます。
Ctrlキーを押しながらマウスを動かすと、Ctrlキーを押している間は測長モードとなります。
最初にCtrlキーを押した位置から、今のマウスポインタまでの距離が表示されます。
この時、マウスのボタンは押さないようにしてください。
(アプリがアクティブな状態でCtrlキーを押してください。)
OpenCVは当然ながらオープンソースなので、ソースコードは公開されているのですが、ある特定の関数がOpenCV内部では、どのような処理をしているのか?を確認するのに、いきなりソースコードを眺めても、処理を追うのは、かなり困難かと思います。
そんな時には、やはりデバッグ実行しながら処理を追いかけた方が分かりやすいのですが、OpenCVの関数内へステップイン実行する方法を紹介します。
まず、確認したい処理のサンプルプログラムを作成し、ステップイン(関数の中身へ移動する)したい関数の行の右端のグレーの部分をクリックするか、ステップインする関数の行を選択してF9ボタンを押し、ブレイクポイント(処理を一時停止する場所)を指定します。
すると行の左側へ赤丸印が表示され、デバッグ実行を行うと、この赤丸印までの処理が行われ、一時停止状態となります。
次にメニューのデバッグ→ステップインと選択するか、F11ボタンを押すと、以下のように初回だけ表示されます。
これは、今回の例ではcv::imshowの中身を見ようとしているのですが、この処理に必要なファイルがどこにあるのか?を聞かれます。
今回の例ではファイルの種類の部分にmatrix.cppと表示されているので、このファイルがあるフォルダを探し、そのフォルダを指定します。
ちなみに、matrix.cppのファイルは \opencv\modules\core\src 内にあります。
すると、ブレークポイントで指定した行で使われている関数の中へ、処理が移動していきます。
引き続きステップイン(F11ボタンを押す)実行を行うと、さらに関数の内部へ、ステップオーバー(F10ボタンを押す)実行を行うと、関数の内部へは行かずに、次の行へと移動します。
そうすると、実際に行われている処理の通りに、表示される行が移動していくので、処理の流れを確認し易いかと思います。
ちなみに!
今回、確認したかったのはcv::imshowの処理。
Windowsでは画像データのメモリの幅が4の倍数バイトとなるように調整しないと正しく表示されないハズにも係わらず、C++インターフェースのcv:Matでは、メモリの幅のバイト数を示すstepの値が、必ずしも4の倍数とならないのが、とても気になっていたんです。
そこで、実際にモノクロ8ビット(CV_8UC1)のcv::Matをcv::imshowへ渡し、ステップイン実行してみたところ、モノクロ画像と同じ画素数の24bitのメモリを確保し(このメモリは、幅が4の倍数バイトに調整されている)、cvConvertImage関数が呼ばれ、その内部では、OpenCV内部だけで使われるicvCvt_Gray2BGR_8u_C1C3Rという関数が実行され、8bitグレーの輝度値がR,G,Bの値が同じ、24bitのカラーデータへと変換されて、Win32APIのBitBltで画像が表示されている事が分かりました。
つまり、cv::imshowでモノクロの画像を表示する時に関数内部では、モノクロ画像の3倍のメモリが確保され、モノクロからカラーデータへの変換が行われています。
って、なんて無駄なんだ~!
この辺はやっぱりIplImageの方が好きなんだよな~
OpenCVをダウンロードすると、ビルド済みのスタティックリンクライブラリがstaticlibというフォルダ内に格納されているのですが、以前、試した時には、うまく利用する事ができずに、CMakeでビルドしていました。
OpenCVをスタティックリンクライブラリでビルドする方法
https://imagingsolution.net/program/opencv/build_opencv231_static_library/
再度、OpenCV2.4.6で試してみたところ、以下の方法でスタティックリンクライブラリを使用する事ができました。
まず、こちら↓
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/
よりOpenCVをダウンロードします。
WindowsのVer.2.4.6の場合はOpenCV-2.4.6.0.exeのファイルをダウンロードします。
ダウンロードしたファイルをダブルクリックすると自己解凍されますが、以下、ルートディレクトリ(c:\ )に解凍した場合を想定して説明します。
目的のスタティックリンクライブラリは下記フォルダに格納されています。
opencv
├build
├x86
│ ├vc9
│ ├vc10
│ │ ├staticlib
│ ├vc11
├x64
x86やx64、vc9,vc10,vc11は使用する環境に合わせて使用するフォルダを選択します。
まず、C++のプロジェクトを作成し、プロジェクトのプロパティで、構成をすべての構成にし、構成のプロパティ→C/C++→全般→追加のインクルードディレクトリにopencv2のあるフォルダ
c:\opencv\build\include
などを指定します。(ファイルの解凍先によりディレクトリが異なります。)
次にスタティックリンクライブラリのあるフォルダの設定を行います。
こちらもプロジェクトのプロパティで、構成をすべての構成にし、構成のプロパティ→リンカー→全般→追加のライブラリディレクトリに
c:\opencv\build\x86\vc10\staticlib
などを指定します。(ファイルの解凍先や開発環境によりディレクトリが異なります。)
x86・・・32bitプログラムを作成する場合(OSが64bitでも32bitプログラムは作成可能です。)
x64・・・64bitプログラムを作成する場合
(構成マネージャでプラットフォームをx64にするのをお忘れなく。
分からなければ、64bitOSであっても、まずはx86を使用して下さい。)
vc9・・・Visual Studio 2008で開発する場合
vc10・・・Visual Studio 2010で開発する場合
vc11・・・Visual Studio 2012で開発する場合
次に特定の規定のライブラリの無視というのを設定するのですが、これはDebugとReleaseで設定が違うので、構成のプロパティ→リンカー→入力→特定の規定のライブラリの無視の設定に
構成がDebugの場合
Libcmtd.lib;msvcprtd.lib
構成がReleaseの場合
Libcmt.lib;msvcprt.lib
と入力します。
これで、OpenCVを使う準備ができたので、コードを下記のように書きます。
ここでのポイントはcomclt32.libファイルを追加している部分ぐらい。
以下、Canny Edge Detectorのサンプルコードです。
#include "stdafx.h"
//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// opencv2のあるフォルダ(C:\opencv\build\includeなど)を追加のこと
#include "opencv2\opencv.hpp"
#pragma comment(lib,"comctl32.lib")
// バージョン名の取得
#define CV_VERSION_STR CVAUX_STR(CV_MAJOR_VERSION) CVAUX_STR(CV_MINOR_VERSION) CVAUX_STR(CV_SUBMINOR_VERSION)
// libファイル名の最後の部分をReleaseとDebugで分ける
#ifdef _DEBUG
#define CV_EXT_STR "d.lib"
#else
#define CV_EXT_STR ".lib"
#endif
//プロジェクトのプロパティ⇒リンカー⇒全般 の追加のライブラリディレクトリに
// libファイルのあるフォルダ(C:\opencv\build\x86\vc10\libなど)を追加のこと
#pragma comment(lib, "opencv_core" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_imgproc" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "opencv_highgui" CV_VERSION_STR CV_EXT_STR)
#pragma comment(lib, "zlib" CV_EXT_STR)
#pragma comment(lib, "IlmImf" CV_EXT_STR)
#pragma comment(lib, "libjasper"CV_EXT_STR)
#pragma comment(lib, "libjpeg" CV_EXT_STR)
#pragma comment(lib, "libpng" CV_EXT_STR)
#pragma comment(lib, "libtiff" CV_EXT_STR)
int _tmain(int argc, _TCHAR* argv[])
{
//画像データの読込
cv::Mat src_img = cv::imread("lena.jpg", -1);
if (src_img.empty()){
return -1;
}
//表示ウィンドウの作成
cv::namedWindow("src");
cv::namedWindow("dst");
//処理後画像データ格納用
cv::Mat dst_img;
//画像処理例(Canny Edge Detector)
cv::Canny(src_img, dst_img, 100.0, 150.0);
//画像の表示
cv::imshow("src", src_img);
cv::imshow("dst", dst_img);
//キー入力待ち
cv::waitKey (0);
return 0;
}
(実行結果)
サンプルプロジェクトファイルはこちら↓
(OpenCV2.4.6 + Visual Studio 2010 C++ Expressのサンプルです)
スタティックリンクライブラリを使うと、Pathの設定が無いので、ちょっと楽!
2013.7.3 OpenCV2.4.6が公開されました。
Windows版の入手先はこちら↓
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/
変更点はこちら↓
http://code.opencv.org/projects/opencv/wiki/ChangeLog#New-functionality
評価はこれから。。