CV::imwrite来自std::vector的缓冲区

CV::imwrite from a buffer of std::vector

本文关键字:缓冲区 vector 来自 imwrite CV std      更新时间:2023-10-16

我是opencv编程的初学者,我正在尝试读取一个图像(cv::Mat),并将其数据复制到Uchar的某个向量中,然后从该向量创建回图像。

即读取Mat,将Mat转换为std::vector,然后再次从该向量创建Mat。

矢量是像素数据的中间变换所必需的。我提供了在OpenCV 中将Mat转换为阵列/矢量

对于向量Mat。

int main()
{
    Mat image = imread("c:\cv\abc.bmp");
    std::vector<unsigned char> src_vec;
    src_vec.assign(image.datastart, image.dataend);
    cv::Mat dest(src_vec, true);
    try {
        imwrite("dest.bmp", dest);
    }
    catch (runtime_error& ex) {
        fprintf(stderr, "Exception saving the image: %sn", ex.what());
        return 1;
    }
    return 0;
}

输出图像似乎是垃圾,我如何用矢量数据设置dest-Mat,或者是我以错误的方式创建了矢量本身。任何指导都会有所帮助。

您缺少标头信息。vector仅包含像素数据。您必须将头数据保存在某个位置,然后再次将其传递给mat。在以下示例中,头数据直接取自源图像。您也可以将其保存在一些整数变量中,并将其再次传递到新mat的标头中。

Mat image = imread("c:\cv\abc.bmp");
    std::vector<unsigned char> src_vec;
    src_vec.assign(image.datastart, image.dataend);
    cv::Mat dest(image.rows,image.cols,image.type());
    dest.data = src_vec.data();
    try {
        imshow("sss", dest);
        cv::waitKey();
        //or show using imshow - nothing is shown
    }
    catch (runtime_error& ex) {
        fprintf(stderr, "Exception saving the image: %sn", ex.what());
        return 1;
    }
    return 0;

附言:尽量不要使用\,这是Windows的事情。使用/,它是跨平台的。