Какова локализация кода Собеля внутри OpenCV? - PullRequest
0 голосов
/ 16 октября 2019

Я пытался найти код для метода Sobel () в OpenCV, так как я изучаю C ++, и я хочу понять его практическую реализацию в деталях.

Я использовал код Visual Studio для просмотра репозитория. импортировано из github, но потом я потерялся, и я был бы признателен за советы о том, как найти такую ​​информацию.

Сначала я искал "sobel" и получил в kernel_improc.cpp

GMat Sobel(const GMat& src, int ddepth, int dx, int dy, int ksize,
           double scale, double delta,
           int borderType, const Scalar& bordVal)
{
    return imgproc::GSobel::on(src, ddepth, dx, dy, ksize, scale, delta, borderType, bordVal);
} 

Я полагаю, что Собель возвращает объект типа GMAT, который вычисляется с использованием GSobel, но я не могу найти, где он находится.

Можете ли вы объяснить мне, где я найду, где находятся операции свертки и какони вызываются в разных объектах?

Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2019

Давайте исправим версию OpenCV, чтобы поговорить о ней, иначе вам будет очень сложно синхронизироваться со мной. Давайте использовать самую последнюю версию: OpenCV 4.1.2.tar.gz. Вы можете легко найти и загрузить его.

Прежде всего, C ++ является сложным языком и может преобразовываться из слоев кодов в другие коды.

Почему OpenCV решает сделать это в этомсложный способ слоев? Потому что он должен обрабатывать различное оборудование! Если компьютер поставляется с оборудованием CV, он может вызывать API, предоставленный аппаратным обеспечением, для ускорения вычислений.

Теперь функция, которую вы просматриваете, например, imgproc::GSobel::on(), определена в:

   modules/gapi/include/opencv2/gapi/gkernel.hpp

следующим образом:

template<typename K, typename R, typename... Args>                                 
class GKernelType<K, std::function<R(Args...)> >                                   
    : public detail::MetaHelper<K, std::tuple<Args...>, R>                         
    , public detail::NoTag                                                         
{                                                                                  
public:                                                                            
    using InArgs  = std::tuple<Args...>;                                           
    using OutArgs = std::tuple<R>;                                                 

    static R on(Args... args)                                                      
    {                                                                              
        cv::GCall call(GKernel{K::id(), K::tag(), &K::getOutMeta, {detail::GTypeTraits<R>::shape}});
        call.pass(args...);                                                        
        return detail::Yield<R>::yield(call, 0);                                   
    }                                                                              
};      

Смотрите, много слоев преобразования кода: static R on(), где R - это общий класс и определяет множество ядер. В вашем случае, R == imgproc::GSobel

В целом, как я уже сказал, C ++ сложен. Поэтому, пожалуйста, наберитесь терпения и постарайтесь найти все символы GSobel и sobel / Sobel, осторожно разверните все макросы .... Если вы хотите попробовать трудный путь, я могу привести вас только сюда.

AnСамый простой способ - скомпилировать библиотеку в режиме отладки и использовать отладчик для трассировки в код OpenCV. Вам потребуется приличный отладчик для разбора сложного синтаксиса C ++, а также макросы препроцессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...