ARToolkit for 64bit Linux and YUV422 patch

64bit Linux + YUV422 CameraでARToolkitを動かす。

最新版ARToolKit対応のV4L2用のパッチ作った
を拡張したパッチを作成。
http://staff.aist.go.jp/k.kojima/artoolkit/artk-yuv422-v4l2-2.72.1.20090801.patch

動作環境
Debian:linux-image-2.6.26-2-amd64
camera:Princeton PWC-130UAFS

手順:
v4l-info | grep YUVで、

description             : "YUV 4:2:2 (YUYV)"

となることを確認。
これでない場合は、動作しないと思います。
patchをARToolkitと同じディレクトリにコピー。
パッチの47行のinclude pathは環境に合わせて変更して下さい。

$ patch -p0 -d . < artk-yuv422-v4l2-2.72.1.20090801.patch
  1. ./Configureの実行。
  2. Select a video capture driver. 3.
  3. Color conversion should use x86 assembly (not working for 64bit)? n。
  4. 以下、環境に合わせて選択。
  5. makeの実行。
  6. cd bin
  7. ./simpleTest

以上。

patch作成前の症状。

  • V4L2のパッチを当てた場合。Color conversion should use x86 assembly (not working for 64bit)?でyを選択したとき
ccvt_i386.S: Assembler messages:
ccvt_i386.S:249: Error: suffix or operands invalid for `push'

アセンブルのエラー。

  • Color conversion should use x86 assembly (not working for 64bit)?でnを選択したとき
../../lib/libARvideo.a(video.o): In function `ar2VideoGetImage':
/home/kojima/sdk/ARToolKit/lib/SRC/VideoLinuxV4L2/video.c:723: undefined reference to `ccvt_yuyv_rgb24'
collect2: ld returned 1 exit status

lib/SRC/VideoLinuxV4L2/video.cで呼び出されているccvt_yuyv_rgb24が無いと言われる。
このような症状の方は、パッチを試して下さい。
新たに作成したパッチでは、このccvt_yuyv_rgb24を作成しました。

原因について

usbカメラ画像データフォーマットは、YUV444, YUV422, YUV420など様々あります。
詳しくは、http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.htmlを参照。
V4L2用パッチでは、このうちYUV420のみに対応している。ただし、ccvt_i386.Sではアセンブルコードで各種対応していますが、64bit Linuxではコンパイルできないようです。

 所有のカメラが、YUV422対応であったため(v4l-info | grep YUVで確認)、ccvt_yuyv_rgb24が呼び出されるが、V4L2パッチでは実体が無いのがエラーの原因。そこで、YUV422のデータフォーマットを、http://son-son.sakura.ne.jp/programming/macosx_seesaw.htmlを参考に、ccvt_yuyv_rgb24を作成。
ただし、データフォーマットは参考ページの

U01,Y0,V01,Y1

ではなく

Y0,U01,Y1,V01

であった。

v4l-info  | grep palette

でデータ配列内の順序が分かるみたい。

その他のデータフォーマットの場合

コンパイルエラーや、写ったけど画像が変、Segmentation Faultを起こす場合は、データフォーマットを調べ、RGB変換関数を作成してみるといいかも。