这是一个使用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
上运行答案 0 :(得分:5)
这是因为Argument-Dependent lookup (ADL)。
基本上,因为您将src / dst
提供给imshow / medianBlur
,编译器会检出namespace cv
,因为src
和dst
来自该命名空间(Mat
在名称空间cv
)。
它检查namespace cv
,找到一个具有相同名称的函数,检查它的签名是否与调用匹配(传递给它的参数),然后调用它。
这仅适用于函数(因为您可以将参数传递给它们),这就是Mat dst;
无法工作的原因。当然,如果你没有包含在那里,这也是行不通的。