2016-10-20 4 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 네임 스페이스 선언없이 컴파일이 이루어집니다. 동일조차 때문에 Argument-Dependent lookup (ADL)의의 제왕 해당 기능 http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

나는 3.1.0 OpenCV의 버전을 실행하고 우분투 16.04

답변

2

을 가지고 있지 않는 medianBlur로 간다. 기본적으로

, 컴파일러가 namespace cv을 체크 아웃 src/dstimshow/medianBlur에 제공하기 때문에 src 그 네임 스페이스에서 오는 dst (Mat 네임 스페이스 cv에) 때문이다.

namespace cv을 확인하고 동일한 이름의 함수를 찾고 해당 서명이 호출 (전달 된 매개 변수)과 일치하는지 확인한 후 호출합니다.

이것은 (함수에 인수를 전달할 수 있기 때문에) 함수에서만 작동합니다. 따라서 Mat dst;이 작동하지 않습니다. 물론 거기에 포함시키지 않았다면 이것은 작동하지 않을 것입니다.