目的のカメラをサポートするためのlibdc1394ライブラリの変更

フリーソフトウェアに関しては、長所の1つは自分でコードを変更できることです。 個人的には、エンドユーザーはこの可能性についてあまり気にしていないように思えます。 そして、それはプログラミングスキルの不足だけでなく、これが可能であるという単純な理解の欠如でもあります。



この記事では、 libdc1394ライブラリを自分用に、または作業用のカメラ用に「仕上げ」た経験を簡単に説明します。 この記事は、サードパーティのライブラリで何も編集したことがない人や、Linuxでファイヤーワイヤーカメラを扱う必要のある人にとって興味深いものになると思います。



お祝いの犯人はFlir赤外線カメラA40です。 カメラは、IEEE 1394インターフェイス(以降、ファイヤーワイヤー)を介してコンピューターに接続されます。 製造元はWindows用のドライバーを提供していますが、Linuxはサポートしていません。 コンピューターに接続すると、カメラがシステムから「見える」ようになりますが、低レベルでしか操作できません。



libdc1394ライブラリは、Linuxでカメラを操作するための高レベルの機能を提供し、IIDC / DCAM仕様に準拠するカメラをサポートします。 このライブラリを使用して、カメラで動作する多くのプログラムが作成されています。 接続されたA40カメラを「表示しない」のは、このライブラリです。 したがって、最初のタスクは症状と可能性を識別することです。 カメラについて何を学ぶことができますか?



カメラが仕様に準拠しているかどうかを確認することは論理的です。 そして、図書館を信頼せず、自分でやることが最善です。 これには、 gscanbusプログラムと仕様テキストが使用されます。 まず、カメラとメーカーの名前をROMから読み取ろうとしました。 ROM内の情報は、32ビットのブロック、つまりクワッドレット(4バイト)に格納されます。 アドレスオフセットもクワッドレットで示されます。 最初は、これは紛らわしいです。 たとえば、オフセットであるaの値を読み取った場合、それをgscanbusプログラムに適用するには、ベースアドレスに値4 * aを追加する必要があります。



カメラとメーカーの名前を正常に読み取った後、カメラが何らかの形でIIDC 1.30仕様を満たしていることが明らかになりました。 そして、ここで論理的な疑問が生じます-なぜ、libdc1394ライブラリはこのカメラで動作できないのですか? 仕様では、いくつかの正確な値を定義しています。 これらの値は、コンピューターに接続されているカメラを反復処理するときにlibdc1394ライブラリによってチェックされます。 これらの値の1つはunit_spec_IDで、0x00A02Dです。 カメラA40 unit_spec_IDは0x407Fです。 これを知っているプログラマは、ライブラリ内のチェックされた状態を変更する必要があり、接続されたカメラがすでに表示されています。



サポートされている形式を使用して、同様の調査手順が実行されます。 ベースカメラは、サポートされている形式ではゼロを、サポートされていない形式ではエラーを返しました。 仕様上、ゼロはサポートの欠如を示します。



すべてのif'ofを変更した後、写真が来ているが、「壊れている」ことが判明しました。

赤外線カメラからの壊れた画像



知人とGoogleの調査は、私を助けてくれませんでした。 Linuxでファイヤーワイヤーカメラを使用することは、あまり一般的なトピックではありません。 Linuxで1台のコンピューターでこのカメラがどのように機能するかを確認したことを付け加える価値があります。 残念ながら、私はそれにアクセスできず、構成を比較できず、車輪を再発明しなければなりませんでした。 しかし、私は自転車を発明することが可能であり、自転車に乗ることができると確信していました!



この段階で、ソースコードに基づいてlibdc1394の動作を詳細に調査する必要がありました。 ある時点で、カメラから受信したパケットのサイズに注意を払ったか、16進エディターで結果の画像の内容を覗き込んで何かを疑い、パケットサイズに切り替えました。 カメラは、画像データ自体に加えて、さらに40バイトを送信することが判明しました。 その瞬間、すべてが明らかになりました。 ユーザーにフレームを送信する前に、フレームを構成するパケットを調べ、各パケットから余分な40バイトを削除し、すべてをまとめる必要があります。 その結果、画像が取得されます。

正しい赤外線画像



コード片で特定の実装を説明したい人を送ります 。 Habrのポリシーは他の情報源の資料の転載を歓迎していませんが、英語で書いたこの記事とは異なるテキストは参照によるものです。



残念ながら、libdc1394ライブラリの開発者は、仕様に完全に準拠していないカメラをサポートしたくありません。 公式コードに変更を追加するという私の提案は無視されました。 そして、これは、ライブラリの新しいバージョンがリリースされると、そのインターフェイスが劇的に変わる可能性があり、カメラのサポートを再導入する必要があることを意味します。



結論として、仕様と標準に従わないメーカーに「fi」を表現したいと思います。 また、Linuxでビデオを操作する際に問題に直面したすべての人に幸運を祈ります。 カメラが「見つからない」場合、libdc1394ライブラリに変更を加えた後でもカメラを操作できる可能性があることに注意してください。



UPD。 「Linux for all」に移動しました。



UPD 1.信頼できるスイスのホスティングOrigoが長生きするように命じられました。 残念ながら、元のWikiページは保存されませんでしたが、libdc1394-flirパッチはgithubに投稿されました



All Articles