пространства имен opencv и функции c, c

#c #opencv #namespaces

#c #opencv #пространства имен

Вопрос:

Это тестовая программа с 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 и создаю

 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 ?выделить=medianblur#медианблур

Я работаю на версии 3.1.0 opencv и Ubuntu 16.04

Ответ №1:

Это из-за поиска, зависящего от аргумента (ADL).

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

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

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