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