FC2カウンター FPGAの部屋 ZedBoard Linux上でカメラの画像を処理する3(ラプラシアンフィルタ1)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZedBoard Linux上でカメラの画像を処理する3(ラプラシアンフィルタ1)

ラプラシアンフィルタを実行するCのソフトウェア(Laplacian_Filter.c)を作製した。動作を下に示す。(現在使用しているのはSDK14.4)

1.カメラの画像データを書き込んでいるフレーム・バッファからピクセルデータを読み込む。
2.ピクセルデータは上位ビットから{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bitsとなっている。
3.輝度成分をラプラシアンフィルタに掛けるためにRGBからY(輝度成分)を計算する。(int conv_rgb2y(int rgb))
4.9個のデータを集めて、ラプラシアンフィルタに通す。(laplacian_fil())
5.次のフレーム・バッファに当該位置に書き込む。
6.1フレーム分のラプラシアン・フィルタリングが終了したら、フレーム・バッファを次のバッファ領域に移してラプラシアンフィルタが掛かったデータを表示する。


このソフトウェアを実行すると、ラプラシアン・フィルタが掛かった画像が表示されるはずだ(まだ確かめていない)。このソフトウェアを実行すると、生のカメラの画像に戻ることが出来ない。そのため、元のカメラの画像に戻すソフトウェアを作製した。return_camera_view.c だ。
久しぶりにSDKでCプロジェクトを作製したので、Linux用のテンプレートを選べそこねて、standaloneを選んでしまったので、コンパイルできずに困ってしまった。Linux用のCプロジェクトの作り方を書いておく。

FileメニューからNew -> Application Project...を選択して、ダイアログが開いたところだ。
Target Software -> OS Platform を standalone から linux に変更する。
image_process_Zed_linux_3_130917.png

これで、インクルード・ファイルでエラーが出ることが無くなる。

早速、ラプラシアン・フィルタを試してみよう。例によって、SDKリモートデバッグでラプラシアン・フィルタのプログラムをZedBoard Linuxにアップロードして実行してみよう。おっと、その前に新しい cam_disp3_linux.elf をまだSDカードに書いてないので、 cam_disp3_linux.elf を実行しておく必要がある。

cam_disp3_linux.elf 実行後。/Apps ディレクトリに fb_start_addr.txt ができている。その中には、VGA画面にカメラ画像を出力するために使用してるDDR3 SDRAMのスタートアドレスが入ってる。
image_process_Zed_linux_4_130918.png

これで、ラプラシアン・フィルタのソフトウェアの実行環境が整ったので、実行してみよう。
SDKによるリモートデバッグのやり方は、”ZedBoard Linux のフレームバッファにカメラ画像を表示9(SDKリモートデバック)”を参照した。

やはり前回もそうだったが、fopen()するとSDKリモートデバッグで、実行がタイムアウトしてしまう。fopen()は使わないほうが良いかもしれない?下に fopen() を使ったCのコードを示す。

    // fb_start_addr.txt を開く
    if ((fd = fopen("/Apps/fb_start_addr.txt""rt")) == NULL){
        fprintf(stderr, "Can't Open /Apps/fb_start_addr.txt\n");
        exit(1);
    }
    fscanf(fd, "%x", fb_addr);
    fclose(fd);


Laplacian_Filter.c を open()を使って書き換えた。下にCのコードを示す。

    // fb_start_addr.txt を開く
    if ((rfile = open("fb_start_addr.txt", O_RDONLY)) == -1){
        fprintf(stderr, "Can't Open /Apps/fb_start_addr.txt\n");
        exit(1);
    }
    read_bytes = read(rfile, buf, 8);
    *(buf+read_bytes) = NULL;
    close(rfile);


やはり、open() を使用しても実行がタイムアウトしてしまう。仕方がないので、popen()にしてみたが、やはりSDKリモートデバッグ時にタイムアウトしてしまう。popen() のコードを下に示す。

    // fb_start_addr.txt を開く
    memset(buf, '\0'sizeof(buf)); // buf すべてに\0 を入れる
    // fb_start_addr.txt の内容をパイプに入れる
    fd = popen("cat /Apps/fb_start_addr.txt""r");
    sscanf(buf, "%x", &fb_addr);
    pclose(fd);


SDKの画面を下に示す。
image_process_Zed_linux_5_130918.png

(2012/09/20:追記)
SDK14.6 だとラプラシアン・フィルタのプログラムのデバックができるようです。”ZedBoard Linux上でカメラの画像を処理する4(ラプラシアンフィルタ2)”参照。
  1. 2013年09月18日 05:35 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/2591-973b1827
この記事にトラックバックする(FC2ブログユーザー)