CV::imwrite来自std::vector的缓冲区
CV::imwrite from a buffer of std::vector
我是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的事情。使用/
,它是跨平台的。
相关文章:
- C++字符*缓冲区的大小
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 在某些循环内使用vector.push_back时出现分段错误
- 当vector是tje全局变量时,c++中vector的内存管理
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- std::vector的包装器,使数组的结构看起来像结构的数组
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- std::vector::assign/std::vector::operator=(const&) 是否保证在"this"中重用缓冲区?
- 将 std::vector 的缓冲区替换为错误定位的字符数组
- 使用 std::vector 作为简单缓冲区是否是一种好的做法
- 使用 std:vector 作为低级缓冲区
- CV::imwrite来自std::vector的缓冲区
- 将 std::vector 的内容复制到<char> char* 缓冲区中?
- 如何访问 std::vector 的内部连续缓冲区,是否可以将其与 memcpy 等一起使用
- 使用 vector<char> 作为缓冲区而不在 resize() 上初始化它
- 如何有效地将 std::vector 视为 C 缓冲区