uchar *到std :: vector <uchar>并返回?

时间:2018-09-13 10:03:32

标签: c++ opencv

我有一些图像数据作为uchar*。我需要将其作为std::vector<uchar>进行处理,然后再将其转换回去。我正在使用此代码:

unsigned char* buffer = inputImg.data; //Image data from cv::Mat

    std::vector<uchar> vec;
    size_t size_of_buffer = sizeof(buffer);
    vec.assign(buffer, buffer + size_of_buffer);

    uchar* _compressed = reinterpret_cast<uchar*>(vec.data());

然后我使用以下命令查看结果

    cv::Mat mat = cv::Mat(_height, _width, inputImg.type(), _compressed );

这将导致黑色图像。我要去哪里错了?

编辑:

基于以下评论,我将代码更改为:

//from Mat
    int COLOR_COMPONENTS = inputImg.channels();
    int _width = inputImg.cols;
    int _height = inputImg.rows;

    //to std::vector and back
    std::vector<uchar> vec;
    size_t size_of_buffer = _width * _height*COLOR_COMPONENTS;

    vec.assign(buffer, buffer + size_of_buffer);
    uchar* _compressed = reinterpret_cast<uchar*>(vec.data());

如下面的答案所示,这可行。

2 个答案:

答案 0 :(得分:1)

sizeof(buffer)产生指向缓冲区的指针的大小,而不是缓冲区内部的数据量。您必须从其他地方获取缓冲区大小。

答案 1 :(得分:1)

此代码对我有用,并且可以正确显示图像:

int main()
{
    cv::Mat input = cv::imread("C:/StackOverflow/Input/Lenna.png");
    cv::Mat inputImg = input;

    int COLOR_COMPONENTS = inputImg.channels();
    int _width = inputImg.cols;
    int _height = inputImg.rows;

    //to std::vector and back
    std::vector<uchar> vec;
    size_t size_of_buffer = _width * _height*COLOR_COMPONENTS;

    unsigned char* buffer = inputImg.data;

    vec.assign(buffer, buffer + size_of_buffer);
    uchar* _compressed = reinterpret_cast<uchar*>(vec.data());

    cv::Mat mat = cv::Mat(_height, _width, inputImg.type(), _compressed);

    cv::imshow("output", mat);
    cv::waitKey(0);
    return 0;
}

带有OpenCV 3.4的Visual Studio 2013