ここから本文です
普通のソフトウェアエンジニアが、半田ごて片手に組込み機器にチャレンジします。

書庫SH-2A

記事検索
検索

全12ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]

カメラ映像のJpeg化

ご要望があるようなので、T-SRSでJPEGファイル化のプロジェクトをダウンロードできるようにしました。ダウンロードページからは、T-SRSのカメラ映像のJpeg化を選択してください。

T-SRSに接続されたカメラ映像を、IJGのJpeglibを利用してSDカードに保存します。今回のダウンロードサンプルでは、映像をSDカードに保存し、そのSDカードのデータ読み込んでLCDに表示します。無駄な処理ですが、応用に使えると思います。また、SDカードだけでなく、内部メモリー上に圧縮データ作成したり、メモリから展開することも可能です。

■メインループの処理です。
/*--- ループ ---*/
while(1)
{
{
char fname[12];
int sz;

create_filename(fname, count++);
compless_jpeg_to_file(fname, 50);

expand_jpeg(fname, 0);

Cpu_Wait1ms(5000);
}
}

compless_jpeg_to_file関数が、SDカードに映像をJPEG圧縮保存する処理で、引数の50は圧縮率です。
expand_jpeg関数が、SDカードからJPEGデータを読み込み、LCDに表示します。
下記の画像が、圧縮率50で保存した画像です。JPEGなので画質はこんなもんでしょう。

イメージ 1

ソースコードの一部は、Interface2011/2月号の記事を利用しています。

『技術解説 SH-2A基板とLCD拡張ボードの組み合わせで実現するオープン・ソースJPEGデコーダを活用したフォト・フレームの製作』のJPEG展開処理を参考にしています。この記事のコードは、ここからダウンロードできます。

JPEG保存の処理

ryoさんからの質問で、SH-2Aでjpeglibを利用して画像を圧縮したい!ということですが、コメントに文字制限があり、貼れなかったので本文に。

私の場合、以下のような関数を作り保存しています。どうでしょうか?ヒントになりますか?
これは、Toファイルですが、Toメモリも作りました。(まあ同じでしょうが・・)
ただし、私の場合、外部の拡張RAMでJPEG圧縮処理を行っています。
(ガイガーばかりで、忘れていましたが、これを整理しようと思ってたんですよね。時間ができたら整理します。)

int compless_jpeg_to_file(char *fname, int quality)
{
struct jpeg_compress_struct cinfo; // 圧縮ファイル
struct jpeg_error_mgr jerr;
unsigned char* pBuff = NULL;
unsigned long size = 0;
int row_stride = 0;

FRESULT result;
UINT cnt;
FIL File; /* ファイルオブジェクト */

memset(&cinfo, 0x00, sizeof(cinfo));

// JPEGオブジェクトの生成
cinfo.err = jpeg_jsp_error(&jerr);
jpeg_create_compress(&cinfo);

// ファイルへの出力
result = f_open(&File, fname, FA_CREATE_ALWAYS|FA_WRITE);

// 出力先をファイル指定
jpeg_stdio_dest( &cinfo, &File );

cinfo.image_width = 320;
cinfo.image_height = 240;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;

jpeg_set_defaults( &cinfo );

// Jpeg画質設定
jpeg_set_quality(&cinfo, quality, TRUE);

// エンコード開始
jpeg_start_compress(&cinfo, TRUE);

// 1ラインごとに処理する。
{
volatile JSAMPARRAY buffer;
volatile JSAMPROW row;
volatile JSAMPLE img[320][3];
volatile _UWORD* p = (_UWORD*)RAM_EXT_TFT_SAVE;
int i, j;

row = (JSAMPROW)&img[0][0];
buffer = (JSAMPARRAY)&row;

for(i = 0 ; i < 240 ; i++)
{
for(j = 0 ; j < 320 ; j++)
{
img[j][0] = (_UBYTE)(((*p >> 8) & 0x00F8)); // R
img[j][1] = (_UBYTE)(((*p >> 3) & 0x00FC)); // G
img[j][2] = (_UBYTE)(((*p << 3) & 0x00F8)); // B
p++;
}

jpeg_write_scanlines( &cinfo, buffer, 1);
}
}

// 終了
jpeg_finish_compress( &cinfo );

// Jpegオブジェクト破棄
jpeg_destroy_compress( &cinfo );

// ファイルを閉じる
f_close(&File);

return 0;
}

また、SH-2A基板を利用したカメラ画像ネタですが、SDカードにJPEG保存できるようになりました。
もちろん、JPEG保存には、IJGのJpeglibを利用させていただいております。

Jpegの読み込みは、Interfaceの2011/02号でJpeglibを利用してやっていますが、残念ながら読み込みだけです。(まあ、フォトフレームに書き込みは必要無いですからね。)なので、読み込みだけでなく、カメラ映像をJPEGでキャプチャーして、SDカードに保存するようにしました。

今回も、ベースは、T-SRSです。

イメージ 1

ちょっとソースコードは汚いので、整理できたら公開するかも。
あと、HEWの制限が256KByteまでなので、FatFs+Jpeglibを入れるとかなりでかいので、少し工夫が必要になります。そろそろGCCかな・・・また、外部RAMも必須ですね。(T-SRSは付いてますけど)
これをさらに応用していくと、IPカメラができちゃいますね。W5300も付いているし、いっそのことモーションJPEGで作るか?(調べないといけませんが・・・)

でも、まだ保存時間や、処理時間を計っていないので、IPカメラに使える速度なのかな?。最低でも15fps程度は欲しいですね。

ちなみに、以下は、Jpegの品質を10、50、100で出力したもの。
50と100の差はそれほどでも無いかな?でも出力したファイルサイズが50と100ではかなり異なっていたので、50の勝利かな?

イメージ 2 品質:10
イメージ 3 品質:50
イメージ 4 品質:100

Interface2010の付録基板SH-2Aを利用した拡張基板(T-SRS)でNTSCの映像をTFT液晶ディスプレイに表示するだけのコード(HEW形式)をアップしました。いままで、いろいろ作ったコードはあったので、それを整理し、単純なコードにしたので、カメラの映像表示を行う方は、参考になるかもしれません。
本コードを拡張することで、こちらの動画のようなことができます。

イメージ 1

メインの処理だけ貼っておきます。映像サイズと、映像の表示位置の変更が行えるだけです。
映像サイズは、大(0)、中(1)、小(2)の3段階が選択できます。

void main(void)
{
// CPU初期化
Cpu_Init();

// LEDポート初期化
Led_Init();

// カメラの初期化
Camera_Init();

// LCDコントローラの初期化
Lcd_Init();

// グラフィック部の初期化
Graphics_Init();

// カメラ画像ON
Camera_SetupInputOutput(CAMERA_INPUT_ON);

// 基板上のLED点灯
Led_On();

// 割り込み有効(サンプルでは関係がない)
// set_imask( 0 );

// ■映像サイズ指定
Camera_SetInputSize(0);

// ■映像表示位置指定
Camera_SetPos(64, 16);

/*--- ループ ---*/
while(1)
{
}
}

■ビデオ端子に、好きなソースを接続します。(ビデオカメラでも、PS2でもWiiでもNTSC信号ならば何でもOK)
イメージ 2

■何も接続しないと、ブルースクリーン。(信号を検出すると、映像が出ます。)
イメージ 3


作品を見て頂ける機会を与えていただけことに感謝するとともに、見てくださった方ありがとうございました。

イメージ 1
※当日の写真がないので、撮影済みのキャプチャー画面です。

展示してみて、お子様方には少しだけ喜んでもらえたようで、嬉しかったです。特に、最後まで夢中に遊んでくれた「あの子」がいただけで非常にうれしいです。一人だけでも喜ばせることができたと感じられたことに喜びを得ました。(ありがとう。あの子)

残念なことに、展示説明のことで頭がいっぱいで、写真も一枚も撮らずに帰ってきてしまいました。
本当は、はやぶさ講演を見るために早く出かけたのですが、セッティングに時間がかかり、全然みれませんでした。うん・・・・・残念。

■反省点
・周囲の方々の素晴らしい展示も見たかったのですが、結局自分のことだけで精一杯で、何もできなかった。
・作品がエレキジャック向き?じゃないので、メカニカルな動きがないと周囲に圧倒されてしまう。(私には、その辺の才能がないので、仕方ないですが・・・)
・説明なしでも、直観的に遊べる(操作できる)ような工夫が必要だったかな?(「ここに手をかざして!⇒」みたいなポップを表示しておくとか)

構想だけですが、子供むけに、USBカメラを利用してパソコンで遊べるようなじゃんけんアプリを作ってみるのも楽しいかと思いました。for Windowsです。USBカメラを持っていないので、ちょっと調べてから考えてみよう。そうなると、Open CVの利用も考えてみるかな?

やっと、足にたまった乳酸が減ってきたようですし、みなさんから元気もらったので、明日からもがんばれそうです。お疲れさまでした、そしてありがとう。

全12ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]

本文はここまでですこのページの先頭へ
みんなの更新記事