OpenCV C++ 3 维垫数据访问错误值
OpenCV C++ 3 Dimensional Mat Data Access Wrong Values
我正在使用C++ OpenCV DNN将结果放入Mat中。在这里,dnnResult
是输出垫。输出值为浮点型。我想将66
值提取到3
单独的数组或3 x 66
矩阵中。
dnnResult.size[0] = 3
dnnResult.size[1] = 1
dnnResult.size[2] = 66
dnnResult.dims = 3
我尝试像这样循环以获得值,但结果是错误的。从 3d Mat 访问越界数据没有错误。
for(int m = 0; m < 3; m++){
for(int n = 0; n < 66; n++){
myNetOutput2d[m][n] = dnnResult.at<double>(m, 0, n);
}
}
我还尝试了以下如何访问三维矩阵元素?,
typedef Vec<double, 66> Vec66d;
for(int m = 0; m < 3; m++){
for(int n = 0; n < 66; n++){
Vec66d tmp_vec66d = dnnResult.at<double>(0, m);
myNetOutput2d[m][n] = tmp_vec66d.val[n];
}
}
我正在尝试让 python 等效于将大小为66
的值分配给 3 个单独的数组,
arr1, arr2, arr3 = dnnResult
更改dnnResult.at<double>(..)
到dnnResult.at<float>(..)
+ 有关cv::Mat::at
的更多信息
template<typename _Tp> inline
_Tp& Mat::at(int i0, int i1, int i2)
{
CV_DbgAssert( elemSize() == sizeof(_Tp) );
return *(_Tp*)ptr(i0, i1, i2);
}
inline
const uchar* Mat::ptr(int i0, int i1, int i2) const
{
CV_DbgAssert(dims >= 3);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)i1 < (unsigned)size.p[1]);
CV_DbgAssert((unsigned)i2 < (unsigned)size.p[2]);
return data + i0 * step.p[0] + i1 * step.p[1] + i2 * step.p[2];
}
cv::Mat
使用原始指针保存数据,cv::Mat::at<_Tp>
通过强制转换为_Tp*
的指针来访问其数据。索引不是越界的,但实际数据是从越界获取的,因为double
是64 bit
的,而float
在OpenCV中是32 bit
的。
因此,在访问它时,您必须知道您cv::Mat
是正确的类型。
如果要转换数据做double
,则必须在获得正确的数据后进行转换。
myNetOutput2d[m][n] = (double)dnnResult.at<float>(m, 0, n);
或者,在访问dnnResult
类型之前将其转换为double
。
dnnResult.convertTo(dnnResult, CV_64F);
...
myNetOutput2d[m][n] = dnnResult.at<double>(m, 0, n);
相关文章:
- 为什么我的 setter 方法会产生错误的访问错误
- OpenCV C++ 3 维垫数据访问错误值
- C++ 将元素分配给映射值时访问错误
- 为什么代码会抛出非法内存访问错误
- 访问字符串::c_str()的结果时出现瓦尔格林德内存访问错误
- 从触摸回调访问向量元素的方法时,不良访问错误
- 筛子上的访问错误
- 查找() 上的 C++ 错误访问错误
- OPENCV MAT内存访问错误
- C - 空数对象的初始化发送不良访问错误
- std::函数 创建临时内存时内存访问错误
- 不良访问C 错误
- C 中的模棱两可的访问错误
- Win 32写入文件:访问错误1784
- 奇怪的结构访问错误
- 64位Windows API结构对齐导致命名管道上出现“拒绝访问”错误
- 不是NULL指针,而是错误的访问错误消息
- 统一读取和不可修复的访问错误
- 带有 libcurl C++的内存访问错误
- 非法内存访问错误