使用 4 循环的二维矩阵上的数组下标的无效类型“int [int]”

Posted

技术标签:

【中文标题】使用 4 循环的二维矩阵上的数组下标的无效类型“int [int]”【英文标题】:invalid types ‘int[int]’ for array subscript on 2d matrix using 4 for cycles 【发布时间】:2017-02-25 08:52:47 【问题描述】:

我正在尝试在图像上并行化卷积模糊效果,所以我使用的是 opencv。

在我尝试使内核大小可变之前,一切正常。

为此,我创建了 4 个嵌套循环,前 2 个循环用于遍历图像数据矩阵 (m),另外 2 个循环用于获取 (i) 的邻居 m 中的 RGB 值,j), (矩阵大小为 kernel*kernel) 然后获取带有参数 l,m 的 RGB 数据的每一行的下一个错误。

在我的旧版本中,内核大小为静态(周期只有 2 个),没有一个错误或警告,我真的不明白为什么。

$ g++ blurh.cpp -o blur `pkg-config --cflags --libs opencv` -lpthread
blurh.c: In function ‘void* blur(void*)’:
blurh.c:53:16: error: request for member ‘at’ in ‘m’, which is of non-class type ‘int’
       sumB+=(m.at<cv::Vec3b>(l,m)[0] );
                ^~
blurh.c:53:28: error: expected primary-expression before ‘>’ token
       sumB+=(m.at<cv::Vec3b>(l,m)[0] );
                            ^
blurh.c:53:36: error: invalid types ‘int[int]’ for array subscript
       sumB+=(m.at<cv::Vec3b>(l,m)[0] );
                                    ^

每个 pthread 的功能代码

void *blur(void *ap2)
    info *ap=(info *)ap2;
    int start, end, i;
    start = ap -> start;
    end = ap -> end;
    int w = ap -> w;
    cv::Mat m = ap ->m;
    int kernel = ap->k;

    int sumB=0;
    int sumG=0;
    int sumR=0;

    int deno=(kernel*kernel)-1;

  for (i = start+(kernel/2); i < end-(kernel/2); ++i)
  
    for (int j = 1+kernel/2; j < w+1; ++j)
    
        sumB=0;
        sumG=0;
        sumR=0;
        for (int l = i-(kernel/2); l < l+(kernel/2); ++l)
        
            for (int m = j-(kernel/2); m < m+(kernel/2); ++m)
            
                sumB+=(m.at<cv::Vec3b>(l,m)[0] );
                sumG+=(m.at<cv::Vec3b>(l,m)[1] );
                sumR+=(m.at<cv::Vec3b>(l,m)[2] );
            
        
        sumB-=(m.at<cv::Vec3b>(i,j)[0] );
        sumG-=(m.at<cv::Vec3b>(i,j)[1] );
        sumR-=(m.at<cv::Vec3b>(i,j)[2] );

        m.at<cv::Vec3b>(i,j)[0] = sumB/deno;
        m.at<cv::Vec3b>(i,j)[1] = sumG/deno;
        m.at<cv::Vec3b>(i,j)[2] = sumR/deno;

    
  
  cv::imwrite( "testedH720.jpg", m);


【问题讨论】:

【参考方案1】:
blurh.c:53:16: error: request for member ‘at’ in ‘m’, which is of non-class type ‘int’
       sumB+=(m.at<cv::Vec3b>(l,m)[0] );

阅读错误信息。指定行中的mint 类型,因此它没有您可以通过operator. 访问的任何成员:

        for (int m = j-(kernel/2); m < m+(kernel/2); ++m)
        //------^^^
        
            sumB+=(m.at<cv::Vec3b>(l,m)[0] );
            sumG+=(m.at<cv::Vec3b>(l,m)[1] );
            sumR+=(m.at<cv::Vec3b>(l,m)[2] );
        

循环中的int m 会影响cv::Mat m

【讨论】:

【参考方案2】:

错误信息很清楚。您已在 for(...) 循环内重新定义了变量名称 m。早些时候,它已在给定代码 sn-p 的第 7 行中定义。

cv::Mat m = ap ->m;

你又在这里重新定义了m

for (int m = j-(kernel/2); m < m+(kernel/2); ++m)
    // Do Something

重命名上述for(...) 循环中定义的m 以解决您的问题。

【讨论】:

以上是关于使用 4 循环的二维矩阵上的数组下标的无效类型“int [int]”的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何将一个一维数组从大到小排序

求一个3*3的整形矩阵对角线元素之和

5.2多重循环和二维数组

Java中二维数组是什么?如何使用?概念!语法!案例!三方面讲解。

数组下标的无效类型“unsigned char [int]”[关闭]

二维数组找鞍点