FC2カウンター FPGAの部屋 XF_8UC4 を使用して median_blur_accel() を実装する
fc2ブログ

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

FPGAの部屋

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

XF_8UC4 を使用して median_blur_accel() を実装する

OpenCV Mat 形式での .data のデータフォーマットを検証する”では画像ファイルを読み込んだデータを一旦 CV_8UC4 (BGRA)に変換してから、 array2axis() を呼び出すと 32 ビット幅のバイト・レーンに アルファ・チャネル、Red , Green 、Blue が並ぶことが確認できた。こうなると、自分の IP から使用しやすくなる。 medianblur も XF_8UC4 を使って実装してみよう。

まずは、 xf_median_blur_config.h の TYPE の定義を XF_8UC4 に変更した。
axim_medianblur_8_210112.png

xf_median_blur_tb.cpp を変更した。これは全部のソースコードを貼っておく。

/*
 * Copyright 2019 Xilinx, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "common/xf_headers.hpp"
#include "xf_median_blur_config.h"

int main(int argc, char** argv) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <INPUT IMAGE PATH 1>", argv[0]);
        return EXIT_FAILURE;
    }

    cv::Mat in_img, out_img, ocv_ref, diff, cnv_img, cnv_out_img;

//  Reading in the image:
#if GRAY
    in_img = cv::imread(argv[1], 0); // reading in the gray image
#else
    in_img = cv::imread(argv[1], 1); // reading in the color image
    cnv_img.create(in_img.rows, in_img.cols, CV_8UC4);
    cv::cvtColor(in_img, cnv_img, cv::COLOR_BGR2BGRA);
#endif

    if (in_img.data == NULL) {
        fprintf(stderr, "ERROR: Cannot open image %s\n ", argv[1]);
        return EXIT_FAILURE;
    }

// create memory for output image
#if GRAY
    ocv_ref.create(in_img.rows, in_img.cols, CV_8UC1);
    out_img.create(in_img.rows, in_img.cols, CV_8UC1); // create memory for output image
    diff.create(in_img.rows, in_img.cols, CV_8UC1);
#else
    ocv_ref.create(in_img.rows, in_img.cols, CV_8UC3);
    out_img.create(in_img.rows, in_img.cols, CV_8UC4); // create memory for output image
    cnv_out_img.create(in_img.rows, in_img.cols, CV_8UC3);
    diff.create(in_img.rows, in_img.cols, CV_8UC3);
#endif

    // OpenCV reference:
    cv::medianBlur(in_img, ocv_ref, WINDOW_SIZE);

// OpenCL section:
#if GRAY
    size_t image_in_size_bytes = in_img.rows * in_img.cols * 1 * sizeof(unsigned char);
#else
    size_t image_in_size_bytes = in_img.rows * in_img.cols * 3 * sizeof(unsigned char);
#endif
    size_t image_out_size_bytes = image_in_size_bytes;

    // Call the top function
    median_blur_accel((ap_uint<PTR_WIDTH>*)cnv_img.data, cnv_img.rows, cnv_img.cols, (ap_uint<PTR_WIDTH>*)out_img.data);
    cv::cvtColor(out_img, cnv_out_img, cv::COLOR_BGRA2BGR);

    // Write down output images:
    cv::imwrite("hls_out.jpg", cnv_out_img); // kernel output
    cv::imwrite("ref_img.jpg", ocv_ref); // reference image

    absdiff(ocv_ref, cnv_out_img, diff);
    // Save the difference image for debugging purpose:
    cv::imwrite("error.png", diff);
    float err_per;
    xf::cv::analyzeDiff(diff, 10, err_per);

    return 0;
}


xf_median_blur_accel.cpp は変更していない。
これで、 C シミュレーションを行ったところ、エラーになってしまった。
axim_medianblur_9_210112.png

/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp: In instantiation of ‘void xf::cv::xFMedianNxN(xf::cv::Mat<TYPE, ROWS, COLS, NPC>&, xf::cv::Mat<TYPE, ROWS, COLS, NPC>&, ap_uint<8>, uint16_t, uint16_t) [with int ROWS = 600; int COLS = 800; int PLANES = 4; int TYPE = 7; int NPC = 1; int WORDWIDTH = 0; int TC = 801; int WIN_SZ = 3; int WIN_SZ_SQ = 9; uint16_t = short unsigned int]’:
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp:462:56:   required from ‘void xf::cv::medianBlur(xf::cv::Mat<TYPE, ROWS, COLS, NPC>&, xf::cv::Mat<TYPE, ROWS, COLS, NPC>&) [with int FILTER_SIZE = 3; int BORDER_TYPE = 1; int TYPE = 7; int ROWS = 600; int COLS = 800; int NPC = 1]’
../../../xf_median_blur_accel.cpp:41:104:   required from here
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp:363:22: エラー: no type named ‘uname’ in ‘struct PixelType<7>’
     XF_PTUNAME(TYPE) OutputValues[XF_NPIXPERCYCLE(NPC)];
                      ^~~~~~~~~~~~
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp:368:22: エラー: no type named ‘uname’ in ‘struct PixelType<7>’
     XF_PTUNAME(TYPE) src_buf[WIN_SZ][XF_NPIXPERCYCLE(NPC) + (WIN_SZ - 1)];
                      ^~~~~~~
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp:368:22: エラー: no type named ‘uname’ in ‘struct PixelType<7>’
/media/masaaki/Ubuntu_Disk/Xilinx_github/Vitis_Libraries/vision/L1/include/imgproc/xf_median_blur.hpp:363:22: エラー: no type named ‘uname’ in ‘struct PixelType<7>’
     XF_PTUNAME(TYPE) OutputValues[XF_NPIXPERCYCLE(NPC)];
                      ^~~~~~~~~~~~
make: *** [obj/xf_median_blur_accel.o] Error 1
ERROR: [SIM 211-100] 'csim_design' failed: compilation error(s).
INFO: [SIM 211-3] *************** CSIM finish ***************
INFO: [HLS 200-111] Finished Command csim_design CPU user time: 4.12 seconds. CPU system time: 0.3 seconds. Elapsed time: 3.89 seconds; current allocated memory: 164.609 MB.


どうやら、 XF_8UC4 は対応していないようだ。とっても残念。。。
  1. 2021年01月12日 04:27 |
  2. Vitis_Vision
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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