ラベル JPEG の投稿を表示しています。 すべての投稿を表示
ラベル JPEG の投稿を表示しています。 すべての投稿を表示

2013年1月28日月曜日

BaseJpegDecodeの修正

Logitech以外のJPEGパケットデータをBaseJpegDecodeでデコードしていると時々反応が無くなる時が以前からあった。
EOI以降にもデータを送ってくるらしく、偶然、マークが来たと解釈してセグメントの長さ分データをスキップしている為だった。SOIで開始するように修正したら、無反応になることは無くなった。
パケットが壊れている時もあろうから、厳密に各マークのセグメントの長さの妥当性を確認したほうがいいのかもしれない。

BaseJpegDecode - a mercurial repository | mbed

ついでにUSBのホストライブラリをuvchostからBaseUsbHostに切り替える。

SimpleJpegDecodeをテストしてみたら、なぜか、高周波成分がおそらく含まれている部分に白や黒のドットが現れる現象が出現した。文字や髪の毛のように大きく輝度や色差が変化するような部分の画像です。
なめらかな画像なら問題なく表示されるので、これはデバックが大変そう。
以前にSimpleJpegDecodeをテストしていた時は、まだaanIDCTに移行する前だったのでaanIDCTの移植に失敗したのかもしれない。

2012/10/31 - BaseJpegDecodeの修正

(追加)
python版は問題なく動いていたので調べてみたらaanIDCTの演算結果は8ビットに収まらない時があるようだった。
range_limitで-128から127に収めるように修正してみた。
BaseJpegDecode / source / — Bitbucket

(2013/1/28)
---

2012年11月15日木曜日

SimpleJpegDecode.pyの修正

画像幅が16の倍数でない場合に画像がずれて表示されてしまうのを修正しました。
横幅のMCUの個数の計算を間違えていました。

BaseJpegDecode - Python
BaseJpegDecode_example - C++/mbed

BaseJpegDecodeの説明

クラス変数(python)メンバ変数(C++)
width ピクセル幅
height ピクセル高さ
yblock MCU内の輝度のブロック数 4 または 2
qt[0] 量子化テーブル 輝度用
qt[1] 量子化テーブル 色差用

仮想メソッド 仮想メンバ関数
outputDC() DC成分の出力
outputAC() AC成分の出力
outputMARK() マーカーの出力

メソッド メンバ関数
input() JPEGデータの入力
clear() デコード処理の初期化

参考文献:
JPEG―概念からC++による実装まで (SOFTBANK BOOKS) ケイワーク (著)

(2012/11/15)
---

2012年11月4日日曜日

jidctfst.cについて

逆DCTを高速化してみようと、
libjpeg(jpeg-8d)のjidctfst.c を参考にしてPythonで書いてみた。
aanIDCT.py

3,4ドット目の計算結果が微妙に違う。

調べてみると jidctfst.c と jidctflt.c は同じアルゴリズムAANで実装しているのだが、違うところがあった。
jidctflt.cを参考にして描き直してみたら、正しい計算結果になった。

違っていた箇所:
libjpeg
jpeg-8d
jidctfst.c
jpeg_idct_ifast()
縦と横の計算でそれぞれ2箇所あります。
tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */
 ↓ 
   tmp10 = MULTIPLY(z12, - FIX_1_082392200) + z5; /* 2*(c2-c6) */

    tmp4 = tmp10 + tmp5;
 ↓ 
   tmp4 = tmp10 - tmp5;

スケールテーブル(dct_table)を作っているのは jddctmgr.c です。

(2012/11/4)
---

2012年10月31日水曜日

BaseJpegDecodeの修正

JPEGを数値表示だけでは気が付かなかったが、実際にBMP画像でカラー表示してみたら色差のDC計算がおかしいのがあったので修正する。Diff: BaseJpegDecode.cpp

Python版はBitBucketに置くようにした。Python2.7で動きます。
BaseJpegDecode



example_SimpleJpegDecode.cpp
C++/mbed版ではBMPを1枚での保存場所が難しいので、JPEGを分割してBMPで保存しています。

(2012/10/31)
---

2012年10月28日日曜日

逆DCTを試してみる

逆DCTを試してみたかったので、JPEGファイルをBMPファイルに輝度だけを変換するプログラムを書いてみた。
元来、ハフマン符号のデコードさえもPythonでは遅かったが、逆DCTを追加したら非常に遅くなってしまった。
本に載っていた計算式をそのまま実装したので、浮動小数点演算で、cos計算のテーブル引きも使わずに、
ひとつの画素を計算するのに8x8のループを回している。実際のところJPEGのAC成分の係数には0が
多く含まれているので計算はかなり省略可能なんだと思う。
もちろん、浮動小数点演算ではなくて、32ビット整数演算すれば速くなります。

jpeg2bmp.py
BaseJpegDecode.py

(2012/10/28)
---

2012年10月25日木曜日

JPEGのDQTセグメントについて

DQTセグメントを読み取って量子化テーブルを保存するようにした。
BaseJpegDecode - C++/mbed版
BaseJpegDecode.py - Python版

リアルタイムで表示してみたら、
LogitechC270は量子化テーブルの値は固定だが、
LifeCamVX700は量子化テーブルは画質(画像サイズを調整するために?)によって変化するみたい。
example4_c270.cpp

(2012/10/25)
---

2012年10月8日月曜日

Huffmanデコードのベンチマークテスト

ハフマン符号をテーブルで引くようにしたのが9msec~23msecです。
画像のサイズ160ドットx120ドット。1バイトあたり0.0058msecです。



BaseJpegDecode

(2012/10/8)
---

2012年10月7日日曜日

USBカメラとmbedで簡易カラートラッキング



上の写真のようにUSBカメラで撮影したJPEGデータをリアルタイムでハフマン符号だけをデコードしながら、
MCU(16ドットx8ドット)のDC成分のCr赤色の色差から赤色の中心(重心)を計算しています。
example1_c270.cpp



デバッグのためにターミナルソフトに撮影データを数値表示しています。
赤色が数値が高いのがわかります。左下のred:(9,10)が中心の値です。

現在のプログラムではハフマン符号をシーケンシャルサーチしています。
HuffmanDecode.cpp
ワーストケースでデコードが間に合うのかテストしてないが、
ハフマン符号の出現確率によって、なんとか間に合っているのかもしれない。
ROM容量はぜんぜん余裕があるのでテーブルで引くようにした方がいいだろう。

(2012/10/7)

BaseJpegDecodeをライブラリ化する都合上、旧リポジトリを削除しました。
ライブラリ:BaseJpegDecode
使用例:BaseJpegDecode_example

(2012/10/22)
---

2012年10月3日水曜日

USBカメラのモーションJPEGのMCUの構成

Windows7のペイントで作ったJPEGファイルは、
水平サンプリングファクタ2、垂直サンプリングファクタ2 だが、
USBカメラの LifecamVX-700 LogitechC270 のモーションJPEGでは、
水平サンプリングファクタ2、垂直サンプリングファクタ1 だった。
つまりMCUのサイズは16ドットx8ドットです。

LogitechC270にはリスタートマークRSTがあります。

BaseJpegDecode.py

(1012/10/3)
---

2012年9月9日日曜日

JPEGからDHTセグメントを削除するプログラム

Windows7でGoogle ChromeはJPEGファイルのDHTセグメントが無くても表示できるが、IEでは表示できない。
Google製のPicasaでも表示できない。もちろんペイントでも表示できない。



mbedでUVCカメラを扱うプログラムを作成していた時に、なぜかロジクールのカメラだけ表示出来ない事に気がついた。調べてみるとロジクールのカメラから送られて来るモーションJPEGはDHTセグメントは付いていない。

表示できるようにJPEGファイルを変換する(DHTを付加する)Webサービスを作ろうと考えて、
アップロードしたファイルを出力するだけのプログラムを作ったら、Chromeだけ表示できる事がわかった。

最近、WebcamServerが表示できないという苦情が来た。ロジクールのカメラの場合はChromeを使えばいいと考えて
DHTはあえて付加していなかった。Chromeを使うようにお願いしても表示できない、MacのChromeらしい。
WebcamServer側でDHTを付加するように修正したら表示できると報告されたので、WindowsとMacではChromeの
仕様は違うのかもしれない。

サイト:http://va009039-mbed.appspot.com/jpeg/DHTstrip/

ソースコード:jpeg_DHTstrip.py
---