コラム処
Amebaでブログを始めよう!

たけし

北野武さんが,芸大の教授に就任だそうだ.
http://www.asahi.com/national/update/1202/013.html
東大情報学環のコンテンツ創造科学産学連携プログラムと同様,
実際に実績のある人を教授として招聘する,
という流れはもう止まらないかもしれない.
大学(正確には大学院といったほうがよいだろう)
というものがオープンなものになってきたということか?
(研究科にもよるが・・・)

では,具体例として吉本のお笑いの人がお笑いについて
アツく語る授業があったらどうするか?
もちろん個人的には問題はないし,
それ以前に新鮮なお話を聞けそうである.
ここで論点となるのは
聞き手の授業を聴く態度である.
たとえば,芸人になる気がない人に向かって授業をするのは,
いささか失礼にも感じられる.
まあ,芸人になる気がなくてもよい.
大学では,研究ををするのであるから,
お笑いについて研究する意気込みくらいはほしい.
お笑いについての授業があったなら,
A420枚くらいのレポートはかけそうなものである.

「お笑いを科学する」
このことは「お笑い」ではないことだけは確かだ.

徳川家康再考その1

徳川家康について再考してみることにする.
その理由は,彼ほど苦労し,絶妙な要領で時代を切り抜けた人物は
いないと思われるからだ.
さらに彼は最後に成功している.

一体何が成功の秘訣だったのだろうか?
その中でも,もっとも重要なのは人間関係であろう.

特に,上司と部下の関係,である.
彼が重視していたことのひとつに,
「部下が上司に意見する」
ということがあった.

特に諫言は難しい.
上司がやろうとしている,または今現在行っていることを否定するわけだから
言葉を選ばなければ,上司の勘気を蒙ることになる.
追放されるかもしれない.

要するに,「相手の気を害せずして社稷をいかんせん」
(相手に気を使いながら,国のことを第一に考える)
ということを考えて進言をするのがよいのである.
家康は,こういうことをよくわかっている人間であった.
したがって,部下が一生懸命考えたことを進言してきた場合には,
よくその話を聞いた.
しかし,軽率な発言には激怒した.
当たり前である.
軽率な発言が場の雰囲気をどのように変えるか?,
軽率な発言が許される場という認識を周囲に与えると
如何に会議という場に悪影響が生じるか?,
軽率な発言を許す上司は,ある種の自信を喪失した
腰抜けではないかという誤解を与えるのではないか?,
などといろいろな問題点があるのである.

したがって,私の勝手な推測だが,
家康は信長公に対してはあまり進言をしなかっただろう.
信長は基本的に人の話を聞かず,決定はほとんど自分でした人間であるからだ.
そもそも,家康は信長の家臣ではないので,強く進言する必要もなかった.
楽な立場であったわけだ.
対して,信長の家臣であった明智光秀は信長に対し諫言を多くして
結局最後は喧嘩別れである.

人に対し意見を述べるというのは,難しいことである.

下克上も面倒くさい?

戦国時代の上司と部下の間の関係について考えてみた.
現代では,この「上下関係」と,「頭の良さ」には相関はない.
つまり,頭が良いほうが上,悪いほうが下,ということはないのである.
しかし,戦国時代はそうはいかない.
駄目な人間は淘汰されていく.それがこの時代である.
とはいっても,上司をやっつけるいわゆる下克上は簡単なものでもなかった.
現代の場合もいろいろ込み入った問題が多数あるが,
下克上が当たり前の戦国時代においても,
「部下が上司を叩く」,ということはよっぽどのことがない限り
できないことなのである.
ましてや,下手に悪口でもいおうものなら誅される,こともある.
上司が暗愚ならなおさらだ.
あの下克上の典型とも言われる
「斉藤道三」でさえ,
主家をしっかりたてていた時期もある.
斉藤道三の主君であった土岐頼芸(トキヨリアキ)は暗愚な人間であった,
しかし,道三はどういうわけか,
「俺のほうが優れているから俺がこの国を治める」という
心をあらわにはしない.国を治める欲望があるにもかかわらず,だ.
結局大義名分らしきものを得る,
その国の人々を納得させる,
といったプロセスに数年かかるのである.
結局,下克上を行ってそれが成功したとしても
当時としてはすでに死期が迫っている,
というパターンが多い.
尼子経久(アマゴツネヒサ),北条早雲(ホウジョウソウウン),
長尾為景(ナガオタメカゲ),三好長慶(ミヨシナガヨシ),
宇喜多直家(ウキタナオイエ).
彼らは,下克上によって主家を倒した
(または,1国をほぼ支配下においた)はいいものの,
絶頂から数年後には死んでしまうのである.

戦国時代の下克上にも時間がかかるのである.

BGR2RGB

OpenCVには,多くの色空間がすでに実装されている.
しかも,
cvCvtColor(const CvArr* src,CvArr* dst,int colorCvtCode);
を利用することで簡単に色空間の変換を行うことができる.
入力画像に対して出力画像を指定する必要がある.
同じポインタを指定するとプログラムは死ぬかもしれない.

では,実際に何が行われているのか?
Win上での開発の場合,
BGRとRGBの逆転の問題には振り回されることになることが多いので
この問題について言及してみる.

C:\Program Files\OpenCV\cv\src\cvcolor.cpp
の中を見てみよう.
#define ICV_CVT_BGR2RGB( arrtype, src, dst )
{
arrtype t0 = (src)[0], t1 = (src)[1], t2 = (src)[2];

(dst)[0] = t2;
(dst)[1] = t1;
(dst)[2] = t0;
}
と書いてある.
三回コピー作業が行われているようだ.

これが冗長だと思われる方は
(細かい話だが入力画像と出力画像が同じメモリ領域ならコピーは2回でよい),
簡単なので関数を自作してみよう.
下の関数は例.

CvtColorBGR2RGB(IplImage *img){
int i,j;
char tmp;
for(i = 0;i < img->height;i++){
for(j = 0;j < img->width;j++){

tmp = img->imageData[2];
imageData[2] = imageData[0];
imageData[0] = tmp;

imageData += 3;//RGB
}
}
}

IplImage構造体(OpenCV)

OpenCVやIPL(IPP)を使う上で必須となるものが
IplImage構造体である.

今日は,これについて確認をしておく.

IplImag構造体は,Winの場合以下のパスに存在する
cxtypes.h内で定義されている.
C:\Program Files\OpenCV\cxcore\include\cxtypes.h

下にすべてを書いておくが,
重要なところをピックアップして書いておく.

int origin;
これは,画素データの先頭は画像のどこか?を示すフラグ.
Windows bitmapのことを考えると重要である.
int width,height;
いうまでもない.幅と高さである.
char *imageData;
unsigned char *でないところが不思議.
しっかりキャストする必要があるだろう.

//以下IplImageの中の確認
typedef struct _IplImage
{
int nSize; /* IplImageの大きさ */
int ID; /* version (=0)*/
int nChannels; /* 色空間のチャネル数.RGBなら3,RGBAなら4,グレイスケールなら1 */
int alphaChannel; /* OpenCVには無視される */
int depth; /* 色深度を示す定数.IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F がサポートされている */
char colorModel[4]; /* OpenCVには無視される */
char channelSeq[4]; /* ditto */
int dataOrder; /* 0 - RGBRGBRGBのような交互にくる配列, 1 - RRR...GGG...BBB...のようなチャンネルが分離した配列
cvCreateImage関数では,RGBRGBという交互に来るものだけを生成可能である */
int origin; /* 0 - 左上から始まる画像データ,
1 - 左下から始まる画像データ(Windows bitmap) */
int align; /* OpenCVには無視される.
              代わりにwidthStepを使用する*/
int width; /* 幅のピクセル数*/
int height; /* 高さのピクセル数*/
struct _IplROI *roi;/* ROI(Region of Interest)もしこれがNULLの場合,すべてがROIとなる */
struct _IplImage *maskROI; /* NULLでなければいけない */
void *imageId; /* ditto */
struct _IplTileInfo *tileInfo; /* ditto */
int imageSize; /* 画像が何バイトかをあらわす定数.
(カラーチャネルが交互に並んでいるデータの場合,
                imageSize = image->height*image->widthStep
)*/
char *imageData; /* 画素の先頭を指すポインタ */
int widthStep; /* 幅のバイト数を示す */
int BorderMode[4]; /* OpenCVには無視される */
int BorderConst[4]; /* ditto */
char *imageDataOrigin; /* 画素の先頭を指すポインタだが,おそらく使用は推奨されないだろう.pointer to very origin of image data
(not necessarily aligned) -
needed for correct deallocation */
}
IplImage;

OpenCVのインストメモ

OpenCVのインストメモ
まず,ファイルのインストールである.
http://sourceforge.net/projects/opencvlibrary/
ここにいって
自分の使っているプラットフォームのライブラリを選びダウンロード.

今回はWin上の開発を目的としているのでwin32を選択.
基本的に,クリックを何度かすればDL可能.
ここでつまづいているようでは,ライブラリの利用はままならない.

無事にDLできたらインストール.
ここも簡単.Nextをクリックしていくだけだ.
途中のラジオボタンはacceptを選んでおこう(笑).
ファイルのインストールが終わったら,
ライブラリ生成のためにVC++を利用する.
スタートメニュー→OpenCV→MSVCの
プロジェクトファイルを選択しよう.
VC++が立ち上がったら,「ビルド」を実行しよう.
すべて完了したら次だ.

次は,インクルードファイルなどのパスの登録を行っておこう.
これをしておけば,
#include <cv.h>
などというように<>を利用していつでも呼び出せる.
登録の仕方は簡単.
VC .NETだったら,
ツール→オプション→プロジェクトでタブを移動させて
「インクルードファイル」を選択して,パスを登録していこう.
同様の手順でlibファイルのパスも登録しておこう.
<インクルードファイルのパス>
C:\Program Files\OpenCV\cv\include
C:\Program Files\OpenCV\cxcore\include
C:\Program Files\OpenCV\cvaux\include
C:\Program Files\OpenCV\otherlibs\highgui

<libファイルのパス>
C:\Program Files\OpenCV\lib

上記の作業が終わったら,最後に残るはDLLの移動だ.
C:\Program Files\OpenCV\bin
内にあるDLLファイルをすべて
C:\Windows\system32
に移動してしまおう.

これで晴れてOpenCVを使えるようになった.
あとは,
C:\Program Files\OpenCV\samples
内にあるサンプルをそのまま実行したり,
ソースからビルドしてみたりして
OpenCVを楽しんでみてほしい.

テスト

テスト