我正在尝试将输入图像转换为字符串,然后像完整的循环一样返回图像。当我尝试根据对输入图像的了解尝试指定Clang-Tidy: Use of a signed integer operand with a binary bitwise operatorCV_8UC3时,收到带有意外副作用的CV_8UC1警告(在下面的屏幕快照中说明)。我不确定这是什么意思?

我已经知道了similar such question in a different context。但是我不确定我的案子与那个问题有什么关系。

这是我的代码:

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;
}

输入图像:

string - 从cv::Mat-&gt; std::string-&gt; cv::Mat的OpenCV转换会导致意外的副作用-LMLPHP

color == CV_8UC3时:

string - 从cv::Mat-&gt; std::string-&gt; cv::Mat的OpenCV转换会导致意外的副作用-LMLPHP

color == CV_8UC1

string - 从cv::Mat-&gt; std::string-&gt; cv::Mat的OpenCV转换会导致意外的副作用-LMLPHP

预期的行为

彩色图像(输入图像的副本),为color == CV_8UC3

输入图像的灰度图像,为color == CV_8UC1

最佳答案

我自己通过以下替代方式转换了图像字符串图像来解决了这个问题:

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

此后,转换后的字符串/图像就完美了。

09-25 17:32
查看更多