imdecode(OpenCV c ++)对在Android设备上运行的base64 PNG进行解码的问题

时间:2018-10-31 17:00:20

标签: android c++ opencv

我遇到了imdecode(OpenCV c ++)解码在Android设备上运行的base64 PNG的问题。

我有一个Android SDK,可以公开使用OpenCV(c ++)构建的图像处理管道。管线步骤之一包括使用imdecode解码base64 PNG。但是,我们使用this question中的代码从base64创建向量缓冲区,然后将其用作进行解码的参数。在Android上运行时,imdecode返回一个空的cv Mat。如果我将PNG更改为JPG,它可以工作,但是会影响我的结果。有谁知道为什么会发生这种情况以及如何使它起作用?

我还有一个iOS SDK,它使用相同的管道,并且运行良好。

谢谢!

编辑

这不是Convert the Base64(String or Byte array) to mat(image) in c++(opencv)的重复,因为尽管答案与我的代码非常相似,但这里我使用的是PNG base 64,答案使用的是JPG。可以解决问题,但是我需要使用PNG。

添加代码

#include "utils/Base64Util.hpp" 

const std::string Base64Util::base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

bool Base64Util::is_base64(unsigned char c) {
    return (std::isalnum(c) || (c == '+') || (c == '/'));
}

std::string Base64Util::base64_decode(std::string const& encoded_string) {
    int in_len = encoded_string.size();
    int i = 0;
    int j = 0;
    int in_ = 0;
    unsigned char char_array_4[4], char_array_3[3];
    std::string ret;

    while (in_len-- && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
        char_array_4[i++] = encoded_string[in_]; in_++;
        if (i == 4) {
            for (i = 0; i < 4; i++)
                char_array_4[i] = base64_chars.find(char_array_4[i]);

            char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

            for (i = 0; (i < 3); i++)
                ret += char_array_3[i];
            i = 0;
        }
    }

    if (i) {
        for (j = i; j < 4; j++)
            char_array_4[j] = 0;

        for (j = 0; j < 4; j++)
            char_array_4[j] = base64_chars.find(char_array_4[j]);

        char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

        for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
    }

    return ret;
}

以及使用它的代码

cv::Mat getTemplate(bool isInverted) {
    std::string decoded_string;

    if (isInverted) {
        decoded_string = Base64Util::base64_decode("iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAAAAAAeW/F+AAACrklEQVQoFRXB4WuWVRgH4N/vvs85z3nf15U2tgURGuQsP/ihRmEYwci+1Z/mxHSbQfhXBEX5IYKaZUQfdCtsUCxTQt3Weve8zznnvqPr4nUl/udOEAGANRclq8PB60qJXticoCgErTUIQ5NK58cBknxwgyoFFhzoq2QprYXIDUKbEdAOCgh98N5VdYYaOm6KsbiLTjqwVXXp3U2IwU0TNwNqgUeZRJ3VodZOczXAi9UYuUka3DSNhuMnDx9PwwuLC3kuVfNhCIHXICoCYrp3b+egFA3Pv3Jh+URumPaIvKJKyV199tN3f2AOpUW2l98+Px/9cNDEtUiJQf+6++3T5+ZkZi3UAz9zaXk+TBsTr4bWjXz/xy+enepqqdDMoa9vvfnqXLOqXGPMMjz48jd2NqgUaRJLv3jxnfnUO3jNdBT3t746GsvMldoc7j4+98FS9tDziuTMvdtbbcSqJCulsUtLq+dGJjOuhS7a7mf3LCZS3FADak4Ll1byIM61NArDzucPmiYSKrUoSgoLK++Nohmvdjkf37+9U6KKOIIODjpPXr6YgxnXJYzr9tc/cBTdAYr1rgWLH70xciHX2eX2692twzyxo5g8+D8On5z58CxLAm+6RN/f/uZ3z1IUYDXzPHf+/Re9ivATZ4yz3TvfHwVIZ/BS8sROry5PZh6Nt5qFUXhy/84vh0hsqZScj09dfvfk8C+S8VZtMhnNHv+8vfeIWqGETFZWX2KtRvDTwSRl9o8e/rn9dBiMOjn9+oWF1GToPXDDq4pImMnh7t7+3wfjpbOvzY9K57H2HniDRqNkwlj7Y8snkgSdokOZMvGGmDfh2BTjZP2gpqEVJ9kGkhtoEKoEB6IXM9fgNgCMM1FuwEGKiBUS1RUE3KyJeCDXAYLC5mhojkiYA45YVOw/rMJ2s8LqhGkAAAAASUVORK5CYII=");
    } else {
        decoded_string = Base64Util::base64_decode("iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAAAAADhgtq/AAACNUlEQVQoFQXBPWgUQRQA4HnvzezO7t3eJeflEtEcgmAXNKns7i4cwUOwErGxUOxEsdDG3kaxskgpBhRBaxuxsbKIgdhICKgJJBpjTHJ/s7Pz5/dBGyVCwbxlEvMRCfAYo9C/DbQgIrQhMJA4zmMWHItQum0NbceJwLsIeDQy5ShXRYIx2z2GVhEhUkBuVAKhWunv6SnP+WAPOpbI5CWh9TgJploe/2WzHoT7Bz0/nrQ7UihqnhttnCjtbJhmiRhXcBlcTW2VprNTF+dxLeMb79amqpLFHroR530635o5OcmtI3748eV3mUmJ0Eo9OzpztSeE6xvicXzw6sUwqyUEPd43/bm7CyEaHASfxDW7+uxzuZHFcMXsC9O6X3fheABaphPp1vOVeKaRQU8dQ/XaLaeV1mRClEz3Pyz/mDwdw6Jyg9l7l/Qw9455nWAN1fvXanIArZwG0w+641HhmCsgBYnZl8f71RF0dNDi5u1c90MwwYq0ROrN0+gsQZuZXHUf1eyeRxuKsqiy9Sef6s0Y2kGYncbDpbg/ss5nqa8crywfTk0IaAXJdoc37tSdya2QAu23R19lAxh0MNDg14Xr841IWO6PtjfX39qpui6gLawwu9ica1bSgvzP1U0VZL2sDHSCS91QFYwCOXTDcZKJpBSbArrOi4DM/hkpRRxkpZIVLKC3sGSAQlJy+4ppihNyxIPWnjFYNEwgT5k2ESJEblwwro1jCAuESCQImCRw3pmCCRvA4X+rIB1V6HjYsQAAAABJRU5ErkJggg==");
    }

    std::vector<uchar> data(decoded_string.begin(), decoded_string.end());

    return cv::imdecode(data, cv::IMREAD_UNCHANGED);
}

0 个答案:

没有答案