2017-02-25 56 views
0

我试图在图像上并行化卷积模糊效果,所以我使用的是opencv。对于2d矩阵上的数组下标,无效类型'int [int]'使用4个周期

一切工作正常,直到我尝试使内核大小变量。

要做到这一点,我创建了一个4个嵌套循环,第2个循环遍历图像数据矩阵(m),另外2个循环获取m个邻居的RGB值( i,j),(具有内核大小*内核的矩阵) 然后得到下一个错误的每一行,我得到RGB数据参数l,m。

在我的旧版本与静态内核大小(只有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]); 
            ^

为每个函数的代码并行线程

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); 

} 

回答

0
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

0

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

cv::Mat m = ap ->m; 

你再次定义m在这里

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

重命名上面for(...)循环定义来解决你的问题m