Pipe Renderでタグ「ARToolKitソースの公開」が付けられているもの

パブリックドメインソースを公開したので、次にプログラムをまとめたものを公開します。

FingerDetect1.0.zip


-- < プログラムの使い方 > ---

0.Webカメラが2つあることが最低条件です。
ちなみに僕のは"Qcam Pro for Notebooks"。他のカメラでは試していないので、動くかどうかはわからないです。
あと、2つのカメラの設定を同じにしてください。
1.2つのカメラの向きを平行にして、まっすぐに並べる。
2.緑色のキャップのようなもの(作者は風船を使用)を用意し、それを親指に付けます。
3.TwoViewに関する説明(http://render.s73.xrea.com/pipe_render/2008/05/artoolkittwoview.html)を読み、"WDM_camera_flipV_01.xml"、"WDM_camera_flipV_02.xml"を作成し、Dataフォルダに入れる。
4.マーカーと手を表示し、マーカーと指の距離が表示されることを確認します。
5.親指と人差し指を近づけて、カーソルがクリック状態になるかどうか(2つの指の間の線が赤くなる)を確認します。
6.マーカー上の立方体に指近づけて、クリック状態にします。
7.クリック状態で指を移動すると、立方体も移動します。
8.立方体の移動中にクリックを解除すると、立方体の移動が止まります。



--- < ソースの概要 > ---

今回のプログラムでは、いくつかのクラスを追加しました。
・CHandContourクラス:手の輪郭線を扱います。指の認識などを行えます。
・CPointActionクラス:複数の点を用いたカーソルアクションを行います。

こちらについては、近いうちにドキュメントを公開する予定です。



ソースの公開ですが、まず最初に新規に作成した指認識のソースだけ公開いたします。
これは一応ライセンス上の体裁を整えるためだけの行為なので、この後にまとめたソースをちゃんと公開いたします。

というのも、このソースについてはGPLライセンスではなく、パブリックドメインになっています。
なので、この部分だけ分離し、先に公開しました。

(実際にはここまで厳密にやらなくてもいいと思いますが。


指認識部分のソース:
CHandContour1.0.zip



パブリックドメインソフトウェア(PDS)については以下のよう説明されています。
Wikipedeia:パブリックドメインソフトウェア

ここで、日本では著作人格権を放棄できないので、以下のようにしなくてはいけないと書かれています。

...「将来にわたって著作権(及び著作者人格権)を主張しないことを宣言する」などと明記することによって、事実上の PDS として扱われる...

これによりこの部分のソースについては、利用者は著作権による制限なしにソフトウェアを利用することができます。GPLのような「ソース公開の義務」も発生いたしません。


それから今回、コメントをdoxygenの形式に対応いたしました。近いうちにドキュメントを作成し、公開する予定です。

お待たせしました。
twoViewを使った、ステレオマッチングプログラムのソース公開です。

StereoAnyColor1.0.zip


--- < プログラムの使い方 > ---


0.Webカメラが2つあることが最低条件です。
ちなみに僕のは"Qcam Pro for Notebooks"。他のカメラでは試していないので、動くかどうかはわからないです。
あと、2つのカメラの設定を同じにしてください。
1.2つのカメラの向きを平行にして、まっすぐに並べる。
2.赤・黄・青など特徴的な色の物体を用意し、場所は白いテーブルの上など選んだ色が他にはないような所にする。
3.TwoViewに関する説明を読み、"WDM_camera_flipV_01.xml"、"WDM_camera_flipV_02.xml"を作成。
4.プログラムを起動して"Video Source 1"ウィンドウで、用意した特長的な色の物体を画面に表示して、それを左クリックします。
5.物体が画面に映っている状態で、Fキーを押してラベリング画像を表示。
6.Kキーを押して続けて閾値を下げ、目的の物体が一番大きくラベリングされるようにします。
7.押しすぎて全くラベリングされなくなったら、Jキーを押して閾値を上げます。
8.もう1つの物体を認識させたいときは、右クリックで画面上の物体の色を指定します。
9.2つの物体が一番大きくラベリングされるようになったらOKです、Fキーを押して元の画面に戻ります。
10.マーカーを表示し、マーカーと2つの物体の距離が表示されることを確認します。
11.2つの物体の距離を近づけて、カーソルがクリック状態になるかどうか(2つの物体間の線が赤くなる)を確認します。
12.マーカー上の立方体にカーソルを重ねて、クリック状態にします。
13.クリック状態でカーソルを移動すると、立方体も移動します。
14.立方体の移動中にクリックを解除すると、立方体の移動が止まります。

以上です。
まだ色の識別が甘いので、上手く認識しないかもしれません。
今後の課題です。


--- < ソースの概要 > ---

今回のプログラムでは、いくつかのクラスを追加しました。
・CCamerasRelationクラス:カメラ間の関係
・CStereoAnyColorPointクラス:指定色のステレオ処理を行う
・CFindColorPosInImgクラス:画像認識を行い、指定色のスクリーン上の座標等を計算
・CCamSimpleTriangulationクラス:3角測量を行う

以上のクラスは次のように使います。
1.インスタンスの定義
2.クラスの初期化
3.画像認識の計算
4.結果の取得


--- < 1.インスタンスの定義 > ---

改良したtwoView.cでは、以下のようにクラスのインスタンスを作成します。
CCamerasRelation    gCamRelate(CONTEXTSACTIVECOUNT);
CStereoAnyColorPoint g_stereoOperator;
今回はグローバル変数で定義しました。


--- <
2.クラスの初期化 > ---

次に、この変数を初期化します。
// グローバル変数の初期化
static void InitGlobalValue()
{
    // 画像認識の色を指定
    g_stereoOperator.ClearTargetColor();
    g_stereoOperator.AddTargetColor( g_cnColorRealRed );
    g_stereoOperator.AddTargetColor( g_cnColorRealYellow );

    // カメラの投影行列
    gCamRelate.SetCamParam( 0, arParam.mat );
    gCamRelate.SetCamParam( 1, arParam.mat );
}
CStereoAnyColorPointの初期化では、指定色をAddTargetColorで追加します。
CCamerasRelationの初期化では、SetCamParamで各カメラに透視投影行列を設定します。


マーカーを認識できた時点で、もう1度別の初期化を行います
CCamerasRelationで、カメラ間の関係を計算します
// 2つのカメラが、同じマーカーを認識できてるかどうか
if ( gContextsActive[0].id == gContextsActive[1].id )
{
     // カメラ1の変換行列を保存
     CopyArray3x4ToMatrix4x4( mtrxTemp1, gContextsActive[0].patt_trans );
     CopyArray3x4ToMatrix4x4( mtrxTemp2, gContextsActive[1].patt_trans );

     gCamRelate.CalcRelation(0, 1, mtrxTemp1, mtrxTemp2 );
}
CStereoAnyColorPointでは、新しいカメラ画像をセット
g_stereoOperator.InitImgSource(    arImXsize, arImYsize,
                        gContextsActive[0].ARTImage,
                        gContextsActive[1].ARTImage );



--- < 3.画像認識の計算 > ---

必要な情報をセットできたら、画像処理を行います。
g_stereoOperator.RecognitionColor3DPos(&gCamRelate);
画像処理では、カメラの関係を引数として指定します。


--- < 4.結果の取得 > ---

計算が上手くいったら、結果の3次元ベクトルを取得します

for ( int iTarget = 0 ; iTarget < g_stereoOperator.GetTargetPosCount() ; iTarget++ )
{
    double dPos[3];
    if ( !g_stereoOperator.GetTargetPos(iTarget, dPos) )
        continue;
}
GetTargetPos(const int ciTarget, double dPos[3])で、指定色のベクトルを取得できます。




作成した処理の可視化プログラムを公開いたします。

ARToolKitAlgo1.0_080510.zip


今回のプロジェクトは"Microsoft Visual C++ 2008 Express Edition"で開発いたしました。
ライブラリに、いくつかコメントを追加しましたが、不完全で間違っている可能性があります。


--- <実行ファイルの使い方> ---


○変換行列の計算プログラム

・とりあえず実行
0.カメラにマーカーが映るようにします
1.画像が表示されているウィンドウを選択して、[C]キーを押し、3Dモデルのみの画面が大きく表示されるようにします。
2.画面内で、右クリックしながら3Dモデルをズームアウトして、仮想的なカメラが表示されるようにします。
3.[1]キーを押して、仮想的なディスプレイを表示します。
4.[2]キーを押して、ディスプレイに映ったマーカーを表示します。
5.[3]キーを押して、マーカーの辺1を伸ばした面を、1つ表示します。
6.[4]キーを押して、面1の法線を表示します。
7.[5]キーを押して、辺1の向かいの辺での面と法線を表示します。
8.[6]キーを押して、2つの法線の外積を求めます。
9.[7]キーを押して、残りの面と法線を表示します。
10.[8]キーを押して、その外積を表示します。
11.[9]キーを押して、2つの外積の外積を表示します。

・その他の操作
[0]キー:処理の表示を初期状態に戻す
[b]キー:立方体オブジェクトの表示/非表示
[m]キー:マーカーオブジェクトの表示/非表示


○マーカーの認識プログラム

[1]キー:2値化した画像を表示します。
[2]キー:ラベリングした画像を表示します。
[3]キー:頂点1を表示します。
[4]キー:輪郭を表示します。
[5]キー:頂点2を表示します。
[6]キー:頂点3,4を表示します。
[0]キー:表示を元に戻します。
[c]キー:画像の位置を変更
[o]キー:輪郭線を表示/非表示
[q]キー:頂点1を表示/非表示
[w]キー:頂点2を表示/非表示
[e]キー:頂点3を表示/非表示
[r]キー:頂点4を表示/非表示


お待たせしました。ソースを公開いたします。
時間がかかってしまい、申し訳ありません。

また、作者も非常に経験不足ゆえ、ファイルのミス、プログラムの不具合、説明不足、コードが読みにくい、等々予期せぬ問題が発生するかと思われます。

そういった問題は、可能な限り改善していきたいと思いますので、
メールなどで、できるだけ詳細な連絡(動作環境、現象の発生手順等)をいただけると非常にありがたいです。

では、Ver1.0になります。

MultiRelate1.0.zip
こちらも、Readmeの詳細説明用に使用いたします。

プログラムの大まかな処理は、その①その②を見てもらっても大体はわかります。
今回は少しプログラム寄りな説明になります。

安定化プログラムでは以下のような処理を行っています
・設定ファイルを読み込む
・通常表示
・関係値の計算
・計算結果を表示する
・補完処理を加えた表示
・関係値の保存

このプログラムでは、関係値のデータと処理を行うクラス"CObjectMultiCreator"があり、
上記の処理のほとんどは、このクラスのメンバ関数内で行っています。



では、それぞれの処理を見てみます

・設定ファイルを読み込む : 関数 LoadMultiRelationInf
設定ファイルには、"複数オブジェクトファイルへのパス"と、"関係値の値"が保存されています。
初期状態では"関係値の値"は存在しません。
詳しくは、その④-EXEの使い方を参照してください。


・通常表示
通常表示では、従来のARToolKitとほぼ同様の処理を行っています。


・関係値の計算 : 関数 CalcAllMarkerRelate
キー操作により、編集モードに入ったときに、関係値の計算が行われます。
関数に入る前に、従来と同じ方法で、各マーカーの座標変換行列  "object.trans" が計算されます。

ここでマーカーA, Bが見つかったとします。
そのとき次のような計算を行います。

1.座標変換行列、"A→カメラ"と、"B→カメラ"、が分かっている。
2.1の"B→カメラ"を反転して、"カメラB"にする。
3.1と2から、"A→カメラB"という行列計算を行う。
4.3から"A → B"という座標変換行列を得る。

平均値計算用に、サンプル数と行列の合計値を、メンバ変数に蓄えておきます。

ある程度、サンプル数が溜まったら、上記と同じ方法で誤差を計算します。
これも、サンプル数と合計値の形で、持っておきます。


・計算結果を表示する
計算が大体終了したら、それを表示し、ユーザーに知らせます。
ユーザーはこの表示を見て、計算の頃合を計り、編集モードを終了します。

表示に使用される値は、マーカー関係情報の構造体"MARKER_RELATE_INFO"の、誤差の合計値"dError"や、サンプル数"lRelCount"を使用します。


・補完処理を加えた表示  : 関数 GetGLTransFromRelate
関係値が計算できても、マーカーを問題なく取得できた場合には、通常の描画を行います。
問題は、マーカー情報が正しく取得できなかった場合です。

例えば、マーカーAの情報が取得できず、マーカーBは取得できたとします。
その時は、以下のような計算になります。

1.座標変換行列 "A →B"と"B → カメラ" が分かっている
2.1より、" A → B → カメラ" という行列計算を行う
3.2の結果から、"A → カメラ" という座標系変換行列を得る

というような感じです。


・関係値の保存 : 関数 SaveMultiRelationInf
最後に関係値の保存を行います。
ファイルにデータとして保存してしまえば、時間使用時、又は他のプログラムでも再利用できます。
実行のたびに関係値を計算する手間を、省けるわけです。



更なる詳細については、プログラムを読んだり、デバック実行して、理解していただくか、
それでも分からない場合は、メールにてご連絡ください。
Readmeの詳細説明に必要なので、ソース公開前に書いておきます。
実行ファイルの使用方法です。


--- < とりあえず実行してみる > ---


0.GULTをインストール
 実行にはGLUTが必要です。

1.マーカーを印刷
 \patternsフォルダ内の、マーカーを印刷します。
 印刷できない場合は、ディスプレイにマーカーの画像を表示するだけでも、大丈夫です。

2.実行ファイルを起動
 \binフォルダ内の"MultiRelate1.0.exe"を実行します。
 設定ダイアログが出て、Webカメラから画像が表示されるはずです。

3.確認
 マーカー上に色のついた立方体が表示されるはずです。

4.編集モードにする
 キーボードの"E"キーを押して、編集モードにします。
 操作キーは、画像が映っているウィンドウを選択していないと、実行されません。

5.関係値のリセットを行う
 キーボードの"C"キーを押して、関係値をリセットします。

6.関係値を設定する
 できるだけ多くのマーカーが認識されるように、カメラを移動してください。
 そして表示が安定するまで、その場でカメラを動かさないようにしましょう。
 立方体の線が緑や黄色で安定したら、だいたい計算ができています。

7.全てのマーカーで、6の作業を行う
 6の作業を、全てのマーカーに対して行います。
 2つ以上のマーカーが認識されていないと意味がありません。

8.通常モードに戻す
 もう一度"E"キーを押して、通常モードに戻ります。

9.関係値の確認
 関係値が正しく計算できていれば、1つのマーカーの認識に失敗しても、他の成功したマーカーから補完されます。

10.保存する。
 "S"キーを押して、関係値の保存をします。
 プロンプト(文字しか表示されない、もう一つの黒い画面)に、保存ができたという旨の文章が表示されれば、完了です。
 再実行した時にも、保存された関係値を使用し、何度も計算する必要がなくなります。



--- < 使い方の詳細 > ---

○キー操作

・"E"キー:[編集モード]/[通常モード]への切り替えを行います。
・"C"キー:計算された関係値をリセットします。
・"S"キー:関係値を保存して、次回も使用できるようにします。
・"1~9"キー:1~9番の、マーカー上の3Dモデルの[表示]/[非表示]を切り替えます。
・"0"キー:全ての3Dモデルの[表示]/[非表示]を切り替えます。
・"R"キー:マーカー間の関係を表す線の[表示]/[非表示]を切り替えます。
・"M"キー:マーカー自体を表す、四角形の印の[表示]/[非表示]を切り替えます。
・"V"キー:現在表示されている3Dモデル間の関係値のみをリセットします。
・"T"キー:文字情報の[表示]/[非表示]を切り替えます。


○マーカー間の関係を表すファイル ”Data\MultiRelationInf.dat”
ファイルの内容は、概ね以下のようになっています。

#マーカーオブジェクトデータ
Data/multi/markerColor30_01_6.arobj

#マーカーの関係データがあるかどうか
1

#################################################################
#marker 1
#to 1
0
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000

#err
0
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
#Sum
-1.000000

#to 2
602
-601.079477 -6.103214 -29.765651 -224.731229
29.999639 -22.392234 -600.762449 -17661.005934
5.014032 -601.428488 22.542861 -21332.142015

#err
503
502.913258 -4.899541 2.086850 -469.029122
4.890394 502.880013 2.277454 -35.750323
-2.163808 -2.263550 502.959077 -328.080689
#Sum
4.299248

#to 3
    ・
    ・
    ・


最初に、複数のオブジェクトを記述したファイルのパスを書きます。
このファイルは既存のプロジェクト"loadMultiple"で使用されているのと、同じ形式なります。

自分で作ったマーカーを利用する場合には、この複数オブジェクトファイルの内容や、ここのパスを変更してください。

次に、マーカー間の関係値が事前に保存されているかを示すフラグが書かれています。
初期値は0になっていて、関係値を保存した後は1になります。
この値が0の場合は、後に関係値が続いていても読み込みません。

最後に、実際の関係値が書かれます。
ここに書かれる関係値は、
・全てのオブジェクトから全てのオブジェクトへの座標変換行列(サンプル数と合計値)
・その行列の誤差(サンプル数と合計値)
・誤差を合計した値
になります。見ての通り、非常に冗長です。

実際の関係は、各合計値をサンプル数で割った平均値が用いられます。
さて、いよいよソース公開の作業に入ります。
最初にGPLの詳細説明と、Readmeの作成についてです。

----------------------- < GPLの詳細 >
-----------------------

GPLについて、補足説明をさせていただきます。
自分がGPLについて、実際にどうソースを変更したかについてです。


○GPLの内容が書かれた文を配布ファイル内に入れる
ARToolKitにもともとあった"COPYING.txt"と、その日本語訳の文を、ファイルに付属しました。


○ファイルを変更した旨とその変更日とを、変更したファイル上に明確に表示すること。
これに関しては、従来のコメントの書き方で対応させていただきました。
ファイルの先頭のコメントで、以下のようなものを追加します。

/*******************************************************************************
 *
 * \file    object.h
 *
 * \brief    オブジェクトに関する情報と操作
 *
 * \date    08/02/02    PipeR    構造体にcf等の付加情報を追加しました
 *
*******************************************************************************/
又は、新規作成の場合は
/*******************************************************************************
 *
 * \file    MultiSetting01.c
 *
 * \brief    複数マーカー認識で用いる、
 * \brief    MultiMarkerInfoの設定ファイルを作成する
 *
 * \author    PipeR
 *
 * \date    08/02/02    PipeR    作成
 *
*******************************************************************************/
一番下の\dateで、「日付・名前・変更内容」を記述します。
コメントはDoxygen方式になっています。


○ソース内の著作権表示と無保証等の説明
追加したコメントは以下のような内容になります

/*******************************************************************************
 *
 *   Copyright (c) 2008 PipeR
 *
 *   The distribution policy is described in the file "COPYING.txt" furnished
 *    with this library.
 *
 *    本プログラムは、GNU 一般公有使用許諾に準拠します。
 *    利用も配布も商用利用も自由ですが、著作権は放棄しておりません。
 *    また、改変も自由ですが、GPLである以上、改変バージョンの配布を行う際には、
 *    ソースの公開は必須条件となりますので、ご注意下さい。
 *    GNU 一般公有使用許諾については、付属の"COPYING_JPN.txt"をご覧ください
 *
 *
 * 本プログラムはフリー・ソフトウェアです。あなたは、Free Software
 * Foundation が公表したGNU 一般公有使用許諾の「バージョン2」或い
 * はそれ以降の各バージョンの中からいずれかを選択し、そのバージョン
 * が定める条項に従って本プログラムを再頒布または変更することができ
 * ます。
 *
 * 本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特
 * 定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないま
 * せん。詳細についてはGNU 一般公有使用許諾書をお読みください。
 *
 * あなたは、本プログラムと一緒にGNU 一般公有使用許諾の写しを受け取っ
 * ているはずです。そうでない場合は、Free Software Foundation, Inc.,
 * 675 Mass Ave, Cambridge, MA 02139, USA * へ手紙を書いてください。
 *
 *    ----------------------------------------------------------------------
 *    * 【注意】 現在、このバージョン2の発行者(FSF)住所は、正式に新
 *     しい住所の 51 Franklin St, Fifth Floor, Boston, MA 02110-1301,
 *     USA に変わっている。
 *    ----------------------------------------------------------------------
 *
*******************************************************************************/
この内容は、GPLの日本語訳に従っています。


○実行ファイル内での、著作権・無保証等の表示
これも、GPLの日本語訳に従い、プログラム実行直後に以下のプログラムを実行

printf("ARToolKitの安定化プログラム Ver1.0 Copyright (c) 2008 PipeR\n");
printf("ARToolKitの安定化プログラム は完全に無保証です。詳細はOpenGLのウィンドウで\"G\"キーをタイプしてください。\n");
printf("これはフリー・ソフトウェアなので、特定の条件の下でこれを再頒布することができます。詳細は付属の\"COPYING.txt\"か\"COPYING_JPN.txt\"をご覧ください。\n");

もちろん、"G"キー押下時にも以下の文を加えます。

        printf("ARToolKitの安定化プログラム Ver1.0 Copyright (c) 2008 PipeR\n\n");
        printf("he distribution policy is described in the file \"COPYING.txt\" furnished with this library.\n\n");
        printf("本プログラムは、GNU 一般公有使用許諾に準拠します。利用も配布も商用利用も自由ですが、著作権は放棄しておりません。また、改変も自由ですが、GPLである以上、改変バージョンの配布を行う際には、ソースの公開は必須条件となりますので、ご注意下さい。GNU 一般公有使用許諾については、付属の\"COPYING_JPN.txt\"をご覧ください。\n\n");
        printf("本プログラムはフリー・ソフトウェアです。あなたは、Free Software Foundation が公表したGNU 一般公有使用許諾の「バージョン2」或いはそれ以降の各バージョンの中からいずれかを選択し、そのバージョンが定める条項に従って本プログラムを再頒布または変更することができます。\n\n");
        printf("本プログラムは有用とは思いますが、頒布にあたっては、市場性及び特定目的適合性についての暗黙の保証を含めて、いかなる保証も行ないません。詳細についてはGNU 一般公有使用許諾書をお読みください。\n\n");
        printf("あなたは、本プログラムと一緒にGNU 一般公有使用許諾の写しを受け取っているはずです。そうでない場合は、Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA * へ手紙を書いてください。\n\n");
        printf("* 【注意】 現在、このバージョン2の発行者(FSF)住所は、正式に新しい住所の 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA に変わっている。\n\n");




----------------------- < Readmeの作成 > -----------------------

次にReadmeの作成です。Readmeとはいわゆる「お読みください.txt」などの説明書のようなものです。

これには、Readmeファイルの作成支援ソフト「れ~どみ~えじた~」を使用しました。
これは、ウィザードと各種テンプレートを使い、Readmeを簡単に作成してくれるソフトです。


ここでは注意すべき点は少ないですね。

・[再配布]は「GPLに基づく」
・今回は、[必要ランタイム]に「GLUT」を入れました。
・現状では動作環境としてXP、開発環境はVC++ 2005しか試していないので、他の環境での動作、開発では不具合が出るかもしれません。

ぐらいでしょうか。



さて、現在ARToolKitのソースの公開に向けた準備を進めている最中ですが、
そこで避けては通れない問題があります。

GNU General Public License(以下GPL)の問題です。(wikipediaのGPL解説ページ



----- <GPLの大まかな説明> -----

ARToolKitのソースのライセンスは、このGPLになっています。
ここでは、GPLについて簡単な説明しかしないので、詳細については他のHPを参照ください。
また、"説明が間違っている"、とか"説明が足りない"部分もあるかもしれません。ご注意ください。

ということで、GPLを(誤解を恐れず簡単に)説明すると、以下のような内容になります。

「GPL付きのプログラムを変更し、再配布する場合は、必ず変更したソースコードも一緒に配布しなくていけない」



GPLでは、入手したプログラムを個人や社内"のみ"で使用している場合には、何の制限もありません。
また、プログラムを使用して書き出された出力結果についても、ほとんどの場合扱いは自由です。

しかし、その実行ファイルやソースを配布しようとした時には、いくつかの制限がつきます。
その1つが、改変したソースコードも必ず、全て公開しなくてはいけない、というものです。

もし、それらの制限が守れないのであれば、実行ファイルやソースの配布は絶対にできません。


ですが実際に、これらの制限をちゃんと守っている人がどれくらいいるのかは、ちょっと怪しいところです。
企業であれば、GPL違反は"ソースの公開又は配布の停止"という非常に重い罰則になるので、どこもGPLには気をつけているはずです。

しかし、個人で公開しているフリーウェア等の場合、"ソースの公開又は配布の停止だけ"という罰則は非常に軽いです。
しかも、ARToolKitのようなプログラムならまだしも、そのアプリがGPL違反かどうかなんて、実行ファイルだけでは普通分かりません。




という背景はありますが、僕自身は「規則だから」という問題は抜きにしても、GPLをちゃんと守ってソースを公開したいと思います。(まぁ理由は後で

さて長くなりましたが、では実際にARToolKitで作ったプログラムを公開する際に、注意すべきことを書いてみます。



----- <ARToolKitのGPLで、問題になるのは?> -----

・僕がARToolKitのプログラムをダウンロードし、プログラムを変更する 
→ ○問題ない
 公開しなければ、何も問題ありません。

・改変したプログラムを実行、その出力結果をWebに公開する 
→ △内容にもよるが、概ね問題ない
 実行結果で、ソース自体を出力しないのであれば、問題ありません。
 実行結果のみなら、動画を公開しても大丈夫です。

・もし、このプログラムの実行ファイルのみを、Webに公開したら 
→ ×GPL違反
 ソースの公開等の制限を実行するか、その旨の文章を入れないといけない。

・ARToolKitで使われている画像(マーカーパターンなど)を改変、公開 
→ △場合によりけり
 画像データ等がプログラムの一部として判断されるかは微妙です。
 しかしそうだとしても、僕の場合は改変した画像も既に公開されているので、問題はないと思います。(ソースも必ず完全公開しますし



----- <GPLに違反したら?> -----

上にも書いたように、少なくてもARToolKit(GNU GPL Ver2)の場合は、
ライセンスに書かれている制限(「ソースコードを公開する」又は「配布を停止する」、など)以外の罰則はないようです。



----- <実際に配布時に行わなければいけないこと> -----

これに関しては、GPLの日本語訳が分かりやすいです。
重要そうな所を一部、ARToolKitの例で説明しますと。

●ARToolKitを元に作られたプログラムを配布する時は、その変更箇所を全て公開しなくてはいけない。

●その時に、変更した旨とその変更日とを、そのファイル上に書かなくてはいけない。

●プログラム実行時に著作権等の注意事項を出力する。

●GPLのライセンスが書かれたテキスト(COPYING.txt)を、配布ファイルの中にも入れておくこと。
等々があります。詳しくは、上記リンクを参照してください。



----- <GPLはなんのためにあるのか?> -----

といったように、少し面倒なGPLですが、これにはちゃんと理由があります。

GPLの目的とは、「フリーウェアが誰かの手によって独占的に保持されるのを防ぎ、
ソースを共有することによって、フリーウェアを発展させていきましょう」というものです。

この考え方は、クリエイティブ・コモンズにも似ていますね。
コピーレフトというものらしいです。

ということで、僕はARToolKitがもっと発展してほしいと思っているので、GPLを推奨します。



----- <最後に> -----

何度も書かれているように、なにぶん僕も勉強不足な面があるので、間違ってたり、説明足らずな部分があると思います。
なのでGPLについては、ここを信用しないよう、ご自身でちゃんと調べてください。

また、そういった点があった場合、コメント等に指摘をいただけるとありがたいです。
GPLに関する質問については、答えられないかもしれないです。申し訳ないです。