2017-02-25 2 views
0

Ich versuche, eine Convolution Blur-Effekt auf Bilder zu parallelisieren, damit ich Opencv verwenden.ungültige Typen 'int [int]' für Array-Index auf 2d-Matrix mit 4 für Zyklen

alles funktionierte gut, bis ich versuche, die Kernel-Größe variabel zu machen.

zu tun, dass ich eine 4 verschachtelte für Zyklen, die ersten 2 für Zyklen erstellt, um über die Bilddatenmatrix (m) gehen, eine andere 2 für Zyklen, um die RGB-Werte in m der Nachbarn von (i, j), (Matrix mit Größe Kernel * Kernel) dann bekomme ich die nächsten Fehler für jede Zeile, wo ich RGB-Daten mit den Parametern l, m bekomme.

in meiner älteren Version mit statischer Kernelgröße (nur 2 für Zyklen), kein einziger Fehler oder Warnung und ich verstehe wirklich nicht warum.

$ 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]); 
            ^

Funktionscode für jeden 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); 

} 

Antwort

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

Lesen Sie die Fehlermeldung. Die m in den angegebenen Zeilen sind vom Typ int, und als solche hat keine Mitglieder, die Sie über operator. zugreifen können:

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

Die int m der Schleife die cv::Mat m Schatten.

0

Fehlermeldung ist ziemlich klar. Sie haben den Variablennamen m innerhalb der for(...)-Schleife neu definiert. Früher wurde es in der Zeilennummer von 7 des angegebenen Code-Snippets definiert.

cv::Mat m = ap ->m; 

Und Sie neu definiert m wieder hier über

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

die m in über for(...) Schleife definiert Benennen Sie Ihr Problem zu beheben.

Verwandte Themen