FC2カウンター FPGAの部屋 FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)

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

FPGAの部屋

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

FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)

FASTX コーナー検出の改良2(threshold をソフトウェアで変更可能にする)”の続き。

前回は、Vivado HLS 2016.1 でC コードの合成とIP へのパッケージを行った。今回は、その threshold を変更できるFASTX コーナー検出IP をカメラ表示システムに組み込んで、ZYBO にダウンロードしてやってみた。

threshold を変更できるFASTX コーナー検出IP を組み込んだ、Vivado 2016.1 のプロジェクトを示す。もう、ビットストリームの生成まで済んでいる。
Vivado_HLS_OpenCV_123_160423.png

Summary を示す。タイミング制約も満足している。
Vivado_HLS_OpenCV_124_160423.png

ハードウェアをエクスポートして、SDKを立ち上げた。
Vivado_HLS_OpenCV_125_160423.png

fastx_on_serial.c を作製した。下にソースコードを示す。

// fastx_on_serial.c
// 2016/04/13 by marsee
//
// Refered to http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2014_4/ug902-vivado-high-level-synthesis.pdf
//
// 2016/04/21 : threshold をシリアル経由で入力する
//

#include <stdio.h>
#include "ximage_filter.h"
#include "xparameters.h"

int main(){
    XImage_filter Ximage_filter;
    XImage_filter_Config *Ximage_filterPtr;
    int threshold;

    // Look Up the device configuration
    Ximage_filterPtr = XImage_filter_LookupConfig(0);
    if (!Ximage_filterPtr){
        fprintf(stderr, "XImage_filter configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XImage_filter_CfgInitialize(&Ximage_filter, Ximage_filterPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XImage_filter\n");
        return(-1);
    }

    // image_filter rows, cols set
    XImage_filter_Set_cols(&Ximage_filter, (u32)800);
    XImage_filter_Set_rows(&Ximage_filter, (u32)600);

    // first shreshold set
    printf("\n\rfirst threshold = ");
    scanf("%d", &threshold);
    XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);

    // axis_switch_1, 1to2 ,Select M01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // fastx filter AXIS Start
    XImage_filter_Start(&Ximage_filter);
    XImage_filter_EnableAutoRestart(&Ximage_filter);

    // axis_switch_0, 2to1, Select S01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x1);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    // threshold set
    while(1){
        printf("\n\rthreshold = ");
        scanf("%d", &threshold);
        if (threshold == 999)
            break;
        
        XImage_filter_Set_threshold(&Ximage_filter, (u32)threshold);
    }

    return(0);
}


Tera Term を起動して、ZYBO とシリアル経由で接続した。シリアルの設定は 115200 bps, 8 bits, 1 stop bit, local echo にした。
Vivado_HLS_OpenCV_126_160423.png

いろいろと threshold を変更してやってみた。999 を入力するとアプリケーションが終了する。

threshold = 2 の場合の画像を下に示す。
Vivado_HLS_OpenCV_127_160423.jpg

threshold = 5 の場合
Vivado_HLS_OpenCV_128_160423.jpg

threshold = 10 の場合
Vivado_HLS_OpenCV_129_160423.jpg

threshold = 20 の場合
Vivado_HLS_OpenCV_130_160423.jpg

threshold = 40 の場合
Vivado_HLS_OpenCV_131_160423.jpg

threshold = 60 の場合
Vivado_HLS_OpenCV_132_160423.jpg

threshold = 80 の場合
Vivado_HLS_OpenCV_133_160423.jpg

このように、FASTX コーナー検出を threshold を変更して、リアルタイムに 行うことができた。但し、残念だが今のところのカメラの fps は 5 fps だ。回路を変更して、15 fps にしたいと思う。

FASTX コーナー検出IP は 280 MHz まで動作するというレポートが出ているので、HD 解像度の 148.5 MHz も問題なくできると思う。そのようにすればHD解像度で、60 fps のFASTX コーナー検出ができると思う。
  1. 2016年04月23日 04:31 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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