opencv访问矩阵元素出错 int point = Mat.at<float>(y,x)
来源:互联网 发布:负责淘宝钻展投放的人 编辑:程序博客网 时间:2024/06/05 02:55
void StereoMatch::saveOneDimension(cv::Mat& pointClouds, const char* filename)
{
const double max_z = 1.0e4;
try
{
FILE* fp = fopen(filename, "wt");
fprintf(fp, "%02d\n", pointClouds.rows);
fprintf(fp, "%02d\n", pointClouds.cols);
for (int y = 0; y < pointClouds.rows; y++)
{
for (int x = 0; x < pointClouds.cols; x++)
{
//cv::Vec3f point = pointClouds.at<cv::Vec3f>(y, x);
int point = pointClouds.at<unsigned char>(y, x); //float point = pointClouds.at<float>(y, x)不行,原因还没有弄清楚
//if (fabs(point - max_z) < FLT_EPSILON || fabs(point) > max_z)
if (fabs(point - max_z) < FLT_EPSILON || point > max_z)
fprintf(fp, "%d \n", 0);
else
fprintf(fp, "%d \n", point);
}
}
fclose(fp);
}
{
const double max_z = 1.0e4;
try
{
FILE* fp = fopen(filename, "wt");
fprintf(fp, "%02d\n", pointClouds.rows);
fprintf(fp, "%02d\n", pointClouds.cols);
for (int y = 0; y < pointClouds.rows; y++)
{
for (int x = 0; x < pointClouds.cols; x++)
{
//cv::Vec3f point = pointClouds.at<cv::Vec3f>(y, x);
int point = pointClouds.at<unsigned char>(y, x); //float point = pointClouds.at<float>(y, x)不行,原因还没有弄清楚
//if (fabs(point - max_z) < FLT_EPSILON || fabs(point) > max_z)
if (fabs(point - max_z) < FLT_EPSILON || point > max_z)
fprintf(fp, "%d \n", 0);
else
fprintf(fp, "%d \n", point);
}
}
fclose(fp);
}
在保存矩阵时出现如下错误:
运行出错
template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
{
CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
(unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((_Tp*)(data + step.p[0]*i0))[i1];
}
template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
{
CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
(unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((_Tp*)(data + step.p[0]*i0))[i1];
}
此问题主要出现在CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())这里得出来的值部位真。为什么?
首先要知道 int point = pointClouds.at<unsigned char>(y, x); 中at后面的数据类型,其类型有如下:
IPL_DEPTH_1U 1
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
IPL_DEPTH_8U - 无符号8位整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
enum{CV_8U,CV_8S,CV_16U,CV_16S,CV_32S,CV_32F,CV_64F}
而elemSize1()的值与你矩阵的数据类型有关,具体去CSDN上有,只有当得到的CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())相等时才能够进行矩阵保存。
0 0
- opencv访问矩阵元素出错 int point = Mat.at<float>(y,x)
- openCV坐标系与row&col的关系 (Mat::at(x,y)和Mat::at(Point(x, y))的区别)
- OpenCV学习笔记(十二):OpenCV坐标系与row&col的关系 (Mat::at(x,y)和Mat::at(Point(x, y))的区别)
- OpenCV Mat类矩阵元素访问
- opencv Mat元素访问和Mat矩阵初始化
- 【opencv】访问mat元素
- opencv学习笔记3——对Mat::at(x,y)的测试
- OpenCV不同类型Mat的at方法访问元素时该如何确定模板函数的typename
- 利用指针访问Mat矩阵元素
- OpenCV:Mat元素访问方法、性能
- opencv Mat元素的访问方法
- openCV2.X的cv::Mat访问元素
- int *x, y; int* x, y;
- opencv中Mat格式的数据点访问at
- opencv Mat.at
- Selenium 错误 Element is not clickable at point (x, y). Other element would receive the click
- openCV,C++接口,cv::Mat矩阵数据元素读取
- openCV,C++接口,cv::Mat矩阵数据元素读取
- 详解基本TCP套接字函数
- Struts2的基石(拦截器)
- BOM制作系列之一:BOM拆分
- iOS框架介绍--G&H字头
- OpenGL学习笔记
- opencv访问矩阵元素出错 int point = Mat.at<float>(y,x)
- 预置多媒体文件等到手机的指定目录
- exit2/ext3文件系统介绍
- Linux脚本EOF
- pjsip集成webrtc媒体处理
- 使用JQuery跨域请求
- Unity3D 学习笔记
- 犯了一个超低级错误
- js之正则表达式1