这是一个带有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
最佳答案
那是因为 Argument-Dependent lookup (ADL) .
基本上,因为您将 src/dst
提供给 imshow/medianBlur
,编译器会 check out namespace cv
因为 src
和 dst
来自该命名空间(Mat
在命名空间 cv
中)。
它检查 namespace cv
,找到一个具有相同名称的函数,检查它的签名是否与调用(传递给它的参数)匹配,然后调用它。
这仅适用于函数(因为您可以将参数传递给它们),这就是 Mat dst;
不起作用的原因。当然,如果您没有 include ,这也不会起作用。
关于c++ - opencv 命名空间和 c、c++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40148254/