2013-07-12 149 views
1

下面是我为旋转90度的矩阵(声明为rgbMat)代码,下面访问元素

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 

可有人告诉我,我错了。任何帮助将不胜感激。

+0

可能重复[如何CvMat中访问\ *的元素的OpenCV(http://stackoverflow.com/questions/9954423/how-to-access-elements-of-cvmat- in-opencv) – CharlesB

+0

@CharlesB给出的代码没有工作,你能提供一些答案 – user2567857

+0

对于打印矩阵,请参考[here](http://docs.opencv.org/doc/tutorials/core/mat%20 - %20the%20basic%20image%20container/mat%20-%20the%20basic%20image%20container.html#print-out-formatting) – devnull

回答

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); 
    } 
} 
+0

是的,我解决了之前 – user2567857

1

首先 - 因为您正在使用Mat结构而不是IplImage-尝试使用C++ API作为matrix operations,以摆脱指针/数据混淆。

然后,

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

会工作。