gpt4 book ai didi

c++ - OpenCV C++ 3维Mat数据访问错误的值

转载 作者:行者123 更新时间:2023-12-02 17:21:12 24 4
gpt4 key购买 nike

我正在使用C++ OpenCV DNN将结果放入Mat中。在这里,dnnResult是输出Mat。输出值为浮点型。我想将66值提取到3单独的数组或3 x 66矩阵中。

dnnResult.size[0] = 3
dnnResult.size[1] = 1
dnnResult.size[2] = 66
dnnResult.dims = 3

我试图像这样循环以获得值(value),但结果是错误的。从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);
}
}

我还尝试了 How to access a 3 dimensional Matrix elements?
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];

}
}

我正在尝试将相当于 66大小的值分配给3个单独的数组的python,
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*来访问其数据。索引不是没有界限的,但是实际数据是从界限获得的,因为 double64 bit,而 float32 bit在OpenCV中。

因此,您必须 知道,您在访问时是 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);

关于c++ - OpenCV C++ 3维Mat数据访问错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62143120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com