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
- ./Configureの実行。
- Select a video capture driver. 3.
- Color conversion should use x86 assembly (not working for 64bit)? n。
- 以下、環境に合わせて選択。
- makeの実行。
- cd bin
- ./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変換関数を作成してみるといいかも。