Конвертация OpenCV из cv :: Mat -> std :: string -> cv :: Mat приводит к неожиданным побочным эффектам - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь преобразовать входное изображение в строку, а затем вернуться к изображению, как полный цикл. Я получаю предупреждение Clang-Tidy: Use of a signed integer operand with a binary bitwise operator с неожиданным побочным эффектом (объяснено на скриншотах ниже), когда пытаюсь указать CV_8UC3 или CV_8UC1 на основании моих знаний о входном изображении. Я не уверен, что это значит?

Мне уже известен подобный такой вопрос в другом контексте . Но я не уверен, как мой случай связан с этим вопросом.

Это мой код:

int main (int argc, char *argv[]) {
    bool color = argv[1];
    cv::Mat img = cv::imread("../images/input.jpg", color);
    std::string img_str(img.begin<unsigned char>(), img.end<unsigned char>());
    auto* buffer = (unsigned char *) img_str.c_str();
    // Complaint happens at this line below
    cv::Mat dummy = cv::Mat(img.rows, img.cols, color ? CV_8UC3 : CV_8UC1, buffer);
    cv::imwrite("../images/output.jpg", dummy);
    return 0;
}

Исходное изображение:

enter image description here

Когда color == CV_8UC3:

enter image description here

Когда color == CV_8UC1

enter image description here

Ожидаемое поведение

Цветное изображение (копия входного изображения), когда color == CV_8UC3

Изображение в градациях серого для входного изображения, когда color == CV_8UC1

1 Ответ

1 голос
/ 09 марта 2020

Я решил эту проблему самостоятельно, преобразовав изображение <-> string <-> image альтернативным способом, как показано ниже:

std::string ImageToString(const cv::Mat &img) {
    cv::Mat1b linear_img(img.reshape(1));
    return std::string(linear_img.begin(), linear_img.end());
}

После этого преобразованные строки / изображения будут идеальными.

...