2016-10-20 100 views
3

這是一個使用opencv的測試程序。它不應該做任何事情。opencv命名空間和c,C++函數

#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

回答

2

這是因爲Argument-Dependent lookup (ADL)

基本上,因爲你給src/dstimshow/medianBlur編譯器會檢查出namespace cv因爲srcdst來自該命名空間(Mat是在命名空間cv)。

它檢查namespace cv,找到一個名稱相同的函數,檢查它的簽名是否與調用(傳遞給它的參數)相匹配,然後調用它。

這隻適用於函數(因爲你可以傳遞參數給他們),這就是爲什麼Mat dst;不起作用。當然,如果你沒有包含內容,這也是行不通的。