2017-02-25 55 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