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

时间:2016-10-20 07:38:36

标签: 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);

}

我用cmake编译并制作

cmake_minimum_required(VERSION 2.8)
project( opencvtest )
find_package( OpenCV REQUIRED )
add_executable( opencvtest main.cpp )
target_link_libraries( opencvtest ${OpenCV_LIBS} )

Cmake正确运行。从代码中可以看出,程序在没有Mat dst声明的情况下符合要求。现在,cvNamedWindow是一个C函数,因此它不需要命名空间。另一方面,imshow是一个C ++函数,因此它需要一个名称空间声明。 http://docs.opencv.org/2.4/modules/highgui/doc/user_interface.html#imshow 那么为什么没有名称空间声明的imshow会传递编译。与medianBlur相同的是,它甚至没有c等效函数 http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

我在3.1.0 opencv版本和ubuntu 16.04

上运行

1 个答案:

答案 0 :(得分:5)

这是因为Argument-Dependent lookup (ADL)

基本上,因为您将src / dst提供给imshow / medianBlur,编译器会检出namespace cv,因为srcdst来自该命名空间(Mat在名称空间cv)。

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

这仅适用于函数(因为您可以将参数传递给它们),这就是Mat dst;无法工作的原因。当然,如果你没有包含在那里,这也是行不通的。