Team for GR-PEACH Producer Meeting

USBカメラの動作

22 Jun 2015

USBHostC270_example_GR-PEACH を動かしてみました. C270を所有していないので,手持ちの iBuffalo の BSW20KM11 を使用しています. VIP/PIDのチェックを外して認識させています.

キャプチャはうまく出来ているのですが,半分近くの割合でサイズが2倍,3倍大きいファイルが出来ます. ファイルダンプで中のデータを見てみると,画像2~3枚分のJPEGデータが入っているような感じです. (main.cppのbufのサイズを大きくしています)

データでは中の1枚,2枚の画像の終わりと思われる位置に MARK_SOI があります. しかしその前に MARK_EOI はありません.

RZがMARK_EOI を取りこぼしているのか, それともカメラが出していないのか.

やはりカメラが違うからでしょうか. C270ではファイルサイズは一定していますか?

23 Jun 2015

解決しました.

カメラがEOIの0xffを2個出す事があります. おそらくデータの数を偶数個にするためかと思います.

23 Jun 2015

C270を使う場合に撮影サイズに制限は有りますか? 

USBHostC270 クラスを new するときの第2引数で撮影サイズを変更すると思いますが,私のカメラでは 

C270_160x120, 

C270_176x144 

は正常に撮影できます.しかし 

C270_320x176, 

C270_320x240 

にすると上半分だけになります. 

29 Jun 2015

main.cppの"buf"サイズが不足していないでしょうか?
C270ではmain.cppの"buf"サイズを増やすことで取得できました。

main.cpp

static uint8_t buf[1024*10];
↓
static uint8_t buf[1024*20];


また、C270ではC270_640x480などの大きなサイズで動作させようとした場合、EOIが来ないままSOIを受信することがあるようです。
この場合、先に取得していた画像の終端に新しい画像を追加しようとするので、正しいが画像が取得できず、ファイルサイズも大きくなってしまいます。以下のように、EOIが来ないままSOIを受信した場合はそれまでのデータを捨てて最初から解析しなおすようにすると改善しました。
BSW20KM11 でも同様な症状が発生しているようでしたらお試しください。

decodeMJPEG.cpp

void decodeMJPEG::input(uint8_t c)
{
    switch(m_seq) {
....omit....
        case SEQ_SOS2:
            if (c == 0x00) {
                outputJPEG(0xff);
                outputJPEG(0x00);
                m_seq = SEQ_SOS;
                break;
            } else if (c >= MARK_RST0 && c <= MARK_RST7) {
                outputJPEG(0xff);
                outputJPEG(c);
                m_seq = SEQ_SOS;
                break;
            } else if (c == MARK_EOI) {
                outputJPEG(0xff);
                outputJPEG(c, JPEG_END);
                m_seq = SEQ_INIT;
                break;
            } else if (c == MARK_SOI) {
#if(1) //Add
                outputJPEG(0xff, JPEG_START); // start
                outputJPEG(c);
                m_bDHT = false;
                m_seq = SEQ_FRAME;
#else
                outputJPEG(0xff);
                outputJPEG(c);
                m_seq = SEQ_INIT;
#endif
                break;
            }
            m_seq = SEQ_INIT;
            break;
        default:
            m_seq = SEQ_INIT;
            break;
    }
}


USBHostC270.cpp

/* virtual */ void USBHostC270::outputJPEG(uint8_t c, int status) { // from decodeMJPEG
....omit....
    if (_seq == SEQ_READ_EXEC) {
#if(1) //Add
        if (status == JPEG_START) {
            _pos = 0;
        }
#endif
        if (_pos < _size) {
            _buf[_pos++] = c;  
        }  
        if (status == JPEG_END) {
            _seq = SEQ_READ_DONE;
        }
    }
}
30 Jun 2015

レスありがとうございます. 前回のPミーティングでは色々教えていただきありがとうございました.

C270 では撮影できているという事で,BSW20KM11で条件を変えて試してみましたところ,画面が単調だと撮影できました. C270の方がJPEG圧縮率が高くてファイルサイズが小さいのかなという気がします.

ご指摘の main.cpp のバッファサイズは増量済みですので,USBの方のバッファサイズを増やしてみたいのですがどこを変えれば良いでしょうか?

EOIが来ないままSOIを受信することがあるようです。 この場合、先に取得していた画像の終端に新しい画像を追加しようとする

私の最初の投稿と同じ現象のように思います. C270でもEOIの0xffを複数出しているのではないでしょうか. JPEGの仕様です.

01 Jul 2015

カメラの出すデータにUSBの受信が追い付いていないように思えます.

それでカメラのフレームレートを下げてみたいので,main.cppの

USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_160x120, _5FPS); Logitech C270

の引数 「_5FPS」 を変更すれば良いように思ったのですが,私のカメラでは書換えてもフレームレートは変わりません. 1秒に10枚ほど出ている感じです.

もうC270を買うしかないかな..(;

02 Jul 2015

C270 を amazon で購入しました.

先ほど到着し,動かしてみたところ 320×240 でしっかり撮れています.

お騒がせしましたー.

07 Jul 2015

いや,C270でもカメラを向ける風景や明るさによっては全然駄目だ.使えない.