opencv訪問矩陣元素出錯 int point = Mat.at(y,x)

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);
 }
在保存矩陣時出現如下錯誤:
運行出錯
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 - 雙精度浮點數
enum{CV_8U,CV_8S,CV_16U,CV_16S,CV_32S,CV_32F,CV_64F}
而elemSize1()的值與你矩陣的數據類型有關,具體去CSDN上有,只有當得到的CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())相等時才能夠進行矩陣保存。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章