2016-10-20 23 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)のだ3.1.0 OpenCVのバージョンとUbuntu 16.04

答えて

2

上で実行していますCと同等の機能 http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=medianblur#medianblur

を持っていないmedianBlurとなります。基本的には

、あなたはコンパイラがnamespace cvをチェックアウトしsrc/dstimshow/medianBlurに与えるためsrcとその名前空間から来るdstMatが名前空間cvである)ので。

namespace cvをチェックし、同じ名前の関数を見つけ、そのシグネチャが呼び出し(渡されたパラメータ)と一致することを確認して呼び出します。

これは(引数を渡すことができるため)関数の場合にのみ機能します。そのため、Mat dst;は機能しません。もちろん、あなたがそこにインクルードを持っていなければ、これはうまくいかないでしょう。