两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
OpenCV data of two mats are the same but values when retrieved with Mat::at are corrupted
我使用自定义函数序列化然后反序列化 Mat。当您比较两个函数的uchar* Mat.data
时,它们是相同的,但是当我尝试使用第三个元素之后的Mat.at<>
直接检查值时,元素值卡在一些损坏的浮点值上。我尝试将元素更改为所有其他值,但没有任何变化。当我序列化-反序列化图像垫和直方图垫时,也不会发生此问题。下面是代码,下面是输出。
cv::Mat kernelx = (cv::Mat_<float>(3, 3) << 1, 0, -1, 1, 0, -1, 1, 0, -1);
std::string stroper = dbop::serializeMat(kernelx);
cv::Mat matoper = dbop::deserializeMat(stroper);
for (int i = 0; i < matoper.rows; i++) {
for (int j = 0; j < matoper.cols; j++) {
float f1 = (float)kernelx.data[i + j];
float f2 = (float)matoper.data[i + j];
std::cout << kernelx.at<float>(i, j) << " " << matoper.at<float>(i, j) << " " << f1 << " " << f2 << " " << std::endl;
}
}
这是输出。第一个值是原始 Mat 的元素,第二个值是序列化-反序列化 Mat 的元素,第三个值是转换为浮点的原始 Mat 的数据值,第四个值是 s-d Mat 的数据值。
1 1 0 0
0 0 0 0
-1 -4.31596e+08 128 128
1 -4.31602e+08 0 0
0 -4.31602e+08 128 128
-1 -4.31602e+08 63 63
1 -4.31602e+08 128 128
0 -4.31602e+08 63 63
-1 -4.31602e+08 0 0
我想序列化Mat和反序列化Mat函数在这里是相关的,所以两者都是。
std::string dbop::serializeMat(cv::Mat operand) {
std::ostringstream srlzstrstream;
uchar* pixelPtr = (uchar*)operand.data;
int cn = operand.channels();
cv::Scalar_<uchar> cnPixel;
srlzstrstream << operand.dims << " ";
for (int i = 0; i < operand.dims; i++) {
srlzstrstream << operand.size[i] << " ";
}
srlzstrstream << operand.type() << " ";
for (int i = 0; i < operand.total(); i++) {
for (int k = 0; k < cn; k++) {
srlzstrstream << (float)pixelPtr[i * cn + k] << " ";
}
}
std::string srlzdstr = srlzstrstream.str();
return srlzdstr;
}
cv::Mat dbop::deserializeMat(std::string operand){
std::istringstream desrlzstrstream(operand);
int mdims, mtype;
desrlzstrstream >> mdims;
int* msize = new int[mdims];
for (int i = 0; i < mdims; i++)
desrlzstrstream >> msize[i];
desrlzstrstream >> mtype;
cv::Mat matoper(mdims, msize, mtype);
delete [] msize;
uchar* pixelPtr = (uchar*)matoper.data;
float cnpixoper;
for (int i = 0; i < matoper.total(); i++) {
for (int k = 0; k < matoper.channels(); k++) {
desrlzstrstream >> cnpixoper;
pixelPtr[i * matoper.channels() + k] = cnpixoper;
}
}
return matoper;
}
+ 编辑
由于要为泛型类型保存字节,因此可以像这样迭代每个字节。
在serializeMat
for (int i = 0; i < operand.total() * operand.elemSize(); i++) {
srlzstrstream << pixelPtr[i] << " ";
}
在deserializeMat
for (int i = 0; i < matoper.total() * matoper.elemSize(); i++) {
desrlzstrstream >> cnpixoper;
pixelPtr[i] = cnpixoper;
}
operand.total() * operand.elemSize()
将为您提供operand
的字节大小
在这两种情况下,输出都是
1 1 0 0
0 0 0 0
-1 -1 128 128
1 1 0 0
0 0 128 128
-1 -1 63 63
1 1 128 128
0 0 63 63
-1 -1 0 0
相关文章:
- Difference in displaying cv2 Mat
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 将CHW格式的浮点向量转换为cv::Mat
- 使用 mat.at<uchar>(i,j) 的 opencv C++中的矩阵赋值错误
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 访问图像像素;MatIterator_<> 和 Mat::at 运算符的比较
- Mat::at<double>(i,j) SIGSEGV, 分段错误
- 使用 Mat::at<Vec3i> Point 未构造正确的像素
- 如何从OpenCV Mat访问浮点值(.at和.ptr除外)
- 在使用 Mat::at 迭代图像时崩溃
- Mat.at函数引发异常
- C++ OpenCV 函数"mat.at<Vec3b>(Point(j, i))"无法生成正确的像素值并崩溃
- 为什么 openCV Mat.at 与原始矩阵不匹配
- OpenCV Mat 方法"at" Linux 中返回奇怪的字符
- opencvc++在Mat:at中的错误
- C++OpenCV mat.at在使用数据时产生访问冲突
- 在opencv中使用Mat::at(i,j)用于二维Mat对象
- Mat::at - error:类型的非const引用的无效初始化的包装器