首页 文章

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

  • 2

    这是因为Argument-Dependent lookup (ADL) .

    基本上,因为您将 src / dst 赋予 imshow / medianBlur ,编译器会检出 namespace cv ,因为 srcdst 来自该命名空间( Mat 位于命名空间 cv 中) .

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

    这只适用于函数(因为你可以将参数传递给它们),这就是为什么 Mat dst; 如果你没有包含在那里的话,那就不行了 .

相关问题