在openCV中访问mat的元素

时间:2013-07-12 08:25:21

标签: c opencv image-processing

下面是将矩阵(声明为rgbMat)旋转90度的代码,如下面的代码所示

    CvMat* rot = cvCreateMat(2,3,CV_32FC1);
    CvPoint2D32f center = cvPoint2D32f(rgbMat->width/2,rgbMat->height/2); 
    double angle = 90;
    double scale = 5;
    CvMat* rot3= cv2DRotationMatrix( center, angle, scale, rot);

更新

我正在尝试访问rot3的元素,以便我知道我得到了什么值。如下面的代码所示: -

    cv::Mat rot3cpp(rot3);
    for(int i=0;i<rot3cpp.cols;i++)
    {
    for (int j =0;j<rot3cpp.rows;j++)
      {
        CvScalar scal = cvGet2D(rot3,i,j);
        printf("new matrix is %f: \n", rot3cpp.at<float>(i,j));
      }
    }

但我收到的错误是这样的:

     OpenCV Error: One of arguments' values is out of range (index is out of range) in cvGet2D, file /home/xyz/Documents/opencv-2.4.5/modules/core/src/array.cpp, line 1958 terminate called after throwing an instance of 'cv::Exception' what():  /home/xyz/Documents/opencv-2.4.5/modules/core/src/array.cpp:1958: error: (-211) index is out of range in function cvGet2D

谁能告诉我哪里出错了?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

第一个循环必须迭代矩阵行,因为OpenCV使用行主顺序。 atcvGet2D的第一个索引是行索引,而不是列。正确的代码:

for(int i=0; i<rot3.rows; i++)
{
   for(int j=0; j<rot3.cols; j++)
   {
       cout << rot3.at<float>(i,j);
   }
}

答案 1 :(得分:1)

首先 - 因为你使用Mat结构而不是IplImage-尝试使用C++ APImatrix operations,以避免指针/数据混淆。

然后,

for(int i=0; i<rot3.cols; i++)
{
   for(int j=0; j<rot3.rows; j++)
   {
       cout << rot3.at<float>(i,j); 
   }
}

会奏效。