下面是将矩阵(声明为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
谁能告诉我哪里出错了?任何帮助将不胜感激。
答案 0 :(得分:2)
第一个循环必须迭代矩阵行,因为OpenCV使用行主顺序。 at
或cvGet2D
的第一个索引是行索引,而不是列。正确的代码:
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++ 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);
}
}
会奏效。