メタセコイアでテクスチャをはる

11月 26th, 2013
このエントリーを含むはてなブックマークはてなブックマーク - メタセコイアでテクスチャをはる

metaseeqTop1

メタセコイアを使ってテクスチャをはる方法を簡単に解説したサイトが見当たらなかったので書いておきます。一口にメタセコイアでテクスチャをはると言っても、単にマテリアルを設定するだけの方法や、UV操作だけで設定するもの、メッシュとテクスチャの位置を対応付けてはるものなどがあります。ここでは後者のメッシュとテクスチャの位置を対応付けてはる方法を説明します。

モデルデータの読み込み

今回はこのフラスコをモデルデータとして、ここにテクスチャを設定していきます。モデルデータと使用するデータは↓においておきます。参考にしてください。まずはじめに、flask.mqoをメタセコイアにドラッグ&ドロップして開いてください。以下のような感じのデータが表示されると思います。
モデルデータ

1

仮テクスチャの設定

次に、ロードしたモデルに仮のテクスチャを設定します。これは実際に使うテクスチャを作成するために使う一時的なテクスチャであり、とくに模様はなんでもかまいません。今回は市松模様のテクスチャ(sample.bmp)を使用します。まずは右下のマテリアルパネルの「新規」をクリックし新しいマテリアルを作成します。作成されたマテリアル(mat1)をダブルクリックし、材質設定画面を表示します。この画面の模様のテキストボックスに市松模様のテクスチャを指定してください。

2

マテリアルが設定できたら、次はこのマテリアルをモデルに適用します。まずは左のコマンドタブから「範囲R」をクリックし、フラスコのモデルを全選択します。選択された部分はピンク色から緑色に変化するので、すべてのメッシュが選択されていることを確認して下さい。

3

モデルが選択されていることを確認したら、ツールバーから「選択部処理」→「面に現在の材質を指定」を選択してください。これで下図のように市松模様のテクスチャがモデルデータに設定されたと思います。

4

UV操作でテクスチャを設定

ここから、UV操作パネルを使って実際に使うテクスチャを作成していきます。UV操作と言っても特に難しいことはなく、やることはモデルメッシュとテクスチャの位置の対応付けです。つまり「このメッシュにはテクスチャのこの部分を使う」ということを指定しいきます。

UV操作は通常のメタセコイアのモデリング時とは少しだけ操作が異なるので混乱するかもしれませんが、覚えておくべきことは以下の3つだけで十分です。マウスカーソルの位置によって背景テクスチャとモデルのどちらにフォーカスが合うかが変わります

「UV操作の仕方」
・中ボタンスクロール:拡大縮小
・中ボタンクリックしてドラッグ:移動
・右クリックでドラッグ:回転

では早速UV操作でテクスチャを設定していきましょう。まずはF1キーを押して横からの視点ビューに切り替えます。次に左パネルの「コマンド」→「UV操U」を選択します。すると背景に現在選択されている市松模様のテクスチャ(UVテクスチャ)が表示されると思います。UV操作ではこのUVテクスチャと手前のモデルのメッシュの位置の対応付けをしていきます。

5

まずはじめに、モデルのメッシュが全選択された状態で、モデルをテクスチャの中心に移動させ、UV操作パネルの焼きこみを押してください。UVテクスチャにモデルの型がスタンプのように押されます。これで、当該部分のメッシュとテクスチャの座標が対応付けられました。

6

ただし、このままではフラスコのキャップのてっぺん部分のテクスチャが指定されていないままになってしまいます。そこで、先ほどフラスコを全選択したのと同じように、左のコマンドタブから「範囲R」をクリックしモデルのキャップのてっぺん部分のみを選択してください。

その状態でモデルを回転させ、下図のようにキャップのてっぺんが正面に表示されるようにして下さい。空いている位置にモデルを移動させ焼きこみボタンを押します。こうすることで、キャップのてっぺん部分とテクスチャ座標の対応付けも出来ました。

7

テクスチャに着色する

最後に今作成したUVテクスチャを書き出して、それに着色します。UVテクスチャを書き出すには「UV操作パネル」から「ファイル出力」を選択し任意の場所にテクスチャを書き出して下さい。以下の様なテクスチャが書き出されると思います。

tex

このテクスチャに対して着色します。今回はペイントで超テキトーに塗りましたが(笑)実際にはPhotoshopで綺麗に仕上げます。

tex2

着色したテクスチャを、材質設定画面で仮の市松模様のテクスチャの代わりに設定すると、新しく作成されたテクスチャがモデルに適応されます。これでUVテクスチャの設定は完了です。

8

おすすめ参考書籍

メタセコイアの良質な参考書籍が少ない中で、この参考書は簡単なモデルの作り方からUVテクスチャの設定方法、レンダリングまで非常にわかりやすく解説されています。とりあえず、メタセコイアで何かつくろうと思うなら、手元においておきたい一冊です。この一冊を読めば、全くメタセコイアを触ったことがない!という人でも表紙に書かれている程度のモデルならすぐに作れるようになるはずです。

新 メタセコイアからはじめよう!
原田 大輔
技術評論社
売り上げランキング: 72,494

こちらは、上記の「メタセコイアからはじめよう!」とは違い、それなりにメタセコイアを使ったことがある人向けの書籍です。ただし、ローポリゴンの作成に特化して書かれているかというとそうではなく、「簡単なモデルは作れるようになったけど、人のモデルってどうやってつくるの?」というような疑問を持っている人にはうってつけの参考書です。UVテクスチャの説明も詳しくされており、中級者へのステップアップには非常に役に立つ参考書です。

ローポリ スーパーテクニック
ntny
ソフトバンククリエイティブ
売り上げランキング: 21,842

3Dのモデルデータはなんとなく作れるようになったから、次はゲームを作ってみたいという方はこちら。手前味噌になりますが、ゲームを作るのに必要なライブラリの使い方から必要な技術まで詳しく解説していきます。
OpenGLでゲームを作る

C言語による画像処理入門 その1

5月 30th, 2012
このエントリーを含むはてなブックマークはてなブックマーク - C言語による画像処理入門 その1


C言語をひと通り学ぶと、多くの人は画像処理だったりゲーム作りだったりと、目に見えるものを作りたくなるものです。しかし、画面上にHello, Worldを表示するのと、ウインドウを出すのとでは天と地ほどの開きがあるのです。Windowsでは、Windows特有の言語を使って100行近いコードを書かないと、ウインドウすら出てくれません。これでは、画像処理の勉強をしているのかWindowsプログラミングの勉強をしているのか分からなくなってしまいそうです。

たまに、C言語のみで画像処理を行なっている入門者用のサイトがあったとしても、やれSDKをインストールしろだとか、やれ自作ライブラリをリンクしろだとか、入門者には意味プーのことばっかり書いてあって心が折れてしまいそうです。また、世の中にはOpenCVというIntelが開発した天才的に楽ちんなライブラリがあるのですが、ほぼ完全にブラックボックス化されており、画像処理の低レベルな部分を勉強したい人には不向きです。(といっても実用ではモックを作るときなどには便利ですので結構利用しています)

 

この講座のコンセプト

そこで、この「C言語による画像処理入門」では、ライブラリ不要、Windowsプログラミング不要、ブラックボックスはなし、という条件のもとC言語のみで画像処理を行なって行きたいと思います。
 

これだけは持っておきたい参考書

さてさて、ここで少し参考書の話をしておきましょう。現在日本にはまともな画像処理の参考書が数冊しかありません。そこで先だって、その数冊のうち「これを知らなければモグリだろ」というくらい有名な参考書を1冊あげております。これから画像処理を頑張るか、という人は持っていて絶対に損はありませんよ!
 
 

ディジタル画像処理
ディジタル画像処理
posted with amazlet at 12.05.30
CGーARTS協会
売り上げランキング: 4299

 
 
この本では、2値化やエッジ抽出といった低レベルな画像処理から、Snakeや物体認識といった高レベルな画像処理まで画像処理の基本となる技術を幅広く網羅しており、まさに教科書的な参考書です。大学などで画像処理を勉強したいなら、この本に書いてあることはひと通りマスターしておいたほうが良いでしょう〜。画像処理をやる際には手元に欲しい一冊です。
 
 

ゲームプログラマになる前に覚えておきたい技術
平山 尚(株式会社セガ)
秀和システム
売り上げランキング: 10284

 
 
もう一冊のこの本は、タイトルからも分かる通りゲーム作りの本です。ゲーム作りの本なのですが、画像処理に大切なことが、本当にたくさーん詰まっています。たしかにキャッシュの話とか、浮動小数点演算の話とか入門者にはちょっとレベルが高い話もありますが、知っているか知らないかで後ほどボディーブローのように聞いてくる技術がもりだくさんです。画像処理という分野にかかわらず、幅広い分野でつかえる素晴らしい技術書です。何も言わずに買って下さい(笑)
 

まとめ

ということで、今回はこの「C言語による画像処理入門」のコンセプトと参考書の話で終わってしまいましたが、次回は、C言語で画像の読み込みをしてみたいと思います。

Xcode4でつくるOpenCV環境

5月 21st, 2012
このエントリーを含むはてなブックマークはてなブックマーク - Xcode4でつくるOpenCV環境


 
ここでは、Xcode4を用いてOpenCVのプログラムを組むために必要な環境の整え方を紹介します。用いるXcodeはXcode4.3、OpenCVのバージョンは2.3です。また、動作はMacOSX 10.7 Lionで確認しています。

 Xcodeのインストール

まずはじめに、Xcode4.3をApp Storeからダウンロードします。以前はiOS developper centerからダウンロードしていましたが、最近はApp Storeから入手できるようです。
 

 gccのインストール

コマンドライン用のgccがインストールされていない場合はXcodeのPreferenceからDownloadsタブへとすすみ、Command Line Toolsをインストールしておいて下さい。コマンドラインで使えるgccがない場合、homebrewでOpenCVをインストールしようとしてもエラーで停止してしまいます。
 

  

 homebrewのインストール

つぎに、OpenCVをインストールするため、パッケージ管理システムのhomebrewをインストールします。まずは本家からhomebrewをダウンロードします。
 

/usr/bin/ruby -e "$(/usr/bin/curl -fsSL https://raw.github.com/mxcl/homebrew/master/Library/Contributions/install_homebrew.rb)"

 

 OpenCVのインストール

homebrewがインストールできたら、つぎは以下のコマンドでOpenCVをインストールします。2012年5月現在では問題なくインストールできます。パッケージのインストールが完了すると、/usr/local/Cellar/opencv以下にOpenCVの実行に必要なインクルードファイルとライブラリファイルがインストールされます。
 

sudo /usr/local/bin/brew install opencv 

 

 Xcodeの設定

ここまでで、OpenCVはインストールできたので、次はXcodeからOpenCVを使う設定を行います。新規プロジェクトをCommand Line Toolとして作成します。プロジェクトが作成できたら、先ほどインストールしたOpenCVのインクルードファイルとライブラリファイルの場所をXcodeに教えてやる必要があります。


 
まずは、各ファイルの場所を指定します。Xcodeの左側に配置されているProject navigator上でプロジェクトファイルを選択し、TARGETS、Build Settingタブへとすすみ、Header Search PathsとLibrary Search Pathsの項目にどちらも/usr/local/Cellar/opencvと入力します。この際、入力欄の左側にあるチェックボックスにチェックを入れてリカーシブルにファイルが検索されるようにします。
 

 
最後にライブラリをリンクします。Build Settingsの横にあるBuild Phasesタブをクリックし、その中にあるLink Binary With Libraryesの行にOpenCVのライブラリをD&Dします。今回インストールしたOpenCVのライブラリは/usr/local/Cellar/opencv/2.3.1a/libにあるため、このフォルダに移動し(Finderで移動->フォルダへ移動を選択)必要なライブラリをXcodeにドラックして下さい。今回は以下の3ファイルをリンクしました。
 
・libopencv_core.dylib
・libopencv_highgui.dylib
・libopencv_imgproc.dylib
 

 
 
 

 OpenCV実験

実際にOpenCVがXcodeから使えるかどうか以下のサンプルプログラムを使って実験してみてください。うまくOpenCVがインストールできていれば、今流行の金環日食が見れることでしょう(笑)
 

#include <cv.h>
#include <highgui.h>

int main ()
{
    IplImage *img = cvCreateImage(cvSize(256, 256), IPL_DEPTH_8U, 3);
    cvZero(img);
    cvCircle(img, cvPoint(128, 128), 128, cvScalar(170,255,255), 3);
    
    cvNamedWindow("test");
    cvShowImage("test", img);
    
    cvWaitKey(0);
    return 0;
}

 
 

iTime goes by

10月 14th, 2011
このエントリーを含むはてなブックマークはてなブックマーク - iTime goes by

本日、iPhoneアプリ「iTime goes by」をリリースしました。「iTime goes by」は、撮影した画像に対して回転や上下左右、拡大縮小などのアクションをつけることができるため、写真の中の人やものを動かすことが出来ます!写真撮影で止まってしまった時間を、このアプリでもう一度動かしてみませんか?
 
 
下の写真は、このアプリケーションを使って作成した作品です。「iTime goes by」では様々なアクションを付加できるのであなたの想像力次第でとっても楽しい作品ができるかもしれません!!
 
「どうやって撮ろうかなぁ・・・」

 
「流れる雲のようにどこまでも〜」

 
「素敵に海岸線をドライブ」

 
「まじ、ねっむ〜」

 
 
 
[使い方]
次にこのアプリの使い方を紹介します(といってもそれほど難しくありませんが・・・)まずは左下のカメラのアイコンをタップして、写真を撮影するか、ライブラリから写真を読み込んでください。

 
  
写真がロードされたら動かしたい部分を指でなぞります。失敗した時は画面右上にあるアンドゥボタンで作業を取り消すことも出来ます。

 
 
動作方法や移動速度、移動の幅などを変えたい場合には、うごいている「もの」をタップして下さい。各種動作を変更できるエディット画面が出現するので、気に入った動き方をするまで色々と試してみてください!

 
 
 
[iTunes Storeでみてみる]
もし、気になられた方は、下のアイコンをクリックしてiTunes Storeで見てみてください!よろしくお願いします!
 

10分で学ぶOpenCV超入門

3月 27th, 2011
このエントリーを含むはてなブックマークはてなブックマーク - 10分で学ぶOpenCV超入門


 
 
C言語を勉強した人がOpenCVを始める取っ掛かりとして使ってもらえれば嬉しいです。配列とか関数は分かるけど、ポインタはちょっと・・・というくらいの人から読めるように書いてみました。
 

OpenCVとは

 
OpenCVとは画像処理で使える関数がたくさん用意されている関数群(フレームワーク)です。例えばC言語でファイルを読み込むのにfgets()という関数が用意されているように、OpenCVでは画像を読み込むcvLoadImage()という関数が用意されています。勿論、用意されている関数はこれだけではなく、画像をグレースケール化したり画像中から四角形を検出したり、顔を検出したりする関数まで用意されています。

 

OpenCVでの処理の流れ

OpenCVを使ったプログラムの基本的な流れは


 
といった流れになっています。以下では、まず始めにstep1とstep3だけを行うプログラムを作成したあとに徐々に複雑なプログラムを作成していきます。どんなに複雑なプログラムでも、基本の流れは上のようになっているので、これを見失わないようにしてください。
 
 

OpenCVを使ったプログラム

 
1. 画像を読み込み表示する

単純に画像ファイルから画像データを読み込み、それを表示するプログラムです。最初ですのでプログラムについて細かく説明していきます。

まずはじめに、OpenCVにはIplImage型という画像を格納する型が用意されています。C言語では整数をいれるint型や小数をいれるdouble型が用意されていましたが、これと同様に画像を入れるIplImage型があるわけです。
 
3行目ではIplImage*型のimgという変数を宣言しています。ポインタ型で宣言されていますが、とりあえずは無視して普通の変数と同じように考えても大丈夫です(^^;;)このimg変数にcvLoadImage関数を使って画像を読み込んでいます。

4行目から7行目まではエラー処理です。画像が読み込めなかった場合には変数の中身がNULLになることを利用してエラー検出をしています。

9行目と10行目が画像の表示処理です。9行目でImageという名前のウインドウを作成し、10行目で作成したImageウインドウに画像を表示しています。

13行目と14行目は後始末です。ポインタ型を使った場合には必ず確保したメモリを開放する必要があるのでプログラムの最後で開放しています。iPhoneなどの環境ではメモリ制限が厳しいのでこの処理は忘れないようにしましょう。

int main()
{
	IplImage *img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_ANYCOLOR);
	if( img == NULL ){
		fprintf(stderr, "no such file or directory\n");
		exit(-1);
	}
	
	cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
	cvShowImage("Image",img);
	cvWaitKey(0); 
	
	cvReleaseImage(&img); 
	cvDestroyWindow("Image");
	
	return 0;
}

 
 
 
2. 画像のサイズを変更する
 
 
 
 
読み込んだ画像のサイズを縦横1/2にして表示するプログラムです。プログラムとしては上記のものと大半が同じですので、違うところだけ説明していきたいと思います。

1行目ではimg変数に画像を読み込んでいます。2行目ではリサイズ後の画像を格納する変数resizedを定義してから、直後にcvCreateImage()関数で画像の大きさや種類などを指定して、どれくらいのメモリが必要かを記述しています。

このように、IplImage*型を使う場合には、cvCreateImage関数を使って画像の大きさ、1pxのビットデプス、レイヤ数の3つを指定する必要があります。この3つについて以下に説明します。

画像の大きさはcvSize(幅,高さ)、またはcvGetSize(画像)を使って指定します。今回は縦横1/2の大きさにするので、先ほどimgに読み込んだ画像の高さと幅の半分を指定します。img画像の幅と高さはそれぞれimg->width, img->heighで取得できます(C言語のポインタ型で宣言された構造体のメンバにアクセスする際の記述です)

次にビットデプスですが、1pxの明度は大抵の場合0から255で表すのでビットデプスは8bitになります。今回もIPL_DEPTH_8Uを指定しています。

最後のレイヤ数ですが下図に示すように、グレースケール画像の場合には1レイヤ、RGB画像(カラー画像)の場合には3レイヤ、RGBA画像(透明部分を含んだ画像)の場合には4レイヤが必要になります。今回は単純なカラー画像なので3レイヤを指定しています。

11行目では処理の本体であるリサイズを行っています。といっても、複雑な処理を記述する必要はなくcvResize関数に元画像imgと結果を格納する画像resizedと補間方法を渡しているだけです。CV_INTER_CUBICはバイキュービック法を用いて画像を補間します。このアルゴリズムは結果画像が綺麗な代わりに、処理時間が遅くなります。一方、CV_INTER_LINIERを指定すると結果画像は雑になるけれども高速な処理が可能なアルゴリズムが適応されます。

このように、引数によってアルゴリズムを差し替えられるのがOpenCVの強みの1つではないでしょうか?

int main()
{
	IplImage *img = cvLoadImage( "test.jpg", CV_LOAD_IMAGE_ANYCOLOR);
	IplImage *resized = cvCreateImage(cvSize(img->width/2, img->height/2), IPL_DEPTH_8U, 3);
	
	if( img == NULL ){
		fprintf(stderr, "no such file or directory\n");
		exit(-1);
	}
	
	cvResize(img, resized, CV_INTER_CUBIC);
	
	cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
	cvShowImage("Image",resized);
	cvWaitKey(0); 
	
	cvReleaseImage(&img); 
	cvReleaseImage(&resized); 	
	cvDestroyWindow("Image");
	
	return 0;
}

 
 
 
3. 画像をグレースケール化する
 

 
次のプログラムは画像をカラー画像からグレースケールに変換するものです。4行目でグレースケール化した画像を格納する変数grayを宣言し、直後でcvCreateImageを用いて大きさ・ビットデプス・レイヤ数を指定しています。

変数grayはグレースケール画像を格納するものであり、画像のサイズはimgと同じものなのでcvGetSizeを使ってimgと同じサイズを指定しています。また、グレースケールのレイヤ数は1枚なのでcvCreateImageの3つめの引数には1を指定しました。

グレースケール変換の本体は11行目に記述しています。こちらもリサイズと同じく、cvCvtColorという関数だけ処理することが可能です。関数の引数に元画像img、変換画像gray、変換方法CV_RGB2GRAYを渡しています。

3つめの引数にCV_RGB2GRAYを指定することでRGB画像からGRAY画像に変換することが可能です。(RGB2GRAYの2はtoの略記です)他にもHSV画像やRGBA画像など、かなり自由に変換することができるので非常に重宝する関数です。

自分でグレースケール変換処理を記述する場合、RGBからグレースケールに変換する場合にはRGB各レイヤの明度に対して、以下の式で変換を行う必要があります。
 

 
このような変換を知らなくても記述できてしまうのがOpenCVの強みでもあります。(まぁ、問題でもあるんですけどね・・・)

int main()
{
	IplImage *img = cvLoadImage( "test.jpg", CV_LOAD_IMAGE_ANYCOLOR);
	IplImage *gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	
	if( img == NULL ){
		fprintf(stderr, "no such file or directory\n");
		exit(-1);
	}
	
	cvCvtColor(img, gray, CV_RGB2GRAY);
	
	cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
	cvShowImage("Image",gray);
	cvWaitKey(0); 
	
	cvReleaseImage(&img); 
	cvReleaseImage(&gray);	 
	cvDestroyWindow("Image");
	
	return 0;
}

 
 
 
4. 画像を2値化する
 
 
 
超入門編の最後として、画像を白と黒の2値化するプログラムを紹介します。まずは、読み込んだ画像をグレースケール化し、その後グレースケール値を閾値に基づいて白か黒に振り分けます。具体的には各ピクセルのグレースケール値が閾値以上のなら白色(明度:255)に、閾値以下なら黒色(明度:0)に変換します。


 
まずは4, 5行目でグレースケール画像を格納するgrayと2値化画像を格納するbinを宣言しています。サイズは読み込んだ画像と同じものなので、どちらもcvGetSizeで指定、レイヤ数は1レイヤを指定しています。

また、12行目でグレースケール化、13行目で2値化を行っています。cvThreshold関数の引数には元画像、結果画像、閾値、最大値、変換方法を指定しています。3つめの引数である閾値の値を変化させることで画像の白部分と黒部分の割合が変化します。
 

int main()
{
	IplImage *img = cvLoadImage( "test.jpg", CV_LOAD_IMAGE_ANYCOLOR);
	IplImage *gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);	
	IplImage *bin = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	
	if( img == NULL ){
		fprintf(stderr, "no such file or directory\n");
		exit(-1);
	}
	
	cvCvtColor(img, gray, CV_RGB2GRAY);
	cvThreshold(gray, bin, 128, 255, CV_THRESH_BINARY);
	
	cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
	cvShowImage("Image",bin);
	cvWaitKey(0); 
	
	cvReleaseImage(&img); 
	cvReleaseImage(&bin);	 
	cvDestroyWindow("Image");
	
	return 0;
}

 
このように、OpenCVを使えば非常に簡単に画像処理が行えます。用意されている関数を上手く使うことで、QRコードの読み取りや顔の特徴点検出など、さらに高度な処理が可能となります。次回はlplimageのピクセルにアクセスする方法を中心に解説していきたいと思います。
 
 

参考書籍

 
「OpenCVプログラミングブック」
OpenCVを1から始めるのなら、一番わかり易い参考書は本書でしょう。画像処理の基礎的なアルゴリズムをOpenCVで実装している例が多数掲載されているため、画像処理の勉強にも最適です。

OpenCV プログラミングブック 第2版 OpenCV 1.1対応
奈良先端科学技術大学院大学 OpenCVプログラミングブック制作チーム
毎日コミュニケーションズ
売り上げランキング: 66050

 
「詳解OpenCV」
ただ、どの大概の入門書がそうであるように、画像処理の踏み込んだ話までは書かれていません。(例えばフーリエ領域での計算とか計算コストの話、などなど)そこで役に立つのがオライリーの「詳解OpenCV」です。OpenCVの参考書というよりも、画像処理の中級書といった方が正しいかもしれません。高度な内容まで網羅されているので、画像処理をやるなら、手元に一冊置いておいて絶対損はありませんよ!

詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 29059

 
 

コラム
 
「plImage*型を使う場合には、必ず画像の大きさ・デプス・レイヤ数を必ず指定」といっておきながら、変数imgを宣言したときにはcvLoadImageを使っているぢゃん!!と思われる方もいたかと思います。

はい、仰るとおりです(笑)実はファイルを読み込んだ際に、ファイルに埋め込まれた情報からcvLoadImage関数の中で内部的に指定してくれています。なので、例外的にcvCreateImageでメモリ確保を明示的に行う必要がないのです。(勿論、cvReleaseImageでメモリの開放は必要です)

cvLoadImageの他には、cvCloneImageという関数もありまして、こちらも明示的に宣言する必要はありません。まぁ、例外的なのはこの2つくらいなので、入門編ではちょこっと説明を端折ってしまいました。