我有一些图像数据作为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());
如下面的答案所示,这可行。
答案 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