0

我试图在映射后打印出 rgbMat 的值(在下面的代码中),但出现了一些错误。谁能告诉我哪里出错了?它向我显示以下错误:

g++ `pkg-config --cflags --libs opencv` line1.cpp 
l1.cpp: In function ‘int main(int, char**)’:
l1.cpp:28:50: error: request for member ‘at’ in ‘rgbMat’, which is of non-class type ‘CvMat*’
l1.cpp:28:58: error: expected primary-expression before ‘>’ token
l1.cpp:28:62: error: name lookup of ‘x’ changed for ISO ‘for’ scoping
l1.cpp:28:62: note: (if you use ‘-fpermissive’ G++ will accept your code)

我想我在以下行中出错了:

  printf("matrix is %u: \n", rgbMat.at<uchar>(y,x));

我的代码是:

     IplImage* rgb[3];

     float L0[]={
         -1,-1,-1,-1,-1,
        0, 0, 0, 0, 0,
        2, 2, 2, 2, 2,
        0, 0, 0, 0, 0,
        -1,-1,-1,-1,-1 };

     CvMat*  rgbMat = cvCreateMat(5, 5, CV_32FC1);

     for (int y = 0; y < 5; y++)
     {
         for (int x = 0; x < 5; x++)
             cvmSet(rgbMat, y, x, L0[y*5 + x]);
           printf("matrix is %u: \n", rgbMat.at<uchar>(y,x));
     }
4

1 回答 1

2

总结讨论:

建议将所有 OpenCV 矩阵的使用移植到新的 cv::Mat 格式。但是,OpenCV 提供了在新旧格式之间进行转换的功能:

这种用户分配数据的部分但非常常见的情况是从 CvMat 和 IplImage 到 Mat 的转换。为此,有一些特殊的构造函数采用指向 CvMat 或 IplImage 的指针以及指示是否复制数据的可选标志。通过转换运算符 Mat::operator CvMat() const 和 Mat::operator IplImage() 提供从 Mat 到 CvMat 或 IplImage 的反向转换。操作员不会复制数据。

rgbMat在您的代码中,首先cv::Mat使用cv::Mat rgbMatcpp(rgbMat). 现在您应该能够使用at. 例如,rgbMatcpp.at<float>(y, x)。接下来,请注意变量x,并且y它们的范围仅限于for它们操作的循环。因此,对内部for循环使用大括号并将其移动printf到循环体中。此外,在您尝试使用at时,您已将类型指定为uchar,这是错误的,因为 rgbMat 属于 类型CV_32FC1。所以改变你对atto的使用rgbMatcpp.at<float>(y, x)

于 2013-07-04T15:29:48.843 回答