c++ - opencv 命名空间和 c、c++ 函数

标签 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);

}

我用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 因为 srcdst 来自该命名空间(Mat 在命名空间 cv 中)。

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

这仅适用于函数(因为您可以将参数传递给它们),这就是 Mat dst; 不起作用的原因。当然,如果您没有 include ,这也不会起作用。

关于c++ - opencv 命名空间和 c、c++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40148254/

相关文章:

PHP动态确定完全限定的类名

c++ - 绝对致命的 wxWidgets 痛苦

opencv - openpose 编译告诉 undefined reference cv::VideoCapture::VideoCapture(cv::String const&)

c++ - 三角和对称矩阵的特征填充存储和优化操作

php - 使用php进行人脸识别

c++ - 在 OpenCV 中,将 2d 图像点转换为 3d 世界单位 vector

java - 如何轻松地将 XML 命名空间转换为 Java 包名称?

namespaces - Puppet:stdlib 已安装但在命名空间中不可用?

c++ - 处理设定间隔的算法

C++ 矩阵类重载运算符通过引用返回