FC2カウンター FPGAの部屋 Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する2
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する2

Vivado HLS 2019.2 の HLS Video Library を使用して resize() を実装する1”の続きと言うか修正版。

前回、カラーの画像をカラーで縮小する HLS Video Library の resize のソースコードを貼ったが、”Vivado HLS 2019.2 で xfOpenCV を使用する6(resize 1)”でも、カラーの画像を白黒画像に縮小する resize だったので、今回は、同様に、カラーの画像を白黒画像に縮小する resize のソースコードを貼る。
以前書いたブログの”Vivado HLS で画像のサイズを縮小して白黒変換(resize_gray)”のソースコードそのものなのだが、いろいろな解像度でうまく行くか?を確かめるために、多少変更した。

resize_gray.h を示す。

// resize.h
// 2020/03/04 by marsee

#ifndef __RESIZE_GRAY_H__
#define __RESIZE_GRAY_H__

#include "ap_axi_sdata.h"
#include "hls_video.h"

#define ORG_HEIGHT   600
#define ORG_WIDTH    800

typedef hls::stream<ap_axiu<32,1,1,1> > AXI_STREAM;
typedef hls::Mat<ORG_HEIGHT, ORG_WIDTH, HLS_8UC3> RGB_IMAGE;
typedef hls::Mat<ORG_HEIGHT, ORG_WIDTH, HLS_8UC1> GRAY_IMAGE;

#define RESIZE_HEIGHT 45
#define RESIZE_WIDTH 60

#endif


resize_gray.cpp を示す。

// resize_gray.cpp
// 2017/08/31 by marsee
// 2020/03/04 : Changed source code.
//

#include "resize_gray.h"

int resize_gray(AXI_STREAM& ins, AXI_STREAM& outs){
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE axis register both port=ins
#pragma HLS DATAFLOW
#pragma HLS INTERFACE s_axilite port=return

    RGB_IMAGE org_img(ORG_HEIGHT, ORG_WIDTH);
    GRAY_IMAGE org_img_g(ORG_HEIGHT, ORG_WIDTH);
    GRAY_IMAGE resize_img_g(RESIZE_HEIGHT, RESIZE_WIDTH);
    RGB_IMAGE resize_img(RESIZE_HEIGHT, RESIZE_WIDTH);

    hls::AXIvideo2Mat(ins, org_img);
    hls::CvtColor<HLS_BGR2GRAY>(org_img, org_img_g);
    hls::Resize(org_img_g, resize_img_g);
    hls::CvtColor<HLS_GRAY2BGR>(resize_img_g, resize_img);
    hls::Mat2AXIvideo(resize_img, outs);

    return(0);
}


resize_gray_tb.cpp を示す。

// resize_gray_tb.cpp
// 2017/08/31 by marsee
// 2020/03/04 : Changed source code.
//

#include <iostream>
#include "hls_opencv.h"
#include "resize_gray.h"

using namespace cv;

#define INPUT_IMAGE        "straight0.bmp"
#define OUTPUT_IMAGE    "test_straight0.bmp"
#define OUTPUT_IMAGE_CV    "test_straight0_cv.bmp"

void resize_gray(AXI_STREAM& ins, AXI_STREAM& outs);
void opencv_resize_gray(Mat& src, Mat& dst);

int main (int argc, char** argv) {
    // OpenCV で 画像を読み込む
    Mat src = imread(INPUT_IMAGE);
    AXI_STREAM src_axi, dst_axi;

    // Mat フォーマットから AXI4 Stream へ変換
    cvMat2AXIvideo(src, src_axi);

    // resize_gray() 関数をコール
    resize_gray(src_axi, dst_axi);

    // AXI4 Stream から Mat フォーマットへ変換
    // dst は宣言時にサイズとカラー・フォーマットを定義する必要がある
    Mat dst(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC3);
    AXIvideo2cvMat(dst_axi, dst);

    // Mat フォーマットからファイルに書き込み
    imwrite(OUTPUT_IMAGE, dst);

    // opencv_resize_gray() をコール
    Mat dst_cv(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC3);
    opencv_resize_gray(src, dst_cv);
    imwrite(OUTPUT_IMAGE_CV, dst_cv);

    // dst と dst_cv が同じ画像かどうか?比較する
    for (int y=0; y<RESIZE_HEIGHT; y++){
        Vec3b* dst_ptr = dst.ptr<Vec3b>(y);
        Vec3b* dst_cv_ptr = dst_cv.ptr<Vec3b>(y);
        for (int x=0; x<RESIZE_WIDTH; x++){
            Vec3b dst_bgr = dst_ptr[x];
            Vec3b dst_cv_bgr = dst_cv_ptr[x];

            // bgr のどれかが間違っていたらエラー
            if (std::pow(dst_bgr[0]-dst_cv_bgr[0], 2.0) > 1 || std::pow(dst_bgr[1]-dst_cv_bgr[1], 2.0) > 1
                    || std::pow(dst_bgr[2]-dst_cv_bgr[2], 2.0) > 1){
                printf("x = %d, y = %d,  Error dst=%d,%d,%d dst_cv=%d,%d,%d\n", x, y,
                        dst_bgr[0], dst_bgr[1], dst_bgr[0], dst_cv_bgr[0], dst_cv_bgr[1], dst_cv_bgr[2]);
                //return 1;
            }
        }
    }
    printf("Test with 0 errors.\n");

    return 0;
}

void opencv_resize_gray(Mat& src, Mat& dst){
    Mat gray(src.rows, src.cols, CV_8UC1);
    Mat img0g(RESIZE_HEIGHT, RESIZE_WIDTH, CV_8UC1);

    cvtColor(src, gray, CV_BGR2GRAY);
    resize(gray, img0g, img0g.size(), 0, 0, INTER_LINEAR);
    cvtColor(img0g, dst, CV_GRAY2BGR);
}


Vivado HLS 2019.2 の resize_gray プロジェクトを示す。
HLS_Video_Library_17_200305.png
  1. 2020年03月05日 04:59 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4814-c116553d
この記事にトラックバックする(FC2ブログユーザー)