#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, конечно.