我对OpenCV Mat元素类型感到困惑.这是来自文档:
There is a limited fixed set of primitive data types the library can operate on.
That is, array elements should have one of the following types:
8-bit unsigned integer (uchar)
8-bit signed integer (schar)
16-bit unsigned integer (ushort)
16-bit signed integer (short)
32-bit signed integer (int)
32-bit floating-point number (float)
64-bit floating-point number (double)
...
For these basic types, the following enumeration is applied:
enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
Run Code Online (Sandbox Code Playgroud)
众所周知,C++标准没有以字节为单位定义基本类型的大小,那么他们如何使用这些假设呢?我应该期待什么类型,比方说CV_32S,是int32_t还是int?
在OpenCV的C++界面中,检查图像类型似乎很容易.如果您有图像cv::Mat img = cv::imread("someImage.xyz"),那么您就是这样做的int theType = img.type().
但是,正如您所期望的那样,调用img.type()只给出一个整数,而不是枚举名称(例如CV_32FC1).
CV_32FC1如果我知道OpenCV枚举的整数值,是否有一种简单的方法可以打印出枚举名称(例如)?
我有一个cv::Mat以下尺寸480 x 640 x 32。
你能告诉我如何访问这个结构中的数据吗?假设我想从 position 访问元素[2, 2, 2]。我怎样才能做到这一点?
编辑 1:
我曾尝试使用它,template<typename T> const T& Mat::at(int i, int j, int k) const但收到以下运行时错误:
编辑2:
这是我如何使用代码:
cv::Mat f(382,510,32);
f=Utils::toMat(features);
cout<<f.at<double>(1,1,1);
Run Code Online (Sandbox Code Playgroud)
这里toMat是波纹管详述。
cv::Mat Utils::toMat( mxArray* p_)
{
mwSize ndims_= mxGetNumberOfDimensions(p_);
const mwSize* dims=mxGetDimensions(p_);
std::vector<int> d(dims, dims+ndims_);
int ndims = (d.size()>2) ? d.size()-1 : d.size();
int nchannels = (d.size()>2) ? *(d.end()-1) : 1;
int depth=CV_64F;
std::swap(d[0], d[1]);
cv::Mat mat(ndims, &d[0], CV_MAKETYPE(depth, nchannels));
// …Run Code Online (Sandbox Code Playgroud)