Я пытаюсь написать свой собственный код на С++ для достижения свертки. И ядро 11 на 11 и неразборное. Итак, мой код такой:
for(int i = 0; i < image.rows; ++i){
for(int j = 0; j < image.cols; ++j){
int tmp, sum;
for(int m= 0; m < kernel.rows; ++m){
for(int n = 0; n < kernel.cols; ++n){
tmp = image[i+m-(Size_kernel-1)/2][j+n-(Size_kernel-1)/2];
float kernel_index = kernel[m][n];
float index_mult = (float)index_mult * kernel_index;
sum = sum + index_mult;
}
}
new_image[i][j] = sum;
}
}
Мы видим, что сложность этого фрагмента кода велика. И это очень медленно, когда я запускаю программу.
Однако, когда я подключаю две матрицы к функции filter2D в OpenCV. Это занимает очень короткое время, чтобы показать результат. Может ли кто-нибудь объяснить, как filter2D в OpenCV достигает свертки? Почему существует большая разница в эффективности между OpenCV и моим собственным кодом? Спасибо!
sum
. Что касается производительности, любая приличная реализация 2D-фильтра будет использовать SIMD, а для достаточно больших ядер реализация в частотной области будет быстрее, чем прямая реализация. И наконец: не забудьте включить оптимизацию компилятора (например,gcc -O3 ...
) — это имеет большое значение для кода, подобного приведенному выше. - person Paul R   schedule 22.09.2015