OpenCV 命名空间和 C、C++ 函数

3

这是一个使用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和make进行编译

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个回答

5

这是由于参数依赖查找(ADL)

基本上,因为你给imshow / medianBlur传递了src / dst,编译器会检查namespace cv,因为srcdst来自该命名空间(Mat在命名空间cv中)。

它检查namespace cv,找到一个同名函数,检查其签名是否与调用匹配(传递给它的参数),并调用它。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接