axinc-ai / ailia-models-cpp

C++ version of ailia models repository
17 stars 2 forks source link

Fix transpose matrix type to CV_32FC1 #47

Closed kyakuno closed 3 months ago

kyakuno commented 3 months ago

現状のtranspose関数は下記となっている。

void transpose(const cv::Mat& simg, cv::Mat& dimg, std::vector<int> swap = {2, 0, 1})
{
    std::vector<int> size0;
    if (simg.rows > 0) {
         size0 = {simg.rows, simg.cols, simg.channels()};
    }
    else {
        size0 = {simg.size[0], simg.size[1], simg.size[2]};
    }
    std::vector<int> size1 = {size0[swap[0]], size0[swap[1]], size0[swap[2]]};
    dimg = cv::Mat(size1.size(), &size1[0], simg.type());
}

ここで、dimgのcv::Matにsimg.type()を引き継いでいるが、imreadした画像のMatはCV_32FC3であり、transpose後の値としては正しくない。下記のようにCV_32FC1にするのが正しい。

dimg = cv::Mat(size1.size(), &size1[0], CV_32FC1);

cv::imreadした直後は、CV_8UC3が入り、transform関数でCV_32FC3を設定している。その後、transposeもCV_32FC3を引き継ぐが、transposeではCV_32FC1が望ましい。