Opencv命名空间和c、c++函数

opencv namespaces and c,c++ functions

本文关键字:c++ 函数 命名空间 Opencv      更新时间:2023-10-16

这是一个使用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

这是因为参数依赖查找(ADL)。

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

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

这只适用于函数(因为你可以传递参数给它们),这就是为什么Mat dst;不起作用。当然,如果没有include,这也是行不通的