opencv名称空间和c,c ++函数

k_k*_*kaz 3 c++ opencv namespaces

这是带有opencv的测试程序。它不应该做任何事情。

#include <opencv2/opencv.hpp>

int main (){
    cv::Mat src;
    Mat dst; // <---- compile error (Mat not declared, suggested alternatives cv::)

    cvNamedWindow("A", CV_WINDOW_AUTOSIZE);
    cv::namedWindow("B", CV_WINDOW_AUTOSIZE);

    medianBlur(src,dst,3);

    imshow("A",src);
    cv::imshow("B", src);

}
Run Code Online (Sandbox Code Playgroud)

我用cmake编译并制作

cmake_minimum_required(VERSION 2.8)
project( opencvtest )
find_package( OpenCV REQUIRED )
add_executable( opencvtest main.cpp )
target_link_libraries( opencvtest ${OpenCV_LIBS} )
Run Code Online (Sandbox Code Playgroud)

Cmake可以正确运行。从代码中可以看到,该程序无需Mat dst声明即可正常运行。现在,它cvNamedWindow是一个C函数,因此不需要名称空间。imshow另一方面是C ++函数,因此它确实需要名称空间声明。http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html#imshow 那么为什么imshow没有命名空间声明会通过编译。同样的原因medianBlur甚至没有交流等效功能 http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

我在3.1.0 opencv版本和ubuntu 16.04上运行

Som*_*ken 5

这是因为依赖参数的查询(ADL)

基本上,因为你给src / dstimshow / medianBlur编译器检查出来namespace cv,因为srcdst来自该命名空间(Mat在命名空间cv)。

它检查namespace cv,找到具有相同名称的函数,检查其签名是否与调用(传递给它的参数)匹配,然后调用它。

这仅适用于函数(因为您可以将参数传递给它们),这就是为什么Mat dst;不起作用的原因。当然,如果其中没有包含内容,这也将行不通。