2016-10-20 2 views
3

Это тестовая программа с opencv. Он не должен ничего делать.opensv namespaces и 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, что даже не имеет кесарево эквивалентную функцию http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

Я бегу на 3.1.0 OpenCV версии и убунту 16,04

ответ

2

Это из-за Argument-Dependent lookup (ADL).

В основном, потому что вы даете src/dst к imshow/medianBlur компилятор проверяет namespace cv потому src и dst приходят из этого пространства имен (Mat находится в пространстве имен cv).

Он проверяет namespace cv, находит функцию с тем же именем, проверяет, соответствует ли она сигнатуре (переданным параметрам) и вызывает ее.

Это работает только для функций (потому что вы можете передать им аргументы), поэтому Mat dst; не работает. Это также не сработает, если вы, конечно, не включили туда.

Смежные вопросы