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上运行
这是因为依赖于参数的查询(ADL)。
基本上,因为你给src / dst
到imshow / medianBlur
编译器检查出来namespace cv
,因为src
和dst
来自该命名空间(Mat
在命名空间cv
)。
它检查namespace cv
,找到具有相同名称的函数,检查其签名是否与调用(传递给它的参数)匹配,然后调用它。
这仅适用于函数(因为您可以将参数传递给它们),这就是为什么Mat dst;
不起作用的原因。当然,如果其中没有包含内容,这也将行不通。
归档时间: |
|
查看次数: |
652 次 |
最近记录: |