由于我正在学习C ++,因此我试图在OpenCV中找到Sobel()方法的代码,我想详细了解它的实际实现。
我使用Visual Studio Code浏览了我从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);
}
我想Sobel返回一个GMAT类型的对象,该对象是使用GSobel计算的,但是我找不到它在哪里。
您能告诉我在哪里可以找到卷积运算以及如何在不同对象中调用它们吗?
非常感谢!
答案 0 :(得分:0)
让我们修复一个要讨论的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的所有符号,并仔细展开所有宏。...如果您想尝试困难的方法,我只能在这里给您介绍。
一种简单的方法是在调试模式下编译库,然后使用调试器跟踪OpenCV代码。您将需要一个不错的调试器来解析C ++复杂语法以及预处理器宏。