Давайте исправим версию 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 ++, а также макросы препроцессора.